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.
*
{
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);
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",