mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
libceph: move message allocation out of ceph_osdc_alloc_request()
The size of ->r_request and ->r_reply messages depends on the size of the object name (ceph_object_id), while the size of ceph_osd_request is fixed. Move message allocation into a separate function that would have to be called after ceph_object_id and ceph_object_locator (which is also going to become variable in size with RADOS namespaces) have been filled in: req = ceph_osdc_alloc_request(...); <fill in req->r_base_oid> <fill in req->r_base_oloc> ceph_osdc_alloc_messages(req); Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
parent
841272825b
commit
13d1ad16d0
5 changed files with 82 additions and 40 deletions
|
@ -369,8 +369,6 @@ struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc,
|
|||
gfp_t gfp_flags)
|
||||
{
|
||||
struct ceph_osd_request *req;
|
||||
struct ceph_msg *msg;
|
||||
size_t msg_size;
|
||||
|
||||
if (use_mempool) {
|
||||
BUG_ON(num_ops > CEPH_OSD_SLAB_OPS);
|
||||
|
@ -407,53 +405,59 @@ struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc,
|
|||
req->r_base_oloc.pool = -1;
|
||||
req->r_target_oloc.pool = -1;
|
||||
|
||||
msg_size = OSD_OPREPLY_FRONT_LEN;
|
||||
if (num_ops > CEPH_OSD_SLAB_OPS) {
|
||||
/* ceph_osd_op and rval */
|
||||
msg_size += (num_ops - CEPH_OSD_SLAB_OPS) *
|
||||
(sizeof(struct ceph_osd_op) + 4);
|
||||
}
|
||||
dout("%s req %p\n", __func__, req);
|
||||
return req;
|
||||
}
|
||||
EXPORT_SYMBOL(ceph_osdc_alloc_request);
|
||||
|
||||
/* create reply message */
|
||||
if (use_mempool)
|
||||
msg = ceph_msgpool_get(&osdc->msgpool_op_reply, 0);
|
||||
else
|
||||
msg = ceph_msg_new(CEPH_MSG_OSD_OPREPLY, msg_size,
|
||||
gfp_flags, true);
|
||||
if (!msg) {
|
||||
ceph_osdc_put_request(req);
|
||||
return NULL;
|
||||
}
|
||||
req->r_reply = msg;
|
||||
int ceph_osdc_alloc_messages(struct ceph_osd_request *req, gfp_t gfp)
|
||||
{
|
||||
struct ceph_osd_client *osdc = req->r_osdc;
|
||||
struct ceph_msg *msg;
|
||||
int msg_size;
|
||||
|
||||
/* create request message */
|
||||
msg_size = 4 + 4 + 4; /* client_inc, osdmap_epoch, flags */
|
||||
msg_size += 4 + 4 + 4 + 8; /* mtime, reassert_version */
|
||||
msg_size += 2 + 4 + 8 + 4 + 4; /* oloc */
|
||||
msg_size += 1 + 8 + 4 + 4; /* pgid */
|
||||
msg_size += 4 + CEPH_MAX_OID_NAME_LEN; /* oid */
|
||||
msg_size += 2 + num_ops * sizeof(struct ceph_osd_op);
|
||||
msg_size += 4 + req->r_base_oid.name_len; /* oid */
|
||||
msg_size += 2 + req->r_num_ops * sizeof(struct ceph_osd_op);
|
||||
msg_size += 8; /* snapid */
|
||||
msg_size += 8; /* snap_seq */
|
||||
msg_size += 4 + 8 * (snapc ? snapc->num_snaps : 0); /* snaps */
|
||||
msg_size += 4 + 8 * (req->r_snapc ? req->r_snapc->num_snaps : 0);
|
||||
msg_size += 4; /* retry_attempt */
|
||||
|
||||
/* create request message; allow space for oid */
|
||||
if (use_mempool)
|
||||
if (req->r_mempool)
|
||||
msg = ceph_msgpool_get(&osdc->msgpool_op, 0);
|
||||
else
|
||||
msg = ceph_msg_new(CEPH_MSG_OSD_OP, msg_size, gfp_flags, true);
|
||||
if (!msg) {
|
||||
ceph_osdc_put_request(req);
|
||||
return NULL;
|
||||
}
|
||||
msg = ceph_msg_new(CEPH_MSG_OSD_OP, msg_size, gfp, true);
|
||||
if (!msg)
|
||||
return -ENOMEM;
|
||||
|
||||
memset(msg->front.iov_base, 0, msg->front.iov_len);
|
||||
|
||||
req->r_request = msg;
|
||||
|
||||
return req;
|
||||
/* create reply message */
|
||||
msg_size = OSD_OPREPLY_FRONT_LEN;
|
||||
if (req->r_num_ops > CEPH_OSD_SLAB_OPS) {
|
||||
/* ceph_osd_op and rval */
|
||||
msg_size += (req->r_num_ops - CEPH_OSD_SLAB_OPS) *
|
||||
(sizeof(struct ceph_osd_op) + 4);
|
||||
}
|
||||
|
||||
if (req->r_mempool)
|
||||
msg = ceph_msgpool_get(&osdc->msgpool_op_reply, 0);
|
||||
else
|
||||
msg = ceph_msg_new(CEPH_MSG_OSD_OPREPLY, msg_size, gfp, true);
|
||||
if (!msg)
|
||||
return -ENOMEM;
|
||||
|
||||
req->r_reply = msg;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(ceph_osdc_alloc_request);
|
||||
EXPORT_SYMBOL(ceph_osdc_alloc_messages);
|
||||
|
||||
static bool osd_req_opcode_valid(u16 opcode)
|
||||
{
|
||||
|
@ -828,17 +832,17 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
|
|||
|
||||
req = ceph_osdc_alloc_request(osdc, snapc, num_ops, use_mempool,
|
||||
GFP_NOFS);
|
||||
if (!req)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
if (!req) {
|
||||
r = -ENOMEM;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
req->r_flags = flags;
|
||||
|
||||
/* calculate max write size */
|
||||
r = calc_layout(layout, off, plen, &objnum, &objoff, &objlen);
|
||||
if (r < 0) {
|
||||
ceph_osdc_put_request(req);
|
||||
return ERR_PTR(r);
|
||||
}
|
||||
if (r)
|
||||
goto fail;
|
||||
|
||||
if (opcode == CEPH_OSD_OP_CREATE || opcode == CEPH_OSD_OP_DELETE) {
|
||||
osd_req_op_init(req, which, opcode, 0);
|
||||
|
@ -864,7 +868,15 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
|
|||
"%llx.%08llx", vino.ino, objnum);
|
||||
req->r_base_oid.name_len = strlen(req->r_base_oid.name);
|
||||
|
||||
r = ceph_osdc_alloc_messages(req, GFP_NOFS);
|
||||
if (r)
|
||||
goto fail;
|
||||
|
||||
return req;
|
||||
|
||||
fail:
|
||||
ceph_osdc_put_request(req);
|
||||
return ERR_PTR(r);
|
||||
}
|
||||
EXPORT_SYMBOL(ceph_osdc_new_request);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue