ovl: fix encoding fid for lower only root
authorMiklos Szeredi <mszeredi@redhat.com>
Fri, 14 Jun 2024 07:55:58 +0000 (09:55 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 27 Jun 2024 11:49:12 +0000 (13:49 +0200)
commit 004b8d1491b4bcbb7da1a3206d1e7e66822d47c6 upstream.

ovl_check_encode_origin() should return a positive number if the lower
dentry is to be encoded, zero otherwise.  If there's no upper layer at all
(read-only overlay), then it obviously needs to return positive.

This was broken by commit 16aac5ad1fa9 ("ovl: support encoding
non-decodable file handles"), which didn't take the lower-only
configuration into account.

Fix by checking the no-upper-layer case up-front.

Reported-and-tested-by: Youzhong Yang <youzhong@gmail.com>
Closes: https://lore.kernel.org/all/CADpNCvaBimi+zCYfRJHvCOhMih8OU0rmZkwLuh24MKKroRuT8Q@mail.gmail.com/
Fixes: 16aac5ad1fa9 ("ovl: support encoding non-decodable file handles")
Cc: <stable@vger.kernel.org> # v6.6
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/overlayfs/export.c

index 26b782c53910b538cb26d770fdb6b9416d0f19dd..611ff567a1aa6f46adecf5a17a18c8825548d291 100644 (file)
@@ -186,6 +186,10 @@ static int ovl_check_encode_origin(struct dentry *dentry)
        struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
        bool decodable = ofs->config.nfs_export;
 
+       /* No upper layer? */
+       if (!ovl_upper_mnt(ofs))
+               return 1;
+
        /* Lower file handle for non-upper non-decodable */
        if (!ovl_dentry_upper(dentry) && !decodable)
                return 1;
@@ -214,7 +218,7 @@ static int ovl_check_encode_origin(struct dentry *dentry)
         * ovl_connect_layer() will try to make origin's layer "connected" by
         * copying up a "connectable" ancestor.
         */
-       if (d_is_dir(dentry) && ovl_upper_mnt(ofs) && decodable)
+       if (d_is_dir(dentry) && decodable)
                return ovl_connect_layer(dentry);
 
        /* Lower file handle for indexed and non-upper dir/non-dir */