diff --git a/fs/overlayfs/export.c b/fs/overlayfs/export.c index 0bca38c79244..7a4b6a0fd527 100644 --- a/fs/overlayfs/export.c +++ b/fs/overlayfs/export.c @@ -461,6 +461,19 @@ static struct dentry *ovl_lower_fh_to_d(struct super_block *sb, } } + /* Then try to get upper dir by index */ + if (index && d_is_dir(index)) { + struct dentry *upper = ovl_index_upper(ofs, index); + + err = PTR_ERR(upper); + if (IS_ERR_OR_NULL(upper)) + goto out_err; + + dentry = ovl_get_dentry(sb, upper, NULL, NULL); + dput(upper); + goto out; + } + /* Then lookup origin by fh */ err = ovl_check_origin_fh(ofs, fh, NULL, &stack); if (err) { diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c index 741a42d974a3..6199bf7a77c7 100644 --- a/fs/overlayfs/namei.c +++ b/fs/overlayfs/namei.c @@ -439,7 +439,7 @@ fail: } /* Get upper dentry from index */ -static struct dentry *ovl_index_upper(struct ovl_fs *ofs, struct dentry *index) +struct dentry *ovl_index_upper(struct ovl_fs *ofs, struct dentry *index) { struct ovl_fh *fh; struct dentry *upper; diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h index a47f9142b6be..a5d415aec131 100644 --- a/fs/overlayfs/overlayfs.h +++ b/fs/overlayfs/overlayfs.h @@ -270,6 +270,7 @@ int ovl_check_origin_fh(struct ovl_fs *ofs, struct ovl_fh *fh, struct dentry *upperdentry, struct ovl_path **stackp); int ovl_verify_set_fh(struct dentry *dentry, const char *name, struct dentry *real, bool is_upper, bool set); +struct dentry *ovl_index_upper(struct ovl_fs *ofs, struct dentry *index); int ovl_verify_index(struct ovl_fs *ofs, struct dentry *index); int ovl_get_index_name(struct dentry *origin, struct qstr *name); struct dentry *ovl_get_index_fh(struct ovl_fs *ofs, struct ovl_fh *fh);