rbd: don't set data in rbd_osd_req_format_op()
authorAlex Elder <elder@inktank.com>
Fri, 5 Apr 2013 06:27:12 +0000 (01:27 -0500)
committerSage Weil <sage@inktank.com>
Thu, 2 May 2013 04:18:16 +0000 (21:18 -0700)
Currently an object request has its osd request's data field set in
rbd_osd_req_format_op().  That assumes a single osd op per object
request, and that won't be the case for long.

Move the code that sets this out and into the caller.

Rename rbd_osd_req_format_op() to be just rbd_osd_req_format(),
removing the notion that it's doing anything op-specific.

This and the next patch resolve:
    http://tracker.ceph.com/issues/4658

Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
drivers/block/rbd.c

index 80ac772587c8b5d9772977d7d7cbca1fd4e9d24f..06912abca6011dc6b63ebfdbe70029e171f5ba88 100644 (file)
@@ -1311,12 +1311,11 @@ 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,
+static void rbd_osd_req_format(struct rbd_obj_request *obj_request,
                                        bool write_request)
 {
        struct rbd_img_request *img_request = obj_request->img_request;
        struct ceph_osd_request *osd_req = obj_request->osd_req;
-       struct ceph_osd_data *osd_data = NULL;
        struct ceph_snap_context *snapc = NULL;
        u64 snap_id = CEPH_NOSNAP;
        struct timespec *mtime = NULL;
@@ -1325,28 +1324,12 @@ static void rbd_osd_req_format_op(struct rbd_obj_request *obj_request,
        rbd_assert(osd_req != NULL);
 
        if (write_request) {
-               osd_data = &osd_req->r_data_out;
                now = CURRENT_TIME;
                mtime = &now;
                if (img_request)
                        snapc = img_request->snapc;
-       } else {
-               osd_data = &osd_req->r_data_in;
-               if (img_request)
-                       snap_id = img_request->snap_id;
-       }
-       if (obj_request->type != OBJ_REQUEST_NODATA) {
-               /*
-                * If it has data, it's either a object class method
-                * call (cls) or it's an extent operation.
-                */
-               /* XXX This use of the ops array goes away in the next patch */
-               if (obj_request->osd_req->r_ops[0].op == CEPH_OSD_OP_CALL)
-                       osd_req_op_cls_response_data(obj_request->osd_req, 0,
-                                               osd_data);
-               else
-                       osd_req_op_extent_osd_data(obj_request->osd_req, 0,
-                                               osd_data);
+       } else if (img_request) {
+               snap_id = img_request->snap_id;
        }
        ceph_osdc_build_request(osd_req, obj_request->offset,
                        snapc, snap_id, mtime);
@@ -1576,6 +1559,8 @@ static int rbd_img_request_fill_bio(struct rbd_img_request *img_request,
        resid = img_request->length;
        rbd_assert(resid > 0);
        while (resid) {
+               struct ceph_osd_request *osd_req;
+               struct ceph_osd_data *osd_data;
                const char *object_name;
                unsigned int clone_size;
                u64 offset;
@@ -1601,14 +1586,18 @@ static int rbd_img_request_fill_bio(struct rbd_img_request *img_request,
                if (!obj_request->bio_list)
                        goto out_partial;
 
-               obj_request->osd_req = rbd_osd_req_create(rbd_dev,
-                                               write_request, obj_request);
-               if (!obj_request->osd_req)
+               osd_req = rbd_osd_req_create(rbd_dev, write_request,
+                                               obj_request);
+               if (!osd_req)
                        goto out_partial;
+               obj_request->osd_req = osd_req;
 
-               osd_req_op_extent_init(obj_request->osd_req, 0,
-                                       opcode, offset, length, 0, 0);
-               rbd_osd_req_format_op(obj_request, write_request);
+               osd_data = write_request ? &osd_req->r_data_out
+                                        : &osd_req->r_data_in;
+               osd_req_op_extent_init(osd_req, 0, opcode, offset, length,
+                                               0, 0);
+               osd_req_op_extent_osd_data(osd_req, 0, osd_data);
+               rbd_osd_req_format(obj_request, write_request);
 
                /* status and version are initially zero-filled */
 
@@ -1725,7 +1714,7 @@ static int rbd_obj_notify_ack(struct rbd_device *rbd_dev,
 
        osd_req_op_watch_init(obj_request->osd_req, 0, CEPH_OSD_OP_NOTIFY_ACK,
                                        notify_id, ver, 0);
-       rbd_osd_req_format_op(obj_request, false);
+       rbd_osd_req_format(obj_request, false);
 
        osdc = &rbd_dev->rbd_client->client->osdc;
        obj_request->callback = rbd_obj_request_put;
@@ -1791,7 +1780,7 @@ static int rbd_dev_header_watch_sync(struct rbd_device *rbd_dev, int start)
        osd_req_op_watch_init(obj_request->osd_req, 0, CEPH_OSD_OP_WATCH,
                                rbd_dev->watch_event->cookie,
                                rbd_dev->header.obj_version, start);
-       rbd_osd_req_format_op(obj_request, true);
+       rbd_osd_req_format(obj_request, true);
 
        if (start)
                ceph_osdc_set_request_linger(osdc, obj_request->osd_req);
@@ -1850,6 +1839,7 @@ static int rbd_obj_method_sync(struct rbd_device *rbd_dev,
                             u64 *version)
 {
        struct rbd_obj_request *obj_request;
+       struct ceph_osd_data *osd_data;
        struct ceph_osd_client *osdc;
        struct page **pages;
        u32 page_count;
@@ -1880,10 +1870,12 @@ static int rbd_obj_method_sync(struct rbd_device *rbd_dev,
        if (!obj_request->osd_req)
                goto out;
 
+       osd_data = &obj_request->osd_req->r_data_in;
        osd_req_op_cls_init(obj_request->osd_req, 0, CEPH_OSD_OP_CALL,
                                        class_name, method_name,
                                        outbound, outbound_size);
-       rbd_osd_req_format_op(obj_request, false);
+       osd_req_op_cls_response_data(obj_request->osd_req, 0, osd_data);
+       rbd_osd_req_format(obj_request, false);
 
        osdc = &rbd_dev->rbd_client->client->osdc;
        ret = rbd_obj_request_submit(osdc, obj_request);
@@ -2062,6 +2054,7 @@ static int rbd_obj_read_sync(struct rbd_device *rbd_dev,
 
 {
        struct rbd_obj_request *obj_request;
+       struct ceph_osd_data *osd_data;
        struct ceph_osd_client *osdc;
        struct page **pages = NULL;
        u32 page_count;
@@ -2086,9 +2079,11 @@ static int rbd_obj_read_sync(struct rbd_device *rbd_dev,
        if (!obj_request->osd_req)
                goto out;
 
+       osd_data = &obj_request->osd_req->r_data_in;
        osd_req_op_extent_init(obj_request->osd_req, 0, CEPH_OSD_OP_READ,
                                        offset, length, 0, 0);
-       rbd_osd_req_format_op(obj_request, false);
+       osd_req_op_extent_osd_data(obj_request->osd_req, 0, osd_data);
+       rbd_osd_req_format(obj_request, false);
 
        osdc = &rbd_dev->rbd_client->client->osdc;
        ret = rbd_obj_request_submit(osdc, obj_request);