ceph: pass the request to parse_reply_info_readdir()
authorXiubo Li <xiubli@redhat.com>
Mon, 14 Mar 2022 02:28:34 +0000 (10:28 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Thu, 24 Aug 2023 09:24:34 +0000 (11:24 +0200)
Instead of passing just the r_reply_info to the readdir reply parser,
pass the request pointer directly instead. This will facilitate
implementing readdir on fscrypted directories.

Signed-off-by: Xiubo Li <xiubli@redhat.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Reviewed-and-tested-by: Luís Henriques <lhenriques@suse.de>
Reviewed-by: Milind Changire <mchangir@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/mds_client.c

index 34b8c02..8709fc1 100644 (file)
@@ -407,9 +407,10 @@ out_bad:
  * parse readdir results
  */
 static int parse_reply_info_readdir(void **p, void *end,
-                               struct ceph_mds_reply_info_parsed *info,
-                               u64 features)
+                                   struct ceph_mds_request *req,
+                                   u64 features)
 {
+       struct ceph_mds_reply_info_parsed *info = &req->r_reply_info;
        u32 num, i = 0;
        int err;
 
@@ -651,15 +652,16 @@ bad:
  * parse extra results
  */
 static int parse_reply_info_extra(void **p, void *end,
-                                 struct ceph_mds_reply_info_parsed *info,
+                                 struct ceph_mds_request *req,
                                  u64 features, struct ceph_mds_session *s)
 {
+       struct ceph_mds_reply_info_parsed *info = &req->r_reply_info;
        u32 op = le32_to_cpu(info->head->op);
 
        if (op == CEPH_MDS_OP_GETFILELOCK)
                return parse_reply_info_filelock(p, end, info, features);
        else if (op == CEPH_MDS_OP_READDIR || op == CEPH_MDS_OP_LSSNAP)
-               return parse_reply_info_readdir(p, end, info, features);
+               return parse_reply_info_readdir(p, end, req, features);
        else if (op == CEPH_MDS_OP_CREATE)
                return parse_reply_info_create(p, end, info, features, s);
        else if (op == CEPH_MDS_OP_GETVXATTR)
@@ -672,9 +674,9 @@ static int parse_reply_info_extra(void **p, void *end,
  * parse entire mds reply
  */
 static int parse_reply_info(struct ceph_mds_session *s, struct ceph_msg *msg,
-                           struct ceph_mds_reply_info_parsed *info,
-                           u64 features)
+                           struct ceph_mds_request *req, u64 features)
 {
+       struct ceph_mds_reply_info_parsed *info = &req->r_reply_info;
        void *p, *end;
        u32 len;
        int err;
@@ -696,7 +698,7 @@ static int parse_reply_info(struct ceph_mds_session *s, struct ceph_msg *msg,
        ceph_decode_32_safe(&p, end, len, bad);
        if (len > 0) {
                ceph_decode_need(&p, end, len, bad);
-               err = parse_reply_info_extra(&p, p+len, info, features, s);
+               err = parse_reply_info_extra(&p, p+len, req, features, s);
                if (err < 0)
                        goto out_bad;
        }
@@ -3598,14 +3600,15 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg)
        }
 
        dout("handle_reply tid %lld result %d\n", tid, result);
-       rinfo = &req->r_reply_info;
        if (test_bit(CEPHFS_FEATURE_REPLY_ENCODING, &session->s_features))
-               err = parse_reply_info(session, msg, rinfo, (u64)-1);
+               err = parse_reply_info(session, msg, req, (u64)-1);
        else
-               err = parse_reply_info(session, msg, rinfo, session->s_con.peer_features);
+               err = parse_reply_info(session, msg, req,
+                                      session->s_con.peer_features);
        mutex_unlock(&mdsc->mutex);
 
        /* Must find target inode outside of mutexes to avoid deadlocks */
+       rinfo = &req->r_reply_info;
        if ((err >= 0) && rinfo->head->is_target) {
                struct inode *in = xchg(&req->r_new_inode, NULL);
                struct ceph_vino tvino = {