ceph: fix ceph_mdsc_build_path to not stop on first component
authorJeff Layton <jlayton@kernel.org>
Thu, 9 May 2019 11:58:38 +0000 (07:58 -0400)
committerIlya Dryomov <idryomov@gmail.com>
Thu, 27 Jun 2019 16:27:36 +0000 (18:27 +0200)
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>
fs/ceph/mds_client.c

index 6af2d0d4a87a5f919922d532f04a296647c2fa64..c8a9b89b922d71d3ca137119dcddfbf0842e0169 100644 (file)
@@ -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;