Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c6e84255 authored by Ilya Dryomov's avatar Ilya Dryomov Committed by Greg Kroah-Hartman
Browse files

rbd: move RBD_OBJ_FLAG_COPYUP_ENABLED flag setting



commit 09fe05c57b5aaf23e2c35036c98ea9f282b19a77 upstream.

Move RBD_OBJ_FLAG_COPYUP_ENABLED flag setting into the object request
state machine to allow for the snapshot context to be captured in the
image request state machine rather than in rbd_queue_workfn().

Cc: stable@vger.kernel.org
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
Reviewed-by: default avatarDongsheng Yang <dongsheng.yang@easystack.cn>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 69653f94
Loading
Loading
Loading
Loading
+21 −11
Original line number Diff line number Diff line
@@ -1493,14 +1493,28 @@ static bool rbd_obj_is_tail(struct rbd_obj_request *obj_req)
/*
 * Must be called after rbd_obj_calc_img_extents().
 */
static bool rbd_obj_copyup_enabled(struct rbd_obj_request *obj_req)
static void rbd_obj_set_copyup_enabled(struct rbd_obj_request *obj_req)
{
	if (!obj_req->num_img_extents ||
	    (rbd_obj_is_entire(obj_req) &&
	     !obj_req->img_request->snapc->num_snaps))
		return false;
	if (obj_req->img_request->op_type == OBJ_OP_DISCARD) {
		dout("%s %p objno %llu discard\n", __func__, obj_req,
		     obj_req->ex.oe_objno);
		return;
	}

	return true;
	if (!obj_req->num_img_extents) {
		dout("%s %p objno %llu not overlapping\n", __func__, obj_req,
		     obj_req->ex.oe_objno);
		return;
	}

	if (rbd_obj_is_entire(obj_req) &&
	    !obj_req->img_request->snapc->num_snaps) {
		dout("%s %p objno %llu entire\n", __func__, obj_req,
		     obj_req->ex.oe_objno);
		return;
	}

	obj_req->flags |= RBD_OBJ_FLAG_COPYUP_ENABLED;
}

static u64 rbd_obj_img_extents_bytes(struct rbd_obj_request *obj_req)
@@ -2389,9 +2403,6 @@ static int rbd_obj_init_write(struct rbd_obj_request *obj_req)
	if (ret)
		return ret;

	if (rbd_obj_copyup_enabled(obj_req))
		obj_req->flags |= RBD_OBJ_FLAG_COPYUP_ENABLED;

	obj_req->write_state = RBD_OBJ_WRITE_START;
	return 0;
}
@@ -2497,8 +2508,6 @@ static int rbd_obj_init_zeroout(struct rbd_obj_request *obj_req)
	if (ret)
		return ret;

	if (rbd_obj_copyup_enabled(obj_req))
		obj_req->flags |= RBD_OBJ_FLAG_COPYUP_ENABLED;
	if (!obj_req->num_img_extents) {
		obj_req->flags |= RBD_OBJ_FLAG_NOOP_FOR_NONEXISTENT;
		if (rbd_obj_is_entire(obj_req))
@@ -3439,6 +3448,7 @@ static bool rbd_obj_advance_write(struct rbd_obj_request *obj_req, int *result)
	case RBD_OBJ_WRITE_START:
		rbd_assert(!*result);

		rbd_obj_set_copyup_enabled(obj_req);
		if (rbd_obj_write_is_noop(obj_req))
			return true;