ceph: send LSSNAP request to auth mds of directory inode
authorYan, Zheng <zyan@redhat.com>
Wed, 26 Jul 2017 04:48:08 +0000 (12:48 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Wed, 6 Sep 2017 17:56:46 +0000 (19:56 +0200)
Snapdir inode has no capability. __choose_mds() should choose mds
base on capabilities of snapdir's parent inode.

Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/dir.c
fs/ceph/mds_client.c

index ef7240a..019c203 100644 (file)
@@ -377,8 +377,10 @@ more:
                }
                /* hints to request -> mds selection code */
                req->r_direct_mode = USE_AUTH_MDS;
-               req->r_direct_hash = ceph_frag_value(frag);
-               __set_bit(CEPH_MDS_R_DIRECT_IS_HASH, &req->r_req_flags);
+               if (op == CEPH_MDS_OP_READDIR) {
+                       req->r_direct_hash = ceph_frag_value(frag);
+                       __set_bit(CEPH_MDS_R_DIRECT_IS_HASH, &req->r_req_flags);
+               }
                if (fi->last_name) {
                        req->r_path2 = kstrdup(fi->last_name, GFP_KERNEL);
                        if (!req->r_path2) {
index 666a9f2..86ff744 100644 (file)
@@ -731,9 +731,16 @@ static int __choose_mds(struct ceph_mds_client *mdsc,
 
        inode = NULL;
        if (req->r_inode) {
-               inode = req->r_inode;
-               ihold(inode);
-       } else if (req->r_dentry) {
+               if (ceph_snap(req->r_inode) != CEPH_SNAPDIR) {
+                       inode = req->r_inode;
+                       ihold(inode);
+               } else {
+                       /* req->r_dentry is non-null for LSSNAP request.
+                        * fall-thru */
+                       WARN_ON_ONCE(!req->r_dentry);
+               }
+       }
+       if (!inode && req->r_dentry) {
                /* ignore race with rename; old or new d_parent is okay */
                struct dentry *parent;
                struct inode *dir;