aboutsummaryrefslogtreecommitdiffstats
path: root/net/ceph/osd_client.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ceph/osd_client.c')
-rw-r--r--net/ceph/osd_client.c50
1 files changed, 22 insertions, 28 deletions
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index 0eb417b44195..7136060a0501 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -32,12 +32,6 @@ static void __unregister_linger_request(struct ceph_osd_client *osdc,
32static void __send_request(struct ceph_osd_client *osdc, 32static void __send_request(struct ceph_osd_client *osdc,
33 struct ceph_osd_request *req); 33 struct ceph_osd_request *req);
34 34
35static int op_has_extent(int op)
36{
37 return (op == CEPH_OSD_OP_READ ||
38 op == CEPH_OSD_OP_WRITE);
39}
40
41/* 35/*
42 * Implement client access to distributed object storage cluster. 36 * Implement client access to distributed object storage cluster.
43 * 37 *
@@ -554,22 +548,15 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
554{ 548{
555 struct ceph_osd_req_op ops[2]; 549 struct ceph_osd_req_op ops[2];
556 struct ceph_osd_request *req; 550 struct ceph_osd_request *req;
557 unsigned int num_op = 1; 551 unsigned int num_op = do_sync ? 2 : 1;
558 u64 objnum = 0; 552 u64 objnum = 0;
559 u64 objoff = 0; 553 u64 objoff = 0;
560 u64 objlen = 0; 554 u64 objlen = 0;
555 u32 object_size;
556 u64 object_base;
561 int r; 557 int r;
562 558
563 memset(&ops, 0, sizeof ops); 559 BUG_ON(opcode != CEPH_OSD_OP_READ && opcode != CEPH_OSD_OP_WRITE);
564
565 ops[0].op = opcode;
566 ops[0].extent.truncate_seq = truncate_seq;
567 ops[0].extent.truncate_size = truncate_size;
568
569 if (do_sync) {
570 ops[1].op = CEPH_OSD_OP_STARTSYNC;
571 num_op++;
572 }
573 560
574 req = ceph_osdc_alloc_request(osdc, snapc, num_op, use_mempool, 561 req = ceph_osdc_alloc_request(osdc, snapc, num_op, use_mempool,
575 GFP_NOFS); 562 GFP_NOFS);
@@ -584,21 +571,28 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
584 return ERR_PTR(r); 571 return ERR_PTR(r);
585 } 572 }
586 573
587 if (op_has_extent(ops[0].op)) { 574 object_size = le32_to_cpu(layout->fl_object_size);
588 u32 osize = le32_to_cpu(layout->fl_object_size); 575 object_base = off - objoff;
589 ops[0].extent.offset = objoff; 576 if (truncate_size <= object_base) {
590 ops[0].extent.length = objlen; 577 truncate_size = 0;
591 if (ops[0].extent.truncate_size <= off - objoff) { 578 } else {
592 ops[0].extent.truncate_size = 0; 579 truncate_size -= object_base;
593 } else { 580 if (truncate_size > object_size)
594 ops[0].extent.truncate_size -= off - objoff; 581 truncate_size = object_size;
595 if (ops[0].extent.truncate_size > osize)
596 ops[0].extent.truncate_size = osize;
597 }
598 } 582 }
583
584 memset(&ops, 0, sizeof ops);
585 ops[0].op = opcode;
586 ops[0].extent.offset = objoff;
587 ops[0].extent.length = objlen;
588 ops[0].extent.truncate_size = truncate_size;
589 ops[0].extent.truncate_seq = truncate_seq;
599 if (ops[0].op == CEPH_OSD_OP_WRITE) 590 if (ops[0].op == CEPH_OSD_OP_WRITE)
600 ops[0].payload_len = *plen; 591 ops[0].payload_len = *plen;
601 592
593 if (do_sync)
594 ops[1].op = CEPH_OSD_OP_STARTSYNC;
595
602 req->r_file_layout = *layout; /* keep a copy */ 596 req->r_file_layout = *layout; /* keep a copy */
603 597
604 snprintf(req->r_oid, sizeof(req->r_oid), "%llx.%08llx", 598 snprintf(req->r_oid, sizeof(req->r_oid), "%llx.%08llx",