Commit 9eaa7b79 authored by Jeff Layton's avatar Jeff Layton Committed by Ilya Dryomov

ceph: eliminate req->r_wait_for_completion from ceph_mds_request

...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: default avatarJeff Layton <jlayton@kernel.org>
Reviewed-by: default avatarXiubo Li <xiubli@redhat.com>
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent 083db6fd
...@@ -111,10 +111,10 @@ static int ceph_lock_message(u8 lock_type, u16 operation, struct inode *inode, ...@@ -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.length = cpu_to_le64(length);
req->r_args.filelock_change.wait = wait; req->r_args.filelock_change.wait = wait;
if (wait) err = ceph_mdsc_submit_request(mdsc, inode, req);
req->r_wait_for_completion = ceph_lock_wait_for_completion; if (!err)
err = ceph_mdsc_wait_request(mdsc, req, wait ?
err = ceph_mdsc_do_request(mdsc, inode, req); ceph_lock_wait_for_completion : NULL);
if (!err && operation == CEPH_MDS_OP_GETFILELOCK) { if (!err && operation == CEPH_MDS_OP_GETFILELOCK) {
fl->fl_pid = -le64_to_cpu(req->r_reply_info.filelock_reply->pid); fl->fl_pid = -le64_to_cpu(req->r_reply_info.filelock_reply->pid);
if (CEPH_LOCK_SHARED == req->r_reply_info.filelock_reply->type) if (CEPH_LOCK_SHARED == req->r_reply_info.filelock_reply->type)
......
...@@ -2946,15 +2946,16 @@ int ceph_mdsc_submit_request(struct ceph_mds_client *mdsc, struct inode *dir, ...@@ -2946,15 +2946,16 @@ int ceph_mdsc_submit_request(struct ceph_mds_client *mdsc, struct inode *dir,
return err; return err;
} }
static int ceph_mdsc_wait_request(struct ceph_mds_client *mdsc, int ceph_mdsc_wait_request(struct ceph_mds_client *mdsc,
struct ceph_mds_request *req) struct ceph_mds_request *req,
ceph_mds_request_wait_callback_t wait_func)
{ {
int err; int err;
/* wait */ /* wait */
dout("do_request waiting\n"); dout("do_request waiting\n");
if (!req->r_timeout && req->r_wait_for_completion) { if (wait_func) {
err = req->r_wait_for_completion(mdsc, req); err = wait_func(mdsc, req);
} else { } else {
long timeleft = wait_for_completion_killable_timeout( long timeleft = wait_for_completion_killable_timeout(
&req->r_completion, &req->r_completion,
...@@ -3011,7 +3012,7 @@ int ceph_mdsc_do_request(struct ceph_mds_client *mdsc, ...@@ -3011,7 +3012,7 @@ int ceph_mdsc_do_request(struct ceph_mds_client *mdsc,
/* issue */ /* issue */
err = ceph_mdsc_submit_request(mdsc, dir, req); err = ceph_mdsc_submit_request(mdsc, dir, req);
if (!err) 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); dout("do_request %p done, result %d\n", req, err);
return err; return err;
} }
......
...@@ -274,8 +274,8 @@ struct ceph_mds_request { ...@@ -274,8 +274,8 @@ struct ceph_mds_request {
union ceph_mds_request_args r_args; union ceph_mds_request_args r_args;
int r_fmode; /* file mode, if expecting cap */ int r_fmode; /* file mode, if expecting cap */
const struct cred *r_cred;
int r_request_release_offset; int r_request_release_offset;
const struct cred *r_cred;
struct timespec64 r_stamp; struct timespec64 r_stamp;
/* for choosing which mds to send this request to */ /* for choosing which mds to send this request to */
...@@ -296,12 +296,11 @@ struct ceph_mds_request { ...@@ -296,12 +296,11 @@ struct ceph_mds_request {
struct ceph_msg *r_reply; struct ceph_msg *r_reply;
struct ceph_mds_reply_info_parsed r_reply_info; struct ceph_mds_reply_info_parsed r_reply_info;
int r_err; int r_err;
u32 r_readdir_offset;
struct page *r_locked_page; struct page *r_locked_page;
int r_dir_caps; int r_dir_caps;
int r_num_caps; int r_num_caps;
u32 r_readdir_offset;
unsigned long r_timeout; /* optional. jiffies, 0 is "wait forever" */ unsigned long r_timeout; /* optional. jiffies, 0 is "wait forever" */
unsigned long r_started; /* start time to measure timeout against */ unsigned long r_started; /* start time to measure timeout against */
...@@ -329,7 +328,6 @@ struct ceph_mds_request { ...@@ -329,7 +328,6 @@ struct ceph_mds_request {
struct completion r_completion; struct completion r_completion;
struct completion r_safe_completion; struct completion r_safe_completion;
ceph_mds_request_callback_t r_callback; 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 */ struct list_head r_unsafe_item; /* per-session unsafe list item */
long long r_dir_release_cnt; long long r_dir_release_cnt;
...@@ -507,6 +505,9 @@ ceph_mdsc_create_request(struct ceph_mds_client *mdsc, int op, int mode); ...@@ -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, extern int ceph_mdsc_submit_request(struct ceph_mds_client *mdsc,
struct inode *dir, struct inode *dir,
struct ceph_mds_request *req); 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, extern int ceph_mdsc_do_request(struct ceph_mds_client *mdsc,
struct inode *dir, struct inode *dir,
struct ceph_mds_request *req); struct ceph_mds_request *req);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment