summaryrefslogtreecommitdiffstats
path: root/fs/overlayfs
diff options
context:
space:
mode:
authorMiklos Szeredi <mszeredi@redhat.com>2020-03-17 15:04:22 +0100
committerMiklos Szeredi <mszeredi@redhat.com>2020-03-17 15:04:22 +0100
commit7925dad839e70ab43140e26d6b93e807b5969f05 (patch)
tree955cf36845ff943fad364846b4b964c9e6a19839 /fs/overlayfs
parent3bb7df928a7dca0ab5ae143ecffbd8859850cd08 (diff)
downloadlinux-7925dad839e70ab43140e26d6b93e807b5969f05.tar.bz2
ovl: separate detection of remote upper layer from stacked overlay
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>
Diffstat (limited to 'fs/overlayfs')
-rw-r--r--fs/overlayfs/namei.c3
-rw-r--r--fs/overlayfs/super.c14
-rw-r--r--fs/overlayfs/util.c3
3 files changed, 10 insertions, 10 deletions
diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c
index ed9e129fae04..a5b998a93a24 100644
--- a/fs/overlayfs/namei.c
+++ b/fs/overlayfs/namei.c
@@ -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;
diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
index a05bf1179ce0..bc35cd6233ee 100644
--- a/fs/overlayfs/super.c
+++ b/fs/overlayfs/super.c
@@ -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;
diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c
index f318e4811e32..997c31509c91 100644
--- a/fs/overlayfs/util.c
+++ b/fs/overlayfs/util.c
@@ -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)