diff options
| -rw-r--r-- | drivers/block/rbd.c | 2 | ||||
| -rw-r--r-- | include/linux/ceph/osd_client.h | 3 | ||||
| -rw-r--r-- | net/ceph/osd_client.c | 33 |
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 | ||
| 252 | extern void ceph_osdc_build_request(struct ceph_osd_request *req, | 252 | extern 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 | } |
| 223 | EXPORT_SYMBOL(ceph_osdc_alloc_request); | 223 | EXPORT_SYMBOL(ceph_osdc_alloc_request); |
| 224 | 224 | ||
| 225 | static void osd_req_encode_op(struct ceph_osd_request *req, | 225 | static 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 | */ |
| 335 | void ceph_osdc_build_request(struct ceph_osd_request *req, | 342 | void 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; |
