diff options
author | Jeff Layton <jlayton@kernel.org> | 2019-05-09 07:58:38 -0400 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2019-06-27 18:27:36 +0200 |
commit | d6b8bd679c9c8856fa04b80490765c43a4cb613b (patch) | |
tree | f711353bce589ffce51abf46fae9e1213b92fe82 | |
parent | 4b972a01a7da614b4796475f933094751a295a2f (diff) | |
download | lwn-d6b8bd679c9c8856fa04b80490765c43a4cb613b.tar.gz lwn-d6b8bd679c9c8856fa04b80490765c43a4cb613b.zip |
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: 964fff7491e4 ("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>
-rw-r--r-- | fs/ceph/mds_client.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index 6af2d0d4a87a..c8a9b89b922d 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c @@ -2121,9 +2121,10 @@ retry: if (inode && ceph_snap(inode) == CEPH_SNAPDIR) { dout("build_path path+%d: %p SNAPDIR\n", pos, temp); - } else if (stop_on_nosnap && inode && + } else if (stop_on_nosnap && inode && dentry != temp && ceph_snap(inode) == CEPH_NOSNAP) { spin_unlock(&temp->d_lock); + pos++; /* get rid of any prepended '/' */ break; } else { pos -= temp->d_name.len; |