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: Jeff Layton <jlayton@kernel.org> Reviewed-by: Xiubo Li <xiubli@redhat.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
parent
083db6fd3e
commit
9eaa7b7997
@ -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,
|
|||||||
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,
|
|||||||
/* 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 {
|
|||||||
|
|
||||||
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 {
|
|||||||
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 {
|
|||||||
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);
|
|||||||
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user