diff options
-rw-r--r-- | include/linux/ceph/osd_client.h | 3 | ||||
-rw-r--r-- | net/ceph/osd_client.c | 29 |
2 files changed, 17 insertions, 15 deletions
diff --git a/include/linux/ceph/osd_client.h b/include/linux/ceph/osd_client.h index 144d57cbef9e..71c41575646d 100644 --- a/include/linux/ceph/osd_client.h +++ b/include/linux/ceph/osd_client.h | |||
@@ -93,8 +93,9 @@ struct ceph_osd_req_op { | |||
93 | const char *class_name; | 93 | const char *class_name; |
94 | const char *method_name; | 94 | const char *method_name; |
95 | const void *request_data; | 95 | const void *request_data; |
96 | u32 request_data_len; | 96 | struct ceph_osd_data *request_info; |
97 | struct ceph_osd_data *response_data; | 97 | struct ceph_osd_data *response_data; |
98 | u32 request_data_len; | ||
98 | __u8 class_len; | 99 | __u8 class_len; |
99 | __u8 method_len; | 100 | __u8 method_len; |
100 | __u8 argc; | 101 | __u8 argc; |
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c index ad24f210bf0c..db2624860384 100644 --- a/net/ceph/osd_client.c +++ b/net/ceph/osd_client.c | |||
@@ -399,28 +399,39 @@ void osd_req_op_cls_init(struct ceph_osd_request *osd_req, unsigned int which, | |||
399 | const void *request_data, size_t request_data_size) | 399 | const void *request_data, size_t request_data_size) |
400 | { | 400 | { |
401 | struct ceph_osd_req_op *op = osd_req_op_init(osd_req, which, opcode); | 401 | struct ceph_osd_req_op *op = osd_req_op_init(osd_req, which, opcode); |
402 | struct ceph_pagelist *pagelist; | ||
402 | size_t payload_len = 0; | 403 | size_t payload_len = 0; |
403 | size_t size; | 404 | size_t size; |
404 | 405 | ||
405 | BUG_ON(opcode != CEPH_OSD_OP_CALL); | 406 | BUG_ON(opcode != CEPH_OSD_OP_CALL); |
406 | 407 | ||
408 | pagelist = kmalloc(sizeof (*pagelist), GFP_NOFS); | ||
409 | BUG_ON(!pagelist); | ||
410 | ceph_pagelist_init(pagelist); | ||
411 | |||
407 | op->cls.class_name = class; | 412 | op->cls.class_name = class; |
408 | size = strlen(class); | 413 | size = strlen(class); |
409 | BUG_ON(size > (size_t) U8_MAX); | 414 | BUG_ON(size > (size_t) U8_MAX); |
410 | op->cls.class_len = size; | 415 | op->cls.class_len = size; |
416 | ceph_pagelist_append(pagelist, class, size); | ||
411 | payload_len += size; | 417 | payload_len += size; |
412 | 418 | ||
413 | op->cls.method_name = method; | 419 | op->cls.method_name = method; |
414 | size = strlen(method); | 420 | size = strlen(method); |
415 | BUG_ON(size > (size_t) U8_MAX); | 421 | BUG_ON(size > (size_t) U8_MAX); |
416 | op->cls.method_len = size; | 422 | op->cls.method_len = size; |
423 | ceph_pagelist_append(pagelist, method, size); | ||
417 | payload_len += size; | 424 | payload_len += size; |
418 | 425 | ||
419 | op->cls.request_data = request_data; | 426 | op->cls.request_data = request_data; |
420 | BUG_ON(request_data_size > (size_t) U32_MAX); | 427 | BUG_ON(request_data_size > (size_t) U32_MAX); |
421 | op->cls.request_data_len = (u32) request_data_size; | 428 | op->cls.request_data_len = (u32) request_data_size; |
429 | ceph_pagelist_append(pagelist, request_data, request_data_size); | ||
422 | payload_len += request_data_size; | 430 | payload_len += request_data_size; |
423 | 431 | ||
432 | op->cls.request_info = &osd_req->r_data_out; | ||
433 | ceph_osd_data_pagelist_init(op->cls.request_info, pagelist); | ||
434 | |||
424 | op->cls.argc = 0; /* currently unused */ | 435 | op->cls.argc = 0; /* currently unused */ |
425 | 436 | ||
426 | op->payload_len = payload_len; | 437 | op->payload_len = payload_len; |
@@ -456,7 +467,6 @@ static u64 osd_req_encode_op(struct ceph_osd_request *req, | |||
456 | { | 467 | { |
457 | struct ceph_osd_req_op *src; | 468 | struct ceph_osd_req_op *src; |
458 | u64 request_data_len = 0; | 469 | u64 request_data_len = 0; |
459 | struct ceph_pagelist *pagelist; | ||
460 | 470 | ||
461 | BUG_ON(which >= req->r_num_ops); | 471 | BUG_ON(which >= req->r_num_ops); |
462 | src = &req->r_ops[which]; | 472 | src = &req->r_ops[which]; |
@@ -485,23 +495,14 @@ static u64 osd_req_encode_op(struct ceph_osd_request *req, | |||
485 | WARN_ON(src->extent.osd_data != &req->r_data_in); | 495 | WARN_ON(src->extent.osd_data != &req->r_data_in); |
486 | break; | 496 | break; |
487 | case CEPH_OSD_OP_CALL: | 497 | case CEPH_OSD_OP_CALL: |
488 | pagelist = kmalloc(sizeof (*pagelist), GFP_NOFS); | ||
489 | BUG_ON(!pagelist); | ||
490 | ceph_pagelist_init(pagelist); | ||
491 | |||
492 | dst->cls.class_len = src->cls.class_len; | 498 | dst->cls.class_len = src->cls.class_len; |
493 | dst->cls.method_len = src->cls.method_len; | 499 | dst->cls.method_len = src->cls.method_len; |
494 | dst->cls.indata_len = cpu_to_le32(src->cls.request_data_len); | 500 | dst->cls.indata_len = cpu_to_le32(src->cls.request_data_len); |
495 | ceph_pagelist_append(pagelist, src->cls.class_name, | ||
496 | src->cls.class_len); | ||
497 | ceph_pagelist_append(pagelist, src->cls.method_name, | ||
498 | src->cls.method_len); | ||
499 | ceph_pagelist_append(pagelist, src->cls.request_data, | ||
500 | src->cls.request_data_len); | ||
501 | ceph_osd_data_pagelist_init(&req->r_data_out, pagelist); | ||
502 | |||
503 | WARN_ON(src->cls.response_data != &req->r_data_in); | 501 | WARN_ON(src->cls.response_data != &req->r_data_in); |
504 | request_data_len = pagelist->length; | 502 | WARN_ON(src->cls.request_info != &req->r_data_out); |
503 | BUG_ON(src->cls.request_info->type != | ||
504 | CEPH_OSD_DATA_TYPE_PAGELIST); | ||
505 | request_data_len = src->cls.request_info->pagelist->length; | ||
505 | break; | 506 | break; |
506 | case CEPH_OSD_OP_STARTSYNC: | 507 | case CEPH_OSD_OP_STARTSYNC: |
507 | break; | 508 | break; |