summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/block/rbd.c98
1 files changed, 53 insertions, 45 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index ab21b52..4a4be14 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -1311,29 +1311,47 @@ static void rbd_osd_req_callback(struct ceph_osd_request *osd_req,
rbd_obj_request_complete(obj_request);
}
+static void rbd_osd_req_format_op(struct rbd_obj_request *obj_request,
+ bool write_request,
+ struct ceph_osd_req_op *op)
+{
+ struct rbd_img_request *img_request = obj_request->img_request;
+ struct ceph_snap_context *snapc = NULL;
+ u64 snap_id = CEPH_NOSNAP;
+ struct timespec *mtime = NULL;
+ struct timespec now;
+
+ rbd_assert(obj_request->osd_req != NULL);
+
+ if (write_request) {
+ now = CURRENT_TIME;
+ mtime = &now;
+ if (img_request)
+ snapc = img_request->snapc;
+ } else if (img_request) {
+ snap_id = img_request->snap_id;
+ }
+
+ ceph_osdc_build_request(obj_request->osd_req, obj_request->offset,
+ 1, op, snapc, snap_id, mtime);
+}
+
static struct ceph_osd_request *rbd_osd_req_create(
struct rbd_device *rbd_dev,
bool write_request,
- struct rbd_obj_request *obj_request,
- struct ceph_osd_req_op *op)
+ struct rbd_obj_request *obj_request)
{
struct rbd_img_request *img_request = obj_request->img_request;
struct ceph_snap_context *snapc = NULL;
struct ceph_osd_client *osdc;
struct ceph_osd_request *osd_req;
struct ceph_osd_data *osd_data;
- struct timespec now;
- struct timespec *mtime;
- u64 snap_id = CEPH_NOSNAP;
u64 offset = obj_request->offset;
- u64 length = obj_request->length;
if (img_request) {
rbd_assert(img_request->write_request == write_request);
if (img_request->write_request)
snapc = img_request->snapc;
- else
- snap_id = img_request->snap_id;
}
/* Allocate and initialize the request, for the single op */
@@ -1360,16 +1378,10 @@ static struct ceph_osd_request *rbd_osd_req_create(
break;
}
- if (write_request) {
+ if (write_request)
osd_req->r_flags = CEPH_OSD_FLAG_WRITE | CEPH_OSD_FLAG_ONDISK;
- now = CURRENT_TIME;
- mtime = &now;
- } else {
+ else
osd_req->r_flags = CEPH_OSD_FLAG_READ;
- mtime = NULL; /* not needed for reads */
- offset = 0; /* These are not used... */
- length = 0; /* ...for osd read requests */
- }
osd_req->r_callback = rbd_osd_req_callback;
osd_req->r_priv = obj_request;
@@ -1380,11 +1392,6 @@ static struct ceph_osd_request *rbd_osd_req_create(
osd_req->r_file_layout = rbd_dev->layout; /* struct */
- /* osd_req will get its own reference to snapc (if non-null) */
-
- ceph_osdc_build_request(osd_req, offset, 1, op,
- snapc, snap_id, mtime);
-
return osd_req;
}
@@ -1538,6 +1545,7 @@ static int rbd_img_request_fill_bio(struct rbd_img_request *img_request,
struct rbd_device *rbd_dev = img_request->rbd_dev;
struct rbd_obj_request *obj_request = NULL;
struct rbd_obj_request *next_obj_request;
+ bool write_request = img_request->write_request;
unsigned int bio_offset;
u64 image_offset;
u64 resid;
@@ -1545,8 +1553,7 @@ static int rbd_img_request_fill_bio(struct rbd_img_request *img_request,
dout("%s: img %p bio %p\n", __func__, img_request, bio_list);
- opcode = img_request->write_request ? CEPH_OSD_OP_WRITE
- : CEPH_OSD_OP_READ;
+ opcode = write_request ? CEPH_OSD_OP_WRITE : CEPH_OSD_OP_READ;
bio_offset = 0;
image_offset = img_request->offset;
rbd_assert(image_offset == bio_list->bi_sector << SECTOR_SHIFT);
@@ -1579,17 +1586,14 @@ static int rbd_img_request_fill_bio(struct rbd_img_request *img_request,
if (!obj_request->bio_list)
goto out_partial;
- /*
- * Build up the op to use in building the osd
- * request. Note that the contents of the op are
- * copied by rbd_osd_req_create().
- */
- osd_req_op_extent_init(&op, opcode, offset, length, 0, 0);
obj_request->osd_req = rbd_osd_req_create(rbd_dev,
- img_request->write_request,
- obj_request, &op);
+ write_request, obj_request);
if (!obj_request->osd_req)
goto out_partial;
+
+ osd_req_op_extent_init(&op, opcode, offset, length, 0, 0);
+ rbd_osd_req_format_op(obj_request, write_request, &op);
+
/* status and version are initially zero-filled */
rbd_img_obj_request_add(img_request, obj_request);
@@ -1700,12 +1704,13 @@ static int rbd_obj_notify_ack(struct rbd_device *rbd_dev,
return -ENOMEM;
ret = -ENOMEM;
- osd_req_op_watch_init(&op, CEPH_OSD_OP_NOTIFY_ACK, notify_id, ver, 0);
- obj_request->osd_req = rbd_osd_req_create(rbd_dev, false,
- obj_request, &op);
+ obj_request->osd_req = rbd_osd_req_create(rbd_dev, false, obj_request);
if (!obj_request->osd_req)
goto out;
+ osd_req_op_watch_init(&op, CEPH_OSD_OP_NOTIFY_ACK, notify_id, ver, 0);
+ rbd_osd_req_format_op(obj_request, false, &op);
+
osdc = &rbd_dev->rbd_client->client->osdc;
obj_request->callback = rbd_obj_request_put;
ret = rbd_obj_request_submit(osdc, obj_request);
@@ -1764,13 +1769,14 @@ static int rbd_dev_header_watch_sync(struct rbd_device *rbd_dev, int start)
if (!obj_request)
goto out_cancel;
+ obj_request->osd_req = rbd_osd_req_create(rbd_dev, true, obj_request);
+ if (!obj_request->osd_req)
+ goto out_cancel;
+
osd_req_op_watch_init(&op, CEPH_OSD_OP_WATCH,
rbd_dev->watch_event->cookie,
rbd_dev->header.obj_version, start);
- obj_request->osd_req = rbd_osd_req_create(rbd_dev, true,
- obj_request, &op);
- if (!obj_request->osd_req)
- goto out_cancel;
+ rbd_osd_req_format_op(obj_request, true, &op);
if (start)
ceph_osdc_set_request_linger(osdc, obj_request->osd_req);
@@ -1856,13 +1862,14 @@ static int rbd_obj_method_sync(struct rbd_device *rbd_dev,
obj_request->pages = pages;
obj_request->page_count = page_count;
- osd_req_op_cls_init(&op, CEPH_OSD_OP_CALL, class_name, method_name,
- outbound, outbound_size);
- obj_request->osd_req = rbd_osd_req_create(rbd_dev, false,
- obj_request, &op);
+ obj_request->osd_req = rbd_osd_req_create(rbd_dev, false, obj_request);
if (!obj_request->osd_req)
goto out;
+ osd_req_op_cls_init(&op, CEPH_OSD_OP_CALL, class_name, method_name,
+ outbound, outbound_size);
+ rbd_osd_req_format_op(obj_request, false, &op);
+
osdc = &rbd_dev->rbd_client->client->osdc;
ret = rbd_obj_request_submit(osdc, obj_request);
if (ret)
@@ -2061,12 +2068,13 @@ static int rbd_obj_read_sync(struct rbd_device *rbd_dev,
obj_request->pages = pages;
obj_request->page_count = page_count;
- osd_req_op_extent_init(&op, CEPH_OSD_OP_READ, offset, length, 0, 0);
- obj_request->osd_req = rbd_osd_req_create(rbd_dev, false,
- obj_request, &op);
+ obj_request->osd_req = rbd_osd_req_create(rbd_dev, false, obj_request);
if (!obj_request->osd_req)
goto out;
+ osd_req_op_extent_init(&op, CEPH_OSD_OP_READ, offset, length, 0, 0);
+ rbd_osd_req_format_op(obj_request, false, &op);
+
osdc = &rbd_dev->rbd_client->client->osdc;
ret = rbd_obj_request_submit(osdc, obj_request);
if (ret)
OpenPOWER on IntegriCloud