ovl: separate detection of remote upper layer from stacked overlay
authorMiklos Szeredi <mszeredi@redhat.com>
Tue, 17 Mar 2020 14:04:22 +0000 (15:04 +0100)
committerMiklos Szeredi <mszeredi@redhat.com>
Tue, 17 Mar 2020 14:04:22 +0000 (15:04 +0100)
Following patch will allow remote as upper layer, but not overlay stacked
on upper layer.  Separate the two concepts.

This patch is doesn't change behavior.

Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
fs/overlayfs/namei.c
fs/overlayfs/super.c
fs/overlayfs/util.c

index ed9e129..a5b998a 100644 (file)
@@ -845,7 +845,8 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
                if (err)
                        goto out;
 
-               if (upperdentry && unlikely(ovl_dentry_remote(upperdentry))) {
+               if (upperdentry && (upperdentry->d_flags & DCACHE_OP_REAL ||
+                                   unlikely(ovl_dentry_remote(upperdentry)))) {
                        dput(upperdentry);
                        err = -EREMOTE;
                        goto out;
index a05bf11..bc35cd6 100644 (file)
@@ -752,13 +752,13 @@ static int ovl_mount_dir(const char *name, struct path *path)
                ovl_unescape(tmp);
                err = ovl_mount_dir_noesc(tmp, path);
 
-               if (!err)
-                       if (ovl_dentry_remote(path->dentry)) {
-                               pr_err("filesystem on '%s' not supported as upperdir\n",
-                                      tmp);
-                               path_put_init(path);
-                               err = -EINVAL;
-                       }
+               if (!err && (ovl_dentry_remote(path->dentry) ||
+                            path->dentry->d_flags & DCACHE_OP_REAL)) {
+                       pr_err("filesystem on '%s' not supported as upperdir\n",
+                              tmp);
+                       path_put_init(path);
+                       err = -EINVAL;
+               }
                kfree(tmp);
        }
        return err;
index f318e48..997c315 100644 (file)
@@ -93,8 +93,7 @@ struct ovl_entry *ovl_alloc_entry(unsigned int numlower)
 bool ovl_dentry_remote(struct dentry *dentry)
 {
        return dentry->d_flags &
-               (DCACHE_OP_REVALIDATE | DCACHE_OP_WEAK_REVALIDATE |
-                DCACHE_OP_REAL);
+               (DCACHE_OP_REVALIDATE | DCACHE_OP_WEAK_REVALIDATE);
 }
 
 bool ovl_dentry_weird(struct dentry *dentry)