Commit 8d23bf29 authored by Alex Elder's avatar Alex Elder

rbd: don't assign extent info in rbd_req_sync_op()

Move the assignment of the extent offset and length and payload
length out of rbd_req_sync_op() and into its caller in the one spot
where a read (and note--no write) operation might be initiated.
Signed-off-by: default avatarAlex Elder <elder@inktank.com>
Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
parent c5611918
...@@ -1025,19 +1025,15 @@ static struct bio *bio_chain_clone_range(struct bio **bio_src, ...@@ -1025,19 +1025,15 @@ static struct bio *bio_chain_clone_range(struct bio **bio_src,
return NULL; return NULL;
} }
static struct ceph_osd_req_op *rbd_create_rw_op(int opcode, u32 payload_len) static struct ceph_osd_req_op *rbd_create_rw_op(int opcode, u64 ofs, u64 len)
{ {
struct ceph_osd_req_op *op; struct ceph_osd_req_op *op;
op = kzalloc(sizeof (*op), GFP_NOIO); op = kzalloc(sizeof (*op), GFP_NOIO);
if (!op) if (!op)
return NULL; return NULL;
/*
* op extent offset and length will be set later on
* after ceph_calc_file_object_mapping().
*/
op->op = opcode; op->op = opcode;
op->payload_len = payload_len;
return op; return op;
} }
...@@ -1047,6 +1043,42 @@ static void rbd_destroy_op(struct ceph_osd_req_op *op) ...@@ -1047,6 +1043,42 @@ static void rbd_destroy_op(struct ceph_osd_req_op *op)
kfree(op); kfree(op);
} }
struct ceph_osd_req_op *rbd_osd_req_op_create(u16 opcode, ...)
{
struct ceph_osd_req_op *op;
va_list args;
op = kzalloc(sizeof (*op), GFP_NOIO);
if (!op)
return NULL;
op->op = opcode;
va_start(args, opcode);
switch (opcode) {
case CEPH_OSD_OP_READ:
case CEPH_OSD_OP_WRITE:
/* rbd_osd_req_op_create(READ, offset, length) */
/* rbd_osd_req_op_create(WRITE, offset, length) */
op->extent.offset = va_arg(args, u64);
op->extent.length = va_arg(args, u64);
if (opcode == CEPH_OSD_OP_WRITE)
op->payload_len = op->extent.length;
break;
default:
rbd_warn(NULL, "unsupported opcode %hu\n", opcode);
kfree(op);
op = NULL;
break;
}
va_end(args);
return op;
}
static void rbd_osd_req_op_destroy(struct ceph_osd_req_op *op)
{
kfree(op);
}
static void rbd_coll_end_req_index(struct request *rq, static void rbd_coll_end_req_index(struct request *rq,
struct rbd_req_coll *coll, struct rbd_req_coll *coll,
int index, int index,
...@@ -1262,13 +1294,6 @@ static int rbd_req_sync_op(struct rbd_device *rbd_dev, ...@@ -1262,13 +1294,6 @@ static int rbd_req_sync_op(struct rbd_device *rbd_dev,
if (IS_ERR(pages)) if (IS_ERR(pages))
return PTR_ERR(pages); return PTR_ERR(pages);
if (op->op == CEPH_OSD_OP_READ || op->op == CEPH_OSD_OP_WRITE) {
op->extent.offset = ofs;
op->extent.length = inbound_size;
if (op->op == CEPH_OSD_OP_WRITE)
op->payload_len = inbound_size;
}
ret = rbd_do_request(NULL, rbd_dev, NULL, CEPH_NOSNAP, ret = rbd_do_request(NULL, rbd_dev, NULL, CEPH_NOSNAP,
object_name, ofs, inbound_size, NULL, object_name, ofs, inbound_size, NULL,
pages, num_pages, pages, num_pages,
...@@ -1304,7 +1329,6 @@ static int rbd_do_op(struct request *rq, ...@@ -1304,7 +1329,6 @@ static int rbd_do_op(struct request *rq,
u64 seg_len; u64 seg_len;
int ret; int ret;
struct ceph_osd_req_op *op; struct ceph_osd_req_op *op;
u32 payload_len;
int opcode; int opcode;
int flags; int flags;
u64 snapid; u64 snapid;
...@@ -1319,22 +1343,17 @@ static int rbd_do_op(struct request *rq, ...@@ -1319,22 +1343,17 @@ static int rbd_do_op(struct request *rq,
opcode = CEPH_OSD_OP_WRITE; opcode = CEPH_OSD_OP_WRITE;
flags = CEPH_OSD_FLAG_WRITE|CEPH_OSD_FLAG_ONDISK; flags = CEPH_OSD_FLAG_WRITE|CEPH_OSD_FLAG_ONDISK;
snapid = CEPH_NOSNAP; snapid = CEPH_NOSNAP;
payload_len = seg_len;
} else { } else {
opcode = CEPH_OSD_OP_READ; opcode = CEPH_OSD_OP_READ;
flags = CEPH_OSD_FLAG_READ; flags = CEPH_OSD_FLAG_READ;
rbd_assert(!snapc); rbd_assert(!snapc);
snapid = rbd_dev->spec->snap_id; snapid = rbd_dev->spec->snap_id;
payload_len = 0;
} }
ret = -ENOMEM; ret = -ENOMEM;
op = rbd_create_rw_op(opcode, payload_len); op = rbd_osd_req_op_create(opcode, seg_ofs, seg_len);
if (!op) if (!op)
goto done; goto done;
op->extent.offset = seg_ofs;
op->extent.length = seg_len;
op->payload_len = payload_len;
/* we've taken care of segment sizes earlier when we /* we've taken care of segment sizes earlier when we
cloned the bios. We should never have a segment cloned the bios. We should never have a segment
...@@ -1352,7 +1371,7 @@ static int rbd_do_op(struct request *rq, ...@@ -1352,7 +1371,7 @@ static int rbd_do_op(struct request *rq,
if (ret < 0) if (ret < 0)
rbd_coll_end_req_index(rq, coll, coll_index, rbd_coll_end_req_index(rq, coll, coll_index,
(s32)ret, seg_len); (s32)ret, seg_len);
rbd_destroy_op(op); rbd_osd_req_op_destroy(op);
done: done:
kfree(seg_name); kfree(seg_name);
return ret; return ret;
...@@ -1370,13 +1389,13 @@ static int rbd_req_sync_read(struct rbd_device *rbd_dev, ...@@ -1370,13 +1389,13 @@ static int rbd_req_sync_read(struct rbd_device *rbd_dev,
struct ceph_osd_req_op *op; struct ceph_osd_req_op *op;
int ret; int ret;
op = rbd_create_rw_op(CEPH_OSD_OP_READ, 0); op = rbd_osd_req_op_create(CEPH_OSD_OP_READ, ofs, len);
if (!op) if (!op)
return -ENOMEM; return -ENOMEM;
ret = rbd_req_sync_op(rbd_dev, CEPH_OSD_FLAG_READ, ret = rbd_req_sync_op(rbd_dev, CEPH_OSD_FLAG_READ,
op, object_name, ofs, len, buf, NULL, ver); op, object_name, ofs, len, buf, NULL, ver);
rbd_destroy_op(op); rbd_osd_req_op_destroy(op);
return ret; return ret;
} }
...@@ -1391,7 +1410,7 @@ static int rbd_req_sync_notify_ack(struct rbd_device *rbd_dev, ...@@ -1391,7 +1410,7 @@ static int rbd_req_sync_notify_ack(struct rbd_device *rbd_dev,
struct ceph_osd_req_op *op; struct ceph_osd_req_op *op;
int ret; int ret;
op = rbd_create_rw_op(CEPH_OSD_OP_NOTIFY_ACK, 0); op = rbd_create_rw_op(CEPH_OSD_OP_NOTIFY_ACK, 0, 0);
if (!op) if (!op)
return -ENOMEM; return -ENOMEM;
...@@ -1442,7 +1461,7 @@ static int rbd_req_sync_watch(struct rbd_device *rbd_dev, int start) ...@@ -1442,7 +1461,7 @@ static int rbd_req_sync_watch(struct rbd_device *rbd_dev, int start)
__le64 version = 0; __le64 version = 0;
int ret; int ret;
op = rbd_create_rw_op(CEPH_OSD_OP_WATCH, 0); op = rbd_create_rw_op(CEPH_OSD_OP_WATCH, 0, 0);
if (!op) if (!op)
return -ENOMEM; return -ENOMEM;
...@@ -1505,9 +1524,10 @@ static int rbd_req_sync_exec(struct rbd_device *rbd_dev, ...@@ -1505,9 +1524,10 @@ static int rbd_req_sync_exec(struct rbd_device *rbd_dev,
* operation. * operation.
*/ */
payload_size = class_name_len + method_name_len + outbound_size; payload_size = class_name_len + method_name_len + outbound_size;
op = rbd_create_rw_op(CEPH_OSD_OP_CALL, payload_size); op = rbd_create_rw_op(CEPH_OSD_OP_CALL, 0, 0);
if (!op) if (!op)
return -ENOMEM; return -ENOMEM;
op->payload_len = payload_size;
op->cls.class_name = class_name; op->cls.class_name = class_name;
op->cls.class_len = (__u8) class_name_len; op->cls.class_len = (__u8) class_name_len;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment