aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2012-11-19 23:55:21 -0500
committerAlex Elder <elder@inktank.com>2013-01-17 17:34:59 -0500
commit2647ba38100765298fc67ce1ec5d32e80d9fe046 (patch)
tree574306c5f9e670d94cc73e9b69f6a73d5cffe469 /drivers/block
parent8d23bf29095e5fab84535035e7a27c4920812c44 (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.c48
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;