rbd: rearrange some code for consistency
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:18 +0000 (21:18 -0700)
This patch just trivially moves around some code for consistency.

In preparation for initializing osd request data fields in
ceph_osdc_build_request(), I wanted to verify that rbd did in fact
call that immediately before it called ceph_osdc_start_request().
It was true (although image requests are built in a group and then
started as a group).  But I made the changes here just to make
it more obvious, by making all of the calls follow a common
sequence:
osd_req_op_<optype>_init();
ceph_osd_data_<type>_init()
osd_req_op_<optype>_<datafield>()
rbd_osd_req_format()
...
ret = rbd_obj_request_submit()

I moved the initialization of the callback for image object requests
into rbd_img_request_fill_bio(), again, for consistency.  To avoid
a forward reference, I moved the definition of rbd_img_obj_callback()
up in the file.

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

index 4cfe9f96589e3fd83142dd9564bf3684f5ff0d6c..db29783436c871e851a9fb04ad00e6203ac2cc7e 100644 (file)
@@ -1519,6 +1519,57 @@ static void rbd_img_request_destroy(struct kref *kref)
        kfree(img_request);
 }
 
+static void rbd_img_obj_callback(struct rbd_obj_request *obj_request)
+{
+       struct rbd_img_request *img_request;
+       u32 which = obj_request->which;
+       bool more = true;
+
+       img_request = obj_request->img_request;
+
+       dout("%s: img %p obj %p\n", __func__, img_request, obj_request);
+       rbd_assert(img_request != NULL);
+       rbd_assert(img_request->rq != NULL);
+       rbd_assert(img_request->obj_request_count > 0);
+       rbd_assert(which != BAD_WHICH);
+       rbd_assert(which < img_request->obj_request_count);
+       rbd_assert(which >= img_request->next_completion);
+
+       spin_lock_irq(&img_request->completion_lock);
+       if (which != img_request->next_completion)
+               goto out;
+
+       for_each_obj_request_from(img_request, obj_request) {
+               unsigned int xferred;
+               int result;
+
+               rbd_assert(more);
+               rbd_assert(which < img_request->obj_request_count);
+
+               if (!obj_request_done_test(obj_request))
+                       break;
+
+               rbd_assert(obj_request->xferred <= (u64) UINT_MAX);
+               xferred = (unsigned int) obj_request->xferred;
+               result = (int) obj_request->result;
+               if (result)
+                       rbd_warn(NULL, "obj_request %s result %d xferred %u\n",
+                               img_request->write_request ? "write" : "read",
+                               result, xferred);
+
+               more = blk_end_request(img_request->rq, result, xferred);
+               which++;
+       }
+
+       rbd_assert(more ^ (which == img_request->obj_request_count));
+       img_request->next_completion = which;
+out:
+       spin_unlock_irq(&img_request->completion_lock);
+
+       if (!more)
+               rbd_img_request_complete(img_request);
+}
+
 static int rbd_img_request_fill_bio(struct rbd_img_request *img_request,
                                        struct bio *bio_list)
 {
@@ -1572,6 +1623,7 @@ static int rbd_img_request_fill_bio(struct rbd_img_request *img_request,
                if (!osd_req)
                        goto out_partial;
                obj_request->osd_req = osd_req;
+               obj_request->callback = rbd_img_obj_callback;
 
                osd_data = write_request ? &osd_req->r_data_out
                                         : &osd_req->r_data_in;
@@ -1582,8 +1634,6 @@ static int rbd_img_request_fill_bio(struct rbd_img_request *img_request,
                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 */
-
                rbd_img_obj_request_add(img_request, obj_request);
 
                image_offset += length;
@@ -1601,57 +1651,6 @@ out_unwind:
        return -ENOMEM;
 }
 
-static void rbd_img_obj_callback(struct rbd_obj_request *obj_request)
-{
-       struct rbd_img_request *img_request;
-       u32 which = obj_request->which;
-       bool more = true;
-
-       img_request = obj_request->img_request;
-
-       dout("%s: img %p obj %p\n", __func__, img_request, obj_request);
-       rbd_assert(img_request != NULL);
-       rbd_assert(img_request->rq != NULL);
-       rbd_assert(img_request->obj_request_count > 0);
-       rbd_assert(which != BAD_WHICH);
-       rbd_assert(which < img_request->obj_request_count);
-       rbd_assert(which >= img_request->next_completion);
-
-       spin_lock_irq(&img_request->completion_lock);
-       if (which != img_request->next_completion)
-               goto out;
-
-       for_each_obj_request_from(img_request, obj_request) {
-               unsigned int xferred;
-               int result;
-
-               rbd_assert(more);
-               rbd_assert(which < img_request->obj_request_count);
-
-               if (!obj_request_done_test(obj_request))
-                       break;
-
-               rbd_assert(obj_request->xferred <= (u64) UINT_MAX);
-               xferred = (unsigned int) obj_request->xferred;
-               result = (int) obj_request->result;
-               if (result)
-                       rbd_warn(NULL, "obj_request %s result %d xferred %u\n",
-                               img_request->write_request ? "write" : "read",
-                               result, xferred);
-
-               more = blk_end_request(img_request->rq, result, xferred);
-               which++;
-       }
-
-       rbd_assert(more ^ (which == img_request->obj_request_count));
-       img_request->next_completion = which;
-out:
-       spin_unlock_irq(&img_request->completion_lock);
-
-       if (!more)
-               rbd_img_request_complete(img_request);
-}
-
 static int rbd_img_request_submit(struct rbd_img_request *img_request)
 {
        struct rbd_device *rbd_dev = img_request->rbd_dev;
@@ -1663,7 +1662,6 @@ static int rbd_img_request_submit(struct rbd_img_request *img_request)
        for_each_obj_request_safe(img_request, obj_request, next_obj_request) {
                int ret;
 
-               obj_request->callback = rbd_img_obj_callback;
                ret = rbd_obj_request_submit(osdc, obj_request);
                if (ret)
                        return ret;
@@ -1682,7 +1680,7 @@ static int rbd_obj_notify_ack(struct rbd_device *rbd_dev,
                                   u64 ver, u64 notify_id)
 {
        struct rbd_obj_request *obj_request;
-       struct ceph_osd_client *osdc;
+       struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc;
        int ret;
 
        obj_request = rbd_obj_request_create(rbd_dev->header_name, 0, 0,
@@ -1694,13 +1692,12 @@ static int rbd_obj_notify_ack(struct rbd_device *rbd_dev,
        obj_request->osd_req = rbd_osd_req_create(rbd_dev, false, obj_request);
        if (!obj_request->osd_req)
                goto out;
+       obj_request->callback = rbd_obj_request_put;
 
        osd_req_op_watch_init(obj_request->osd_req, 0, CEPH_OSD_OP_NOTIFY_ACK,
                                        notify_id, ver, 0);
        rbd_osd_req_format(obj_request, false);
 
-       osdc = &rbd_dev->rbd_client->client->osdc;
-       obj_request->callback = rbd_obj_request_put;
        ret = rbd_obj_request_submit(osdc, obj_request);
 out:
        if (ret)
@@ -1760,16 +1757,17 @@ static int rbd_dev_header_watch_sync(struct rbd_device *rbd_dev, int start)
        if (!obj_request->osd_req)
                goto out_cancel;
 
-       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(obj_request, true);
-
        if (start)
                ceph_osdc_set_request_linger(osdc, obj_request->osd_req);
        else
                ceph_osdc_unregister_linger_request(osdc,
                                        rbd_dev->watch_request->osd_req);
+
+       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(obj_request, true);
+
        ret = rbd_obj_request_submit(osdc, obj_request);
        if (ret)
                goto out_cancel;
@@ -1821,9 +1819,9 @@ static int rbd_obj_method_sync(struct rbd_device *rbd_dev,
                             size_t inbound_size,
                             u64 *version)
 {
+       struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc;
        struct rbd_obj_request *obj_request;
        struct ceph_osd_data *osd_data;
-       struct ceph_osd_client *osdc;
        struct page **pages;
        u32 page_count;
        int ret;
@@ -1862,7 +1860,6 @@ static int rbd_obj_method_sync(struct rbd_device *rbd_dev,
        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);
        if (ret)
                goto out;
@@ -2038,9 +2035,9 @@ static int rbd_obj_read_sync(struct rbd_device *rbd_dev,
                                char *buf, u64 *version)
 
 {
+       struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc;
        struct rbd_obj_request *obj_request;
        struct ceph_osd_data *osd_data;
-       struct ceph_osd_client *osdc;
        struct page **pages = NULL;
        u32 page_count;
        size_t size;
@@ -2074,7 +2071,6 @@ static int rbd_obj_read_sync(struct rbd_device *rbd_dev,
        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);
        if (ret)
                goto out;