Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 375614
b: refs/heads/master
c: 02c74fb
h: refs/heads/master
v: v3
  • Loading branch information
Alex Elder committed May 13, 2013
1 parent 0dbdd4e commit a368984
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 6 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 392a9dad7e777296fe79d97a6b3acd735ad2eb5f
refs/heads/master: 02c74fbad9d4a5149756eb35be7300736e4904e9
30 changes: 25 additions & 5 deletions trunk/drivers/block/rbd.c
Original file line number Diff line number Diff line change
Expand Up @@ -2682,14 +2682,36 @@ static void rbd_img_parent_read_callback(struct rbd_img_request *img_request)
struct rbd_obj_request *obj_request;
struct rbd_device *rbd_dev;
u64 obj_end;
u64 img_xferred;
int img_result;

rbd_assert(img_request_child_test(img_request));

/* First get what we need from the image request and release it */

obj_request = img_request->obj_request;
img_xferred = img_request->xferred;
img_result = img_request->result;
rbd_img_request_put(img_request);

/*
* If the overlap has become 0 (most likely because the
* image has been flattened) we need to re-submit the
* original request.
*/
rbd_assert(obj_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;
}

obj_request->result = img_request->result;
obj_request->result = img_result;
if (obj_request->result)
goto out;

Expand All @@ -2702,20 +2724,18 @@ static void rbd_img_parent_read_callback(struct rbd_img_request *img_request)
*/
rbd_assert(obj_request->img_offset < U64_MAX - obj_request->length);
obj_end = obj_request->img_offset + obj_request->length;
rbd_dev = obj_request->img_request->rbd_dev;
if (obj_end > rbd_dev->parent_overlap) {
u64 xferred = 0;

if (obj_request->img_offset < rbd_dev->parent_overlap)
xferred = rbd_dev->parent_overlap -
obj_request->img_offset;

obj_request->xferred = min(img_request->xferred, xferred);
obj_request->xferred = min(img_xferred, xferred);
} else {
obj_request->xferred = img_request->xferred;
obj_request->xferred = img_xferred;
}
out:
rbd_img_request_put(img_request);
rbd_img_obj_request_read_callback(obj_request);
rbd_obj_request_complete(obj_request);
}
Expand Down

0 comments on commit a368984

Please sign in to comment.