ceph: fix ceph_mdsc_build_path to not stop on first component
When ceph_mdsc_build_path is handed a positive dentry, it will return a
zero-length path string with the base set to that dentry. This is not
what we want. Always include at least one path component in the string.
ceph_mdsc_build_path has behaved this way for a long time but it didn't
matter until recent d_name handling rework.
Fixes: 964fff7491
("ceph: use ceph_mdsc_build_path instead of clone_dentry_name")
Signed-off-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: "Yan, Zheng" <zyan@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
parent
4b972a01a7
commit
d6b8bd679c
|
@ -2121,9 +2121,10 @@ retry:
|
||||||
if (inode && ceph_snap(inode) == CEPH_SNAPDIR) {
|
if (inode && ceph_snap(inode) == CEPH_SNAPDIR) {
|
||||||
dout("build_path path+%d: %p SNAPDIR\n",
|
dout("build_path path+%d: %p SNAPDIR\n",
|
||||||
pos, temp);
|
pos, temp);
|
||||||
} else if (stop_on_nosnap && inode &&
|
} else if (stop_on_nosnap && inode && dentry != temp &&
|
||||||
ceph_snap(inode) == CEPH_NOSNAP) {
|
ceph_snap(inode) == CEPH_NOSNAP) {
|
||||||
spin_unlock(&temp->d_lock);
|
spin_unlock(&temp->d_lock);
|
||||||
|
pos++; /* get rid of any prepended '/' */
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
pos -= temp->d_name.len;
|
pos -= temp->d_name.len;
|
||||||
|
|
Loading…
Reference in New Issue