|
|
|
@ -1618,11 +1618,12 @@ static bool obj_request_type_valid(enum obj_request_type type) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int rbd_obj_request_submit(struct ceph_osd_client *osdc, |
|
|
|
|
struct rbd_obj_request *obj_request) |
|
|
|
|
static void rbd_obj_request_submit(struct rbd_obj_request *obj_request) |
|
|
|
|
{ |
|
|
|
|
dout("%s %p\n", __func__, obj_request); |
|
|
|
|
return ceph_osdc_start_request(osdc, obj_request->osd_req, false); |
|
|
|
|
struct ceph_osd_request *osd_req = obj_request->osd_req; |
|
|
|
|
|
|
|
|
|
dout("%s %p osd_req %p\n", __func__, obj_request, osd_req); |
|
|
|
|
ceph_osdc_start_request(osd_req->r_osdc, osd_req, false); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void rbd_obj_request_end(struct rbd_obj_request *obj_request) |
|
|
|
@ -2646,7 +2647,6 @@ rbd_img_obj_parent_read_full_callback(struct rbd_img_request *img_request) |
|
|
|
|
{ |
|
|
|
|
struct rbd_obj_request *orig_request; |
|
|
|
|
struct ceph_osd_request *osd_req; |
|
|
|
|
struct ceph_osd_client *osdc; |
|
|
|
|
struct rbd_device *rbd_dev; |
|
|
|
|
struct page **pages; |
|
|
|
|
enum obj_operation_type op_type; |
|
|
|
@ -2683,13 +2683,9 @@ rbd_img_obj_parent_read_full_callback(struct rbd_img_request *img_request) |
|
|
|
|
* and re-submit the original write request. |
|
|
|
|
*/ |
|
|
|
|
if (!rbd_dev->parent_overlap) { |
|
|
|
|
struct ceph_osd_client *osdc; |
|
|
|
|
|
|
|
|
|
ceph_release_page_vector(pages, page_count); |
|
|
|
|
osdc = &rbd_dev->rbd_client->client->osdc; |
|
|
|
|
img_result = rbd_obj_request_submit(osdc, orig_request); |
|
|
|
|
if (!img_result) |
|
|
|
|
return; |
|
|
|
|
rbd_obj_request_submit(orig_request); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (img_result) |
|
|
|
@ -2723,10 +2719,9 @@ rbd_img_obj_parent_read_full_callback(struct rbd_img_request *img_request) |
|
|
|
|
|
|
|
|
|
/* All set, send it off. */ |
|
|
|
|
|
|
|
|
|
osdc = &rbd_dev->rbd_client->client->osdc; |
|
|
|
|
img_result = rbd_obj_request_submit(osdc, orig_request); |
|
|
|
|
if (!img_result) |
|
|
|
|
return; |
|
|
|
|
rbd_obj_request_submit(orig_request); |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
out_err: |
|
|
|
|
/* Record the error code and complete the request */ |
|
|
|
|
|
|
|
|
@ -2860,17 +2855,13 @@ static void rbd_img_obj_exists_callback(struct rbd_obj_request *obj_request) |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* If the overlap has become 0 (most likely because the |
|
|
|
|
* image has been flattened) we need to free the pages |
|
|
|
|
* and re-submit the original write request. |
|
|
|
|
* image has been flattened) we need to re-submit the |
|
|
|
|
* original request. |
|
|
|
|
*/ |
|
|
|
|
rbd_dev = orig_request->img_request->rbd_dev; |
|
|
|
|
if (!rbd_dev->parent_overlap) { |
|
|
|
|
struct ceph_osd_client *osdc; |
|
|
|
|
|
|
|
|
|
osdc = &rbd_dev->rbd_client->client->osdc; |
|
|
|
|
result = rbd_obj_request_submit(osdc, orig_request); |
|
|
|
|
if (!result) |
|
|
|
|
return; |
|
|
|
|
rbd_obj_request_submit(orig_request); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -2902,7 +2893,6 @@ static int rbd_img_obj_exists_submit(struct rbd_obj_request *obj_request) |
|
|
|
|
{ |
|
|
|
|
struct rbd_obj_request *stat_request; |
|
|
|
|
struct rbd_device *rbd_dev; |
|
|
|
|
struct ceph_osd_client *osdc; |
|
|
|
|
struct page **pages = NULL; |
|
|
|
|
u32 page_count; |
|
|
|
|
size_t size; |
|
|
|
@ -2946,8 +2936,9 @@ static int rbd_img_obj_exists_submit(struct rbd_obj_request *obj_request) |
|
|
|
|
false, false); |
|
|
|
|
rbd_osd_req_format_read(stat_request); |
|
|
|
|
|
|
|
|
|
osdc = &rbd_dev->rbd_client->client->osdc; |
|
|
|
|
ret = rbd_obj_request_submit(osdc, stat_request); |
|
|
|
|
rbd_obj_request_submit(stat_request); |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
out: |
|
|
|
|
if (ret) |
|
|
|
|
rbd_obj_request_put(obj_request); |
|
|
|
@ -3004,13 +2995,8 @@ static bool img_obj_request_simple(struct rbd_obj_request *obj_request) |
|
|
|
|
static int rbd_img_obj_request_submit(struct rbd_obj_request *obj_request) |
|
|
|
|
{ |
|
|
|
|
if (img_obj_request_simple(obj_request)) { |
|
|
|
|
struct rbd_device *rbd_dev; |
|
|
|
|
struct ceph_osd_client *osdc; |
|
|
|
|
|
|
|
|
|
rbd_dev = obj_request->img_request->rbd_dev; |
|
|
|
|
osdc = &rbd_dev->rbd_client->client->osdc; |
|
|
|
|
|
|
|
|
|
return rbd_obj_request_submit(osdc, obj_request); |
|
|
|
|
rbd_obj_request_submit(obj_request); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -3073,12 +3059,8 @@ static void rbd_img_parent_read_callback(struct rbd_img_request *img_request) |
|
|
|
|
rbd_assert(obj_request->img_request); |
|
|
|
|
rbd_dev = obj_request->img_request->rbd_dev; |
|
|
|
|
if (!rbd_dev->parent_overlap) { |
|
|
|
|
struct ceph_osd_client *osdc; |
|
|
|
|
|
|
|
|
|
osdc = &rbd_dev->rbd_client->client->osdc; |
|
|
|
|
img_result = rbd_obj_request_submit(osdc, obj_request); |
|
|
|
|
if (!img_result) |
|
|
|
|
return; |
|
|
|
|
rbd_obj_request_submit(obj_request); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
obj_request->result = img_result; |
|
|
|
@ -4005,7 +3987,6 @@ static int rbd_obj_method_sync(struct rbd_device *rbd_dev, |
|
|
|
|
void *inbound, |
|
|
|
|
size_t inbound_size) |
|
|
|
|
{ |
|
|
|
|
struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc; |
|
|
|
|
struct rbd_obj_request *obj_request; |
|
|
|
|
struct page **pages; |
|
|
|
|
u32 page_count; |
|
|
|
@ -4056,9 +4037,7 @@ static int rbd_obj_method_sync(struct rbd_device *rbd_dev, |
|
|
|
|
0, false, false); |
|
|
|
|
rbd_osd_req_format_read(obj_request); |
|
|
|
|
|
|
|
|
|
ret = rbd_obj_request_submit(osdc, obj_request); |
|
|
|
|
if (ret) |
|
|
|
|
goto out; |
|
|
|
|
rbd_obj_request_submit(obj_request); |
|
|
|
|
ret = rbd_obj_request_wait(obj_request); |
|
|
|
|
if (ret) |
|
|
|
|
goto out; |
|
|
|
@ -4266,7 +4245,6 @@ static int rbd_obj_read_sync(struct rbd_device *rbd_dev, |
|
|
|
|
u64 offset, u64 length, void *buf) |
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc; |
|
|
|
|
struct rbd_obj_request *obj_request; |
|
|
|
|
struct page **pages = NULL; |
|
|
|
|
u32 page_count; |
|
|
|
@ -4301,9 +4279,7 @@ static int rbd_obj_read_sync(struct rbd_device *rbd_dev, |
|
|
|
|
false, false); |
|
|
|
|
rbd_osd_req_format_read(obj_request); |
|
|
|
|
|
|
|
|
|
ret = rbd_obj_request_submit(osdc, obj_request); |
|
|
|
|
if (ret) |
|
|
|
|
goto out; |
|
|
|
|
rbd_obj_request_submit(obj_request); |
|
|
|
|
ret = rbd_obj_request_wait(obj_request); |
|
|
|
|
if (ret) |
|
|
|
|
goto out; |
|
|
|
|