diff options
author | Alex Elder <elder@inktank.com> | 2012-11-19 23:55:21 -0500 |
---|---|---|
committer | Alex Elder <elder@inktank.com> | 2013-01-17 17:34:59 -0500 |
commit | 2647ba38100765298fc67ce1ec5d32e80d9fe046 (patch) | |
tree | 574306c5f9e670d94cc73e9b69f6a73d5cffe469 /drivers/block | |
parent | 8d23bf29095e5fab84535035e7a27c4920812c44 (diff) |
rbd: move call osd op setup into rbd_osd_req_op_create()
Move the initialization of the CEPH_OSD_OP_CALL operation into
rbd_osd_req_op_create().
Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/rbd.c | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 235cda083137..760be82548d9 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
@@ -52,10 +52,12 @@ | |||
52 | #define SECTOR_SHIFT 9 | 52 | #define SECTOR_SHIFT 9 |
53 | #define SECTOR_SIZE (1ULL << SECTOR_SHIFT) | 53 | #define SECTOR_SIZE (1ULL << SECTOR_SHIFT) |
54 | 54 | ||
55 | /* It might be useful to have this defined elsewhere too */ | 55 | /* It might be useful to have these defined elsewhere */ |
56 | 56 | ||
57 | #define U32_MAX ((u32) (~0U)) | 57 | #define U8_MAX ((u8) (~0U)) |
58 | #define U64_MAX ((u64) (~0ULL)) | 58 | #define U16_MAX ((u16) (~0U)) |
59 | #define U32_MAX ((u32) (~0U)) | ||
60 | #define U64_MAX ((u64) (~0ULL)) | ||
59 | 61 | ||
60 | #define RBD_DRV_NAME "rbd" | 62 | #define RBD_DRV_NAME "rbd" |
61 | #define RBD_DRV_NAME_LONG "rbd (rados block device)" | 63 | #define RBD_DRV_NAME_LONG "rbd (rados block device)" |
@@ -1047,6 +1049,7 @@ struct ceph_osd_req_op *rbd_osd_req_op_create(u16 opcode, ...) | |||
1047 | { | 1049 | { |
1048 | struct ceph_osd_req_op *op; | 1050 | struct ceph_osd_req_op *op; |
1049 | va_list args; | 1051 | va_list args; |
1052 | size_t size; | ||
1050 | 1053 | ||
1051 | op = kzalloc(sizeof (*op), GFP_NOIO); | 1054 | op = kzalloc(sizeof (*op), GFP_NOIO); |
1052 | if (!op) | 1055 | if (!op) |
@@ -1063,6 +1066,27 @@ struct ceph_osd_req_op *rbd_osd_req_op_create(u16 opcode, ...) | |||
1063 | if (opcode == CEPH_OSD_OP_WRITE) | 1066 | if (opcode == CEPH_OSD_OP_WRITE) |
1064 | op->payload_len = op->extent.length; | 1067 | op->payload_len = op->extent.length; |
1065 | break; | 1068 | break; |
1069 | case CEPH_OSD_OP_CALL: | ||
1070 | /* rbd_osd_req_op_create(CALL, class, method, data, datalen) */ | ||
1071 | op->cls.class_name = va_arg(args, char *); | ||
1072 | size = strlen(op->cls.class_name); | ||
1073 | rbd_assert(size <= (size_t) U8_MAX); | ||
1074 | op->cls.class_len = size; | ||
1075 | op->payload_len = size; | ||
1076 | |||
1077 | op->cls.method_name = va_arg(args, char *); | ||
1078 | size = strlen(op->cls.method_name); | ||
1079 | rbd_assert(size <= (size_t) U8_MAX); | ||
1080 | op->cls.method_len = size; | ||
1081 | op->payload_len += size; | ||
1082 | |||
1083 | op->cls.argc = 0; | ||
1084 | op->cls.indata = va_arg(args, void *); | ||
1085 | size = va_arg(args, size_t); | ||
1086 | rbd_assert(size <= (size_t) U32_MAX); | ||
1087 | op->cls.indata_len = (u32) size; | ||
1088 | op->payload_len += size; | ||
1089 | break; | ||
1066 | default: | 1090 | default: |
1067 | rbd_warn(NULL, "unsupported opcode %hu\n", opcode); | 1091 | rbd_warn(NULL, "unsupported opcode %hu\n", opcode); |
1068 | kfree(op); | 1092 | kfree(op); |
@@ -1510,9 +1534,6 @@ static int rbd_req_sync_exec(struct rbd_device *rbd_dev, | |||
1510 | u64 *ver) | 1534 | u64 *ver) |
1511 | { | 1535 | { |
1512 | struct ceph_osd_req_op *op; | 1536 | struct ceph_osd_req_op *op; |
1513 | int class_name_len = strlen(class_name); | ||
1514 | int method_name_len = strlen(method_name); | ||
1515 | int payload_size; | ||
1516 | int ret; | 1537 | int ret; |
1517 | 1538 | ||
1518 | /* | 1539 | /* |
@@ -1523,25 +1544,16 @@ static int rbd_req_sync_exec(struct rbd_device *rbd_dev, | |||
1523 | * the perspective of the server side) in the OSD request | 1544 | * the perspective of the server side) in the OSD request |
1524 | * operation. | 1545 | * operation. |
1525 | */ | 1546 | */ |
1526 | payload_size = class_name_len + method_name_len + outbound_size; | 1547 | op = rbd_osd_req_op_create(CEPH_OSD_OP_CALL, class_name, |
1527 | op = rbd_create_rw_op(CEPH_OSD_OP_CALL, 0, 0); | 1548 | method_name, outbound, outbound_size); |
1528 | if (!op) | 1549 | if (!op) |
1529 | return -ENOMEM; | 1550 | return -ENOMEM; |
1530 | op->payload_len = payload_size; | ||
1531 | |||
1532 | op->cls.class_name = class_name; | ||
1533 | op->cls.class_len = (__u8) class_name_len; | ||
1534 | op->cls.method_name = method_name; | ||
1535 | op->cls.method_len = (__u8) method_name_len; | ||
1536 | op->cls.argc = 0; | ||
1537 | op->cls.indata = outbound; | ||
1538 | op->cls.indata_len = outbound_size; | ||
1539 | 1551 | ||
1540 | ret = rbd_req_sync_op(rbd_dev, CEPH_OSD_FLAG_READ, op, | 1552 | ret = rbd_req_sync_op(rbd_dev, CEPH_OSD_FLAG_READ, op, |
1541 | object_name, 0, inbound_size, inbound, | 1553 | object_name, 0, inbound_size, inbound, |
1542 | NULL, ver); | 1554 | NULL, ver); |
1543 | 1555 | ||
1544 | rbd_destroy_op(op); | 1556 | rbd_osd_req_op_destroy(op); |
1545 | 1557 | ||
1546 | dout("cls_exec returned %d\n", ret); | 1558 | dout("cls_exec returned %d\n", ret); |
1547 | return ret; | 1559 | return ret; |