diff options
Diffstat (limited to 'fs/overlayfs')
-rw-r--r-- | fs/overlayfs/inode.c | 7 | ||||
-rw-r--r-- | fs/overlayfs/namei.c | 9 |
2 files changed, 11 insertions, 5 deletions
diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c index 94d2f8a8b779..0dbbfedef54c 100644 --- a/fs/overlayfs/inode.c +++ b/fs/overlayfs/inode.c @@ -110,13 +110,10 @@ int ovl_getattr(const struct path *path, struct kstat *stat, * that the upper hardlink is not broken. */ if (is_dir || lowerstat.nlink == 1 || - ovl_test_flag(OVL_INDEX, d_inode(dentry))) + ovl_test_flag(OVL_INDEX, d_inode(dentry))) { stat->ino = lowerstat.ino; - - if (samefs) - WARN_ON_ONCE(stat->dev != lowerstat.dev); - else stat->dev = ovl_get_pseudo_dev(dentry); + } } if (samefs) { /* diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c index ef3e7ea76296..dc917119d8a9 100644 --- a/fs/overlayfs/namei.c +++ b/fs/overlayfs/namei.c @@ -55,6 +55,15 @@ static int ovl_check_redirect(struct dentry *dentry, struct ovl_lookup_data *d, if (s == next) goto invalid; } + /* + * One of the ancestor path elements in an absolute path + * lookup in ovl_lookup_layer() could have been opaque and + * that will stop further lookup in lower layers (d->stop=true) + * But we have found an absolute redirect in decendant path + * element and that should force continue lookup in lower + * layers (reset d->stop). + */ + d->stop = false; } else { if (strchr(buf, '/') != NULL) goto invalid; |