Commit 2169238d authored by Alex Elder's avatar Alex Elder Committed by Sage Weil

rbd: rearrange some code for consistency

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: default avatarAlex Elder <elder@inktank.com>
Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
parent 44cd188d
...@@ -1519,6 +1519,57 @@ static void rbd_img_request_destroy(struct kref *kref) ...@@ -1519,6 +1519,57 @@ static void rbd_img_request_destroy(struct kref *kref)
kfree(img_request); 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, static int rbd_img_request_fill_bio(struct rbd_img_request *img_request,
struct bio *bio_list) struct bio *bio_list)
{ {
...@@ -1572,6 +1623,7 @@ static int rbd_img_request_fill_bio(struct rbd_img_request *img_request, ...@@ -1572,6 +1623,7 @@ static int rbd_img_request_fill_bio(struct rbd_img_request *img_request,
if (!osd_req) if (!osd_req)
goto out_partial; goto out_partial;
obj_request->osd_req = osd_req; obj_request->osd_req = osd_req;
obj_request->callback = rbd_img_obj_callback;
osd_data = write_request ? &osd_req->r_data_out osd_data = write_request ? &osd_req->r_data_out
: &osd_req->r_data_in; : &osd_req->r_data_in;
...@@ -1582,8 +1634,6 @@ static int rbd_img_request_fill_bio(struct rbd_img_request *img_request, ...@@ -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); osd_req_op_extent_osd_data(osd_req, 0, osd_data);
rbd_osd_req_format(obj_request, write_request); rbd_osd_req_format(obj_request, write_request);
/* status and version are initially zero-filled */
rbd_img_obj_request_add(img_request, obj_request); rbd_img_obj_request_add(img_request, obj_request);
image_offset += length; image_offset += length;
...@@ -1601,57 +1651,6 @@ static int rbd_img_request_fill_bio(struct rbd_img_request *img_request, ...@@ -1601,57 +1651,6 @@ static int rbd_img_request_fill_bio(struct rbd_img_request *img_request,
return -ENOMEM; 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) static int rbd_img_request_submit(struct rbd_img_request *img_request)
{ {
struct rbd_device *rbd_dev = img_request->rbd_dev; 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) ...@@ -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) { for_each_obj_request_safe(img_request, obj_request, next_obj_request) {
int ret; int ret;
obj_request->callback = rbd_img_obj_callback;
ret = rbd_obj_request_submit(osdc, obj_request); ret = rbd_obj_request_submit(osdc, obj_request);
if (ret) if (ret)
return ret; return ret;
...@@ -1682,7 +1680,7 @@ static int rbd_obj_notify_ack(struct rbd_device *rbd_dev, ...@@ -1682,7 +1680,7 @@ static int rbd_obj_notify_ack(struct rbd_device *rbd_dev,
u64 ver, u64 notify_id) u64 ver, u64 notify_id)
{ {
struct rbd_obj_request *obj_request; struct rbd_obj_request *obj_request;
struct ceph_osd_client *osdc; struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc;
int ret; int ret;
obj_request = rbd_obj_request_create(rbd_dev->header_name, 0, 0, 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, ...@@ -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); obj_request->osd_req = rbd_osd_req_create(rbd_dev, false, obj_request);
if (!obj_request->osd_req) if (!obj_request->osd_req)
goto out; goto out;
obj_request->callback = rbd_obj_request_put;
osd_req_op_watch_init(obj_request->osd_req, 0, CEPH_OSD_OP_NOTIFY_ACK, osd_req_op_watch_init(obj_request->osd_req, 0, CEPH_OSD_OP_NOTIFY_ACK,
notify_id, ver, 0); notify_id, ver, 0);
rbd_osd_req_format(obj_request, false); 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); ret = rbd_obj_request_submit(osdc, obj_request);
out: out:
if (ret) if (ret)
...@@ -1760,16 +1757,17 @@ static int rbd_dev_header_watch_sync(struct rbd_device *rbd_dev, int start) ...@@ -1760,16 +1757,17 @@ static int rbd_dev_header_watch_sync(struct rbd_device *rbd_dev, int start)
if (!obj_request->osd_req) if (!obj_request->osd_req)
goto out_cancel; 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) if (start)
ceph_osdc_set_request_linger(osdc, obj_request->osd_req); ceph_osdc_set_request_linger(osdc, obj_request->osd_req);
else else
ceph_osdc_unregister_linger_request(osdc, ceph_osdc_unregister_linger_request(osdc,
rbd_dev->watch_request->osd_req); 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); ret = rbd_obj_request_submit(osdc, obj_request);
if (ret) if (ret)
goto out_cancel; goto out_cancel;
...@@ -1821,9 +1819,9 @@ static int rbd_obj_method_sync(struct rbd_device *rbd_dev, ...@@ -1821,9 +1819,9 @@ static int rbd_obj_method_sync(struct rbd_device *rbd_dev,
size_t inbound_size, size_t inbound_size,
u64 *version) u64 *version)
{ {
struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc;
struct rbd_obj_request *obj_request; struct rbd_obj_request *obj_request;
struct ceph_osd_data *osd_data; struct ceph_osd_data *osd_data;
struct ceph_osd_client *osdc;
struct page **pages; struct page **pages;
u32 page_count; u32 page_count;
int ret; int ret;
...@@ -1862,7 +1860,6 @@ static int rbd_obj_method_sync(struct rbd_device *rbd_dev, ...@@ -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); osd_req_op_cls_response_data(obj_request->osd_req, 0, osd_data);
rbd_osd_req_format(obj_request, false); rbd_osd_req_format(obj_request, false);
osdc = &rbd_dev->rbd_client->client->osdc;
ret = rbd_obj_request_submit(osdc, obj_request); ret = rbd_obj_request_submit(osdc, obj_request);
if (ret) if (ret)
goto out; goto out;
...@@ -2038,9 +2035,9 @@ static int rbd_obj_read_sync(struct rbd_device *rbd_dev, ...@@ -2038,9 +2035,9 @@ static int rbd_obj_read_sync(struct rbd_device *rbd_dev,
char *buf, u64 *version) char *buf, u64 *version)
{ {
struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc;
struct rbd_obj_request *obj_request; struct rbd_obj_request *obj_request;
struct ceph_osd_data *osd_data; struct ceph_osd_data *osd_data;
struct ceph_osd_client *osdc;
struct page **pages = NULL; struct page **pages = NULL;
u32 page_count; u32 page_count;
size_t size; size_t size;
...@@ -2074,7 +2071,6 @@ static int rbd_obj_read_sync(struct rbd_device *rbd_dev, ...@@ -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); osd_req_op_extent_osd_data(obj_request->osd_req, 0, osd_data);
rbd_osd_req_format(obj_request, false); rbd_osd_req_format(obj_request, false);
osdc = &rbd_dev->rbd_client->client->osdc;
ret = rbd_obj_request_submit(osdc, obj_request); ret = rbd_obj_request_submit(osdc, obj_request);
if (ret) if (ret)
goto out; goto out;
......
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