ceph: eliminate req->r_wait_for_completion from ceph_mds_request
authorJeff Layton <jlayton@kernel.org>
Thu, 3 Feb 2022 14:04:24 +0000 (09:04 -0500)
committerIlya Dryomov <idryomov@gmail.com>
Tue, 1 Mar 2022 17:26:36 +0000 (18:26 +0100)
...and instead just pass the wait function on the stack.

Make ceph_mdsc_wait_request non-static, and add an argument for wait for
completion. Then have ceph_lock_message call ceph_mdsc_submit_request,
and ceph_mdsc_wait_request and pass in the pointer to
ceph_lock_wait_for_completion.

While we're in there, rearrange some fields in ceph_mds_request, so we
save a total of 24 bytes per.

Signed-off-by: Jeff Layton <jlayton@kernel.org>
Reviewed-by: Xiubo Li <xiubli@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/locks.c
fs/ceph/mds_client.c
fs/ceph/mds_client.h

index d1f154aec249bf3d38fb8d10dd66c311065fdb68..3e2843e86e2744486075519dfd87f9d39edc9ced 100644 (file)
@@ -111,10 +111,10 @@ static int ceph_lock_message(u8 lock_type, u16 operation, struct inode *inode,
        req->r_args.filelock_change.length = cpu_to_le64(length);
        req->r_args.filelock_change.wait = wait;
 
-       if (wait)
-               req->r_wait_for_completion = ceph_lock_wait_for_completion;
-
-       err = ceph_mdsc_do_request(mdsc, inode, req);
+       err = ceph_mdsc_submit_request(mdsc, inode, req);
+       if (!err)
+               err = ceph_mdsc_wait_request(mdsc, req, wait ?
+                                       ceph_lock_wait_for_completion : NULL);
        if (!err && operation == CEPH_MDS_OP_GETFILELOCK) {
                fl->fl_pid = -le64_to_cpu(req->r_reply_info.filelock_reply->pid);
                if (CEPH_LOCK_SHARED == req->r_reply_info.filelock_reply->type)
index c30eefc0ac19346e086128e3872a8d1848ea1dc2..f26ed1d76be200bf7cf8fcbc4b7d9309dda97ad3 100644 (file)
@@ -2946,15 +2946,16 @@ int ceph_mdsc_submit_request(struct ceph_mds_client *mdsc, struct inode *dir,
        return err;
 }
 
-static int ceph_mdsc_wait_request(struct ceph_mds_client *mdsc,
-                                 struct ceph_mds_request *req)
+int ceph_mdsc_wait_request(struct ceph_mds_client *mdsc,
+                          struct ceph_mds_request *req,
+                          ceph_mds_request_wait_callback_t wait_func)
 {
        int err;
 
        /* wait */
        dout("do_request waiting\n");
-       if (!req->r_timeout && req->r_wait_for_completion) {
-               err = req->r_wait_for_completion(mdsc, req);
+       if (wait_func) {
+               err = wait_func(mdsc, req);
        } else {
                long timeleft = wait_for_completion_killable_timeout(
                                        &req->r_completion,
@@ -3011,7 +3012,7 @@ int ceph_mdsc_do_request(struct ceph_mds_client *mdsc,
        /* issue */
        err = ceph_mdsc_submit_request(mdsc, dir, req);
        if (!err)
-               err = ceph_mdsc_wait_request(mdsc, req);
+               err = ceph_mdsc_wait_request(mdsc, req, NULL);
        dout("do_request %p done, result %d\n", req, err);
        return err;
 }
index 97c7f7bfa55f39ba67ae1f733791148142406241..ab12f3ce81a3e4ea0859d6a1cc234263718db9f0 100644 (file)
@@ -274,8 +274,8 @@ struct ceph_mds_request {
 
        union ceph_mds_request_args r_args;
        int r_fmode;        /* file mode, if expecting cap */
-       const struct cred *r_cred;
        int r_request_release_offset;
+       const struct cred *r_cred;
        struct timespec64 r_stamp;
 
        /* for choosing which mds to send this request to */
@@ -296,12 +296,11 @@ struct ceph_mds_request {
        struct ceph_msg  *r_reply;
        struct ceph_mds_reply_info_parsed r_reply_info;
        int r_err;
-
+       u32               r_readdir_offset;
 
        struct page *r_locked_page;
        int r_dir_caps;
        int r_num_caps;
-       u32               r_readdir_offset;
 
        unsigned long r_timeout;  /* optional.  jiffies, 0 is "wait forever" */
        unsigned long r_started;  /* start time to measure timeout against */
@@ -329,7 +328,6 @@ struct ceph_mds_request {
        struct completion r_completion;
        struct completion r_safe_completion;
        ceph_mds_request_callback_t r_callback;
-       ceph_mds_request_wait_callback_t r_wait_for_completion;
        struct list_head  r_unsafe_item;  /* per-session unsafe list item */
 
        long long         r_dir_release_cnt;
@@ -507,6 +505,9 @@ ceph_mdsc_create_request(struct ceph_mds_client *mdsc, int op, int mode);
 extern int ceph_mdsc_submit_request(struct ceph_mds_client *mdsc,
                                    struct inode *dir,
                                    struct ceph_mds_request *req);
+int ceph_mdsc_wait_request(struct ceph_mds_client *mdsc,
+                       struct ceph_mds_request *req,
+                       ceph_mds_request_wait_callback_t wait_func);
 extern int ceph_mdsc_do_request(struct ceph_mds_client *mdsc,
                                struct inode *dir,
                                struct ceph_mds_request *req);