aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/block/rbd.c2
-rw-r--r--include/linux/ceph/osd_client.h3
-rw-r--r--net/ceph/osd_client.c33
3 files changed, 21 insertions, 17 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 04cd5fdfc8f3..dea4401c4f77 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -1462,7 +1462,7 @@ static struct ceph_osd_request *rbd_osd_req_create(
1462 1462
1463 /* osd_req will get its own reference to snapc (if non-null) */ 1463 /* osd_req will get its own reference to snapc (if non-null) */
1464 1464
1465 ceph_osdc_build_request(osd_req, offset, length, 1, op, 1465 ceph_osdc_build_request(osd_req, offset, 1, op,
1466 snapc, snap_id, mtime); 1466 snapc, snap_id, mtime);
1467 1467
1468 return osd_req; 1468 return osd_req;
diff --git a/include/linux/ceph/osd_client.h b/include/linux/ceph/osd_client.h
index a8016dfbfdba..bcf3f72ec3f8 100644
--- a/include/linux/ceph/osd_client.h
+++ b/include/linux/ceph/osd_client.h
@@ -249,8 +249,7 @@ extern struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *
249 bool use_mempool, 249 bool use_mempool,
250 gfp_t gfp_flags); 250 gfp_t gfp_flags);
251 251
252extern void ceph_osdc_build_request(struct ceph_osd_request *req, 252extern void ceph_osdc_build_request(struct ceph_osd_request *req, u64 off,
253 u64 off, u64 len,
254 unsigned int num_op, 253 unsigned int num_op,
255 struct ceph_osd_req_op *src_ops, 254 struct ceph_osd_req_op *src_ops,
256 struct ceph_snap_context *snapc, 255 struct ceph_snap_context *snapc,
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index 37d89614a61b..ce34faaa453f 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -222,10 +222,13 @@ struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc,
222} 222}
223EXPORT_SYMBOL(ceph_osdc_alloc_request); 223EXPORT_SYMBOL(ceph_osdc_alloc_request);
224 224
225static void osd_req_encode_op(struct ceph_osd_request *req, 225static u64 osd_req_encode_op(struct ceph_osd_request *req,
226 struct ceph_osd_op *dst, 226 struct ceph_osd_op *dst,
227 struct ceph_osd_req_op *src) 227 struct ceph_osd_req_op *src)
228{ 228{
229 u64 out_data_len = 0;
230 u64 tmp;
231
229 dst->op = cpu_to_le16(src->op); 232 dst->op = cpu_to_le16(src->op);
230 233
231 switch (src->op) { 234 switch (src->op) {
@@ -233,10 +236,10 @@ static void osd_req_encode_op(struct ceph_osd_request *req,
233 break; 236 break;
234 case CEPH_OSD_OP_READ: 237 case CEPH_OSD_OP_READ:
235 case CEPH_OSD_OP_WRITE: 238 case CEPH_OSD_OP_WRITE:
236 dst->extent.offset = 239 if (src->op == CEPH_OSD_OP_WRITE)
237 cpu_to_le64(src->extent.offset); 240 out_data_len = src->extent.length;
238 dst->extent.length = 241 dst->extent.offset = cpu_to_le64(src->extent.offset);
239 cpu_to_le64(src->extent.length); 242 dst->extent.length = cpu_to_le64(src->extent.length);
240 dst->extent.truncate_size = 243 dst->extent.truncate_size =
241 cpu_to_le64(src->extent.truncate_size); 244 cpu_to_le64(src->extent.truncate_size);
242 dst->extent.truncate_seq = 245 dst->extent.truncate_seq =
@@ -247,12 +250,14 @@ static void osd_req_encode_op(struct ceph_osd_request *req,
247 dst->cls.method_len = src->cls.method_len; 250 dst->cls.method_len = src->cls.method_len;
248 dst->cls.indata_len = cpu_to_le32(src->cls.indata_len); 251 dst->cls.indata_len = cpu_to_le32(src->cls.indata_len);
249 252
253 tmp = req->r_trail.length;
250 ceph_pagelist_append(&req->r_trail, src->cls.class_name, 254 ceph_pagelist_append(&req->r_trail, src->cls.class_name,
251 src->cls.class_len); 255 src->cls.class_len);
252 ceph_pagelist_append(&req->r_trail, src->cls.method_name, 256 ceph_pagelist_append(&req->r_trail, src->cls.method_name,
253 src->cls.method_len); 257 src->cls.method_len);
254 ceph_pagelist_append(&req->r_trail, src->cls.indata, 258 ceph_pagelist_append(&req->r_trail, src->cls.indata,
255 src->cls.indata_len); 259 src->cls.indata_len);
260 out_data_len = req->r_trail.length - tmp;
256 break; 261 break;
257 case CEPH_OSD_OP_STARTSYNC: 262 case CEPH_OSD_OP_STARTSYNC:
258 break; 263 break;
@@ -326,6 +331,8 @@ static void osd_req_encode_op(struct ceph_osd_request *req,
326 break; 331 break;
327 } 332 }
328 dst->payload_len = cpu_to_le32(src->payload_len); 333 dst->payload_len = cpu_to_le32(src->payload_len);
334
335 return out_data_len;
329} 336}
330 337
331/* 338/*
@@ -333,7 +340,7 @@ static void osd_req_encode_op(struct ceph_osd_request *req,
333 * 340 *
334 */ 341 */
335void ceph_osdc_build_request(struct ceph_osd_request *req, 342void ceph_osdc_build_request(struct ceph_osd_request *req,
336 u64 off, u64 len, unsigned int num_ops, 343 u64 off, unsigned int num_ops,
337 struct ceph_osd_req_op *src_ops, 344 struct ceph_osd_req_op *src_ops,
338 struct ceph_snap_context *snapc, u64 snap_id, 345 struct ceph_snap_context *snapc, u64 snap_id,
339 struct timespec *mtime) 346 struct timespec *mtime)
@@ -385,12 +392,13 @@ void ceph_osdc_build_request(struct ceph_osd_request *req,
385 dout("oid '%.*s' len %d\n", req->r_oid_len, req->r_oid, req->r_oid_len); 392 dout("oid '%.*s' len %d\n", req->r_oid_len, req->r_oid, req->r_oid_len);
386 p += req->r_oid_len; 393 p += req->r_oid_len;
387 394
388 /* ops */ 395 /* ops--can imply data */
389 ceph_encode_16(&p, num_ops); 396 ceph_encode_16(&p, num_ops);
390 src_op = src_ops; 397 src_op = src_ops;
391 req->r_request_ops = p; 398 req->r_request_ops = p;
399 data_len = 0;
392 for (i = 0; i < num_ops; i++, src_op++) { 400 for (i = 0; i < num_ops; i++, src_op++) {
393 osd_req_encode_op(req, p, src_op); 401 data_len += osd_req_encode_op(req, p, src_op);
394 p += sizeof(struct ceph_osd_op); 402 p += sizeof(struct ceph_osd_op);
395 } 403 }
396 404
@@ -407,11 +415,9 @@ void ceph_osdc_build_request(struct ceph_osd_request *req,
407 req->r_request_attempts = p; 415 req->r_request_attempts = p;
408 p += 4; 416 p += 4;
409 417
410 data_len = req->r_trail.length; 418 /* data */
411 if (flags & CEPH_OSD_FLAG_WRITE) { 419 if (flags & CEPH_OSD_FLAG_WRITE)
412 req->r_request->hdr.data_off = cpu_to_le16(off); 420 req->r_request->hdr.data_off = cpu_to_le16(off);
413 data_len += len;
414 }
415 req->r_request->hdr.data_len = cpu_to_le32(data_len); 421 req->r_request->hdr.data_len = cpu_to_le32(data_len);
416 422
417 BUG_ON(p > msg->front.iov_base + msg->front.iov_len); 423 BUG_ON(p > msg->front.iov_base + msg->front.iov_len);
@@ -477,13 +483,12 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
477 ceph_osdc_put_request(req); 483 ceph_osdc_put_request(req);
478 return ERR_PTR(r); 484 return ERR_PTR(r);
479 } 485 }
480
481 req->r_file_layout = *layout; /* keep a copy */ 486 req->r_file_layout = *layout; /* keep a copy */
482 487
483 snprintf(req->r_oid, sizeof(req->r_oid), "%llx.%08llx", vino.ino, bno); 488 snprintf(req->r_oid, sizeof(req->r_oid), "%llx.%08llx", vino.ino, bno);
484 req->r_oid_len = strlen(req->r_oid); 489 req->r_oid_len = strlen(req->r_oid);
485 490
486 ceph_osdc_build_request(req, off, *plen, num_op, ops, 491 ceph_osdc_build_request(req, off, num_op, ops,
487 snapc, vino.snap, mtime); 492 snapc, vino.snap, mtime);
488 493
489 return req; 494 return req;