|
@@ -1431,6 +1431,14 @@ static bool obj_request_exists_test(struct rbd_obj_request *obj_request)
|
|
|
return test_bit(OBJ_REQ_EXISTS, &obj_request->flags) != 0;
|
|
|
}
|
|
|
|
|
|
+static bool obj_request_overlaps_parent(struct rbd_obj_request *obj_request)
|
|
|
+{
|
|
|
+ struct rbd_device *rbd_dev = obj_request->img_request->rbd_dev;
|
|
|
+
|
|
|
+ return obj_request->img_offset <
|
|
|
+ round_up(rbd_dev->parent_overlap, rbd_obj_bytes(&rbd_dev->header));
|
|
|
+}
|
|
|
+
|
|
|
static void rbd_obj_request_get(struct rbd_obj_request *obj_request)
|
|
|
{
|
|
|
dout("%s: obj %p (was %d)\n", __func__, obj_request,
|
|
@@ -2748,7 +2756,7 @@ static int rbd_img_obj_request_submit(struct rbd_obj_request *obj_request)
|
|
|
*/
|
|
|
if (!img_request_write_test(img_request) ||
|
|
|
!img_request_layered_test(img_request) ||
|
|
|
- rbd_dev->parent_overlap <= obj_request->img_offset ||
|
|
|
+ !obj_request_overlaps_parent(obj_request) ||
|
|
|
((known = obj_request_known_test(obj_request)) &&
|
|
|
obj_request_exists_test(obj_request))) {
|
|
|
|