diff options
-rw-r--r-- | net/ceph/osd_client.c | 50 |
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, static void __send_request(struct ceph_osd_client *osdc, struct ceph_osd_request *req); -static int op_has_extent(int op) -{ - return (op == CEPH_OSD_OP_READ || - op == CEPH_OSD_OP_WRITE); -} - /* * Implement client access to distributed object storage cluster. * @@ -554,22 +548,15 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc, { struct ceph_osd_req_op ops[2]; struct ceph_osd_request *req; - unsigned int num_op = 1; + unsigned int num_op = do_sync ? 2 : 1; u64 objnum = 0; u64 objoff = 0; u64 objlen = 0; + u32 object_size; + u64 object_base; int r; - memset(&ops, 0, sizeof ops); - - ops[0].op = opcode; - ops[0].extent.truncate_seq = truncate_seq; - ops[0].extent.truncate_size = truncate_size; - - if (do_sync) { - ops[1].op = CEPH_OSD_OP_STARTSYNC; - num_op++; - } + BUG_ON(opcode != CEPH_OSD_OP_READ && opcode != CEPH_OSD_OP_WRITE); req = ceph_osdc_alloc_request(osdc, snapc, num_op, use_mempool, GFP_NOFS); @@ -584,21 +571,28 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc, return ERR_PTR(r); } - if (op_has_extent(ops[0].op)) { - u32 osize = le32_to_cpu(layout->fl_object_size); - ops[0].extent.offset = objoff; - ops[0].extent.length = objlen; - if (ops[0].extent.truncate_size <= off - objoff) { - ops[0].extent.truncate_size = 0; - } else { - ops[0].extent.truncate_size -= off - objoff; - if (ops[0].extent.truncate_size > osize) - ops[0].extent.truncate_size = osize; - } + object_size = le32_to_cpu(layout->fl_object_size); + object_base = off - objoff; + if (truncate_size <= object_base) { + truncate_size = 0; + } else { + truncate_size -= object_base; + if (truncate_size > object_size) + truncate_size = object_size; } + + memset(&ops, 0, sizeof ops); + ops[0].op = opcode; + ops[0].extent.offset = objoff; + ops[0].extent.length = objlen; + ops[0].extent.truncate_size = truncate_size; + ops[0].extent.truncate_seq = truncate_seq; if (ops[0].op == CEPH_OSD_OP_WRITE) ops[0].payload_len = *plen; + if (do_sync) + ops[1].op = CEPH_OSD_OP_STARTSYNC; + req->r_file_layout = *layout; /* keep a copy */ snprintf(req->r_oid, sizeof(req->r_oid), "%llx.%08llx", |