aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorIlya Dryomov <idryomov@gmail.com>2015-10-07 11:27:17 -0400
committerIlya Dryomov <idryomov@gmail.com>2015-10-16 10:49:01 -0400
commite30b7577bf1d338ca8a273bd2f881de5a41572b7 (patch)
tree5aa8f15f8b23b7a8c88e0348eed7e2128ba45350 /net
parent0d9fde4fc8f59a6bd316559d267a936b0737d05a (diff)
rbd: use writefull op for object size writes
This covers only the simplest case - an object size sized write, but it's still useful in tiering setups when EC is used for the base tier as writefull op can be proxied, saving an object promotion. Even though updating ceph_osdc_new_request() to allow writefull should just be a matter of fixing an assert, I didn't do it because its only user is cephfs. All other sites were updated. Reflects ceph.git commit 7bfb7f9025a8ee0d2305f49bf0336d2424da5b5b. Signed-off-by: Ilya Dryomov <idryomov@gmail.com> Reviewed-by: Alex Elder <elder@linaro.org>
Diffstat (limited to 'net')
-rw-r--r--net/ceph/osd_client.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index 80b94e37c94a..f79ccac6699f 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -285,6 +285,7 @@ static void osd_req_op_data_release(struct ceph_osd_request *osd_req,
285 switch (op->op) { 285 switch (op->op) {
286 case CEPH_OSD_OP_READ: 286 case CEPH_OSD_OP_READ:
287 case CEPH_OSD_OP_WRITE: 287 case CEPH_OSD_OP_WRITE:
288 case CEPH_OSD_OP_WRITEFULL:
288 ceph_osd_data_release(&op->extent.osd_data); 289 ceph_osd_data_release(&op->extent.osd_data);
289 break; 290 break;
290 case CEPH_OSD_OP_CALL: 291 case CEPH_OSD_OP_CALL:
@@ -485,13 +486,14 @@ void osd_req_op_extent_init(struct ceph_osd_request *osd_req,
485 size_t payload_len = 0; 486 size_t payload_len = 0;
486 487
487 BUG_ON(opcode != CEPH_OSD_OP_READ && opcode != CEPH_OSD_OP_WRITE && 488 BUG_ON(opcode != CEPH_OSD_OP_READ && opcode != CEPH_OSD_OP_WRITE &&
488 opcode != CEPH_OSD_OP_ZERO && opcode != CEPH_OSD_OP_TRUNCATE); 489 opcode != CEPH_OSD_OP_WRITEFULL && opcode != CEPH_OSD_OP_ZERO &&
490 opcode != CEPH_OSD_OP_TRUNCATE);
489 491
490 op->extent.offset = offset; 492 op->extent.offset = offset;
491 op->extent.length = length; 493 op->extent.length = length;
492 op->extent.truncate_size = truncate_size; 494 op->extent.truncate_size = truncate_size;
493 op->extent.truncate_seq = truncate_seq; 495 op->extent.truncate_seq = truncate_seq;
494 if (opcode == CEPH_OSD_OP_WRITE) 496 if (opcode == CEPH_OSD_OP_WRITE || opcode == CEPH_OSD_OP_WRITEFULL)
495 payload_len += length; 497 payload_len += length;
496 498
497 op->payload_len = payload_len; 499 op->payload_len = payload_len;
@@ -670,9 +672,11 @@ static u64 osd_req_encode_op(struct ceph_osd_request *req,
670 break; 672 break;
671 case CEPH_OSD_OP_READ: 673 case CEPH_OSD_OP_READ:
672 case CEPH_OSD_OP_WRITE: 674 case CEPH_OSD_OP_WRITE:
675 case CEPH_OSD_OP_WRITEFULL:
673 case CEPH_OSD_OP_ZERO: 676 case CEPH_OSD_OP_ZERO:
674 case CEPH_OSD_OP_TRUNCATE: 677 case CEPH_OSD_OP_TRUNCATE:
675 if (src->op == CEPH_OSD_OP_WRITE) 678 if (src->op == CEPH_OSD_OP_WRITE ||
679 src->op == CEPH_OSD_OP_WRITEFULL)
676 request_data_len = src->extent.length; 680 request_data_len = src->extent.length;
677 dst->extent.offset = cpu_to_le64(src->extent.offset); 681 dst->extent.offset = cpu_to_le64(src->extent.offset);
678 dst->extent.length = cpu_to_le64(src->extent.length); 682 dst->extent.length = cpu_to_le64(src->extent.length);
@@ -681,7 +685,8 @@ static u64 osd_req_encode_op(struct ceph_osd_request *req,
681 dst->extent.truncate_seq = 685 dst->extent.truncate_seq =
682 cpu_to_le32(src->extent.truncate_seq); 686 cpu_to_le32(src->extent.truncate_seq);
683 osd_data = &src->extent.osd_data; 687 osd_data = &src->extent.osd_data;
684 if (src->op == CEPH_OSD_OP_WRITE) 688 if (src->op == CEPH_OSD_OP_WRITE ||
689 src->op == CEPH_OSD_OP_WRITEFULL)
685 ceph_osdc_msg_data_add(req->r_request, osd_data); 690 ceph_osdc_msg_data_add(req->r_request, osd_data);
686 else 691 else
687 ceph_osdc_msg_data_add(req->r_reply, osd_data); 692 ceph_osdc_msg_data_add(req->r_reply, osd_data);