aboutsummaryrefslogtreecommitdiffstats
path: root/net/ceph
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2013-04-03 02:28:58 -0400
committerSage Weil <sage@inktank.com>2013-05-02 00:18:14 -0400
commit8c042b0df99cd06ef8473ef6e204b87b3dc80158 (patch)
tree234f410f3253401efa7266cdd67a6e87b22e8bac /net/ceph
parent54d5064912649e296552f298e6472ffd37cd8f90 (diff)
libceph: add data pointers in osd op structures
An extent type osd operation currently implies that there will be corresponding data supplied in the data portion of the request (for write) or response (for read) message. Similarly, an osd class method operation implies a data item will be supplied to receive the response data from the operation. Add a ceph_osd_data pointer to each of those structures, and assign it to point to eithre the incoming or the outgoing data structure in the osd message. The data is not always available when an op is initially set up, so add two new functions to allow setting them after the op has been initialized. Begin to make use of the data item pointer available in the osd operation rather than the request data in or out structure in places where it's convenient. Add some assertions to verify pointers are always set the way they're expected to be. This is a sort of stepping stone toward really moving the data into the osd request ops, to allow for some validation before making that jump. This is the first in a series of patches that resolve: http://tracker.ceph.com/issues/4657 Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
Diffstat (limited to 'net/ceph')
-rw-r--r--net/ceph/osd_client.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index 87fcf0b795c0..23491e92b229 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -372,6 +372,13 @@ void osd_req_op_extent_update(struct ceph_osd_req_op *op, u64 length)
372} 372}
373EXPORT_SYMBOL(osd_req_op_extent_update); 373EXPORT_SYMBOL(osd_req_op_extent_update);
374 374
375void osd_req_op_extent_osd_data(struct ceph_osd_req_op *op,
376 struct ceph_osd_data *osd_data)
377{
378 op->extent.osd_data = osd_data;
379}
380EXPORT_SYMBOL(osd_req_op_extent_osd_data);
381
375void osd_req_op_cls_init(struct ceph_osd_req_op *op, u16 opcode, 382void osd_req_op_cls_init(struct ceph_osd_req_op *op, u16 opcode,
376 const char *class, const char *method, 383 const char *class, const char *method,
377 const void *request_data, size_t request_data_size) 384 const void *request_data, size_t request_data_size)
@@ -406,6 +413,13 @@ void osd_req_op_cls_init(struct ceph_osd_req_op *op, u16 opcode,
406} 413}
407EXPORT_SYMBOL(osd_req_op_cls_init); 414EXPORT_SYMBOL(osd_req_op_cls_init);
408 415
416void osd_req_op_cls_response_data(struct ceph_osd_req_op *op,
417 struct ceph_osd_data *response_data)
418{
419 op->cls.response_data = response_data;
420}
421EXPORT_SYMBOL(osd_req_op_cls_response_data);
422
409void osd_req_op_watch_init(struct ceph_osd_req_op *op, u16 opcode, 423void osd_req_op_watch_init(struct ceph_osd_req_op *op, u16 opcode,
410 u64 cookie, u64 version, int flag) 424 u64 cookie, u64 version, int flag)
411{ 425{
@@ -449,6 +463,10 @@ static u64 osd_req_encode_op(struct ceph_osd_request *req,
449 cpu_to_le64(src->extent.truncate_size); 463 cpu_to_le64(src->extent.truncate_size);
450 dst->extent.truncate_seq = 464 dst->extent.truncate_seq =
451 cpu_to_le32(src->extent.truncate_seq); 465 cpu_to_le32(src->extent.truncate_seq);
466 if (src->op == CEPH_OSD_OP_WRITE)
467 WARN_ON(src->extent.osd_data != &req->r_data_out);
468 else
469 WARN_ON(src->extent.osd_data != &req->r_data_in);
452 break; 470 break;
453 case CEPH_OSD_OP_CALL: 471 case CEPH_OSD_OP_CALL:
454 pagelist = kmalloc(sizeof (*pagelist), GFP_NOFS); 472 pagelist = kmalloc(sizeof (*pagelist), GFP_NOFS);
@@ -464,8 +482,9 @@ static u64 osd_req_encode_op(struct ceph_osd_request *req,
464 src->cls.method_len); 482 src->cls.method_len);
465 ceph_pagelist_append(pagelist, src->cls.request_data, 483 ceph_pagelist_append(pagelist, src->cls.request_data,
466 src->cls.request_data_len); 484 src->cls.request_data_len);
467
468 ceph_osd_data_pagelist_init(&req->r_data_out, pagelist); 485 ceph_osd_data_pagelist_init(&req->r_data_out, pagelist);
486
487 WARN_ON(src->cls.response_data != &req->r_data_in);
469 request_data_len = pagelist->length; 488 request_data_len = pagelist->length;
470 break; 489 break;
471 case CEPH_OSD_OP_STARTSYNC: 490 case CEPH_OSD_OP_STARTSYNC:
@@ -609,6 +628,7 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
609 bool use_mempool) 628 bool use_mempool)
610{ 629{
611 struct ceph_osd_request *req; 630 struct ceph_osd_request *req;
631 struct ceph_osd_data *osd_data;
612 struct ceph_osd_req_op *op; 632 struct ceph_osd_req_op *op;
613 u64 objnum = 0; 633 u64 objnum = 0;
614 u64 objoff = 0; 634 u64 objoff = 0;
@@ -623,6 +643,8 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
623 GFP_NOFS); 643 GFP_NOFS);
624 if (!req) 644 if (!req)
625 return ERR_PTR(-ENOMEM); 645 return ERR_PTR(-ENOMEM);
646 osd_data = opcode == CEPH_OSD_OP_WRITE ? &req->r_data_out
647 : &req->r_data_in;
626 648
627 req->r_flags = flags; 649 req->r_flags = flags;
628 650
@@ -646,6 +668,8 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
646 op = &req->r_ops[0]; 668 op = &req->r_ops[0];
647 osd_req_op_extent_init(op, opcode, objoff, objlen, 669 osd_req_op_extent_init(op, opcode, objoff, objlen,
648 truncate_size, truncate_seq); 670 truncate_size, truncate_seq);
671 osd_req_op_extent_osd_data(op, osd_data);
672
649 /* 673 /*
650 * A second op in the ops array means the caller wants to 674 * A second op in the ops array means the caller wants to
651 * also issue a include a 'startsync' command so that the 675 * also issue a include a 'startsync' command so that the