diff mbox series

[1/2] rbd: move RBD_OBJ_FLAG_COPYUP_ENABLED flag setting

Message ID 20230605202715.968962-2-idryomov@gmail.com (mailing list archive)
State New, archived
Headers show
Series rbd: avoid fast-diff corruption in snapshot-based mirroring | expand

Commit Message

Ilya Dryomov June 5, 2023, 8:27 p.m. UTC
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: Ilya Dryomov <idryomov@gmail.com>
---
 drivers/block/rbd.c | 32 +++++++++++++++++++++-----------
 1 file changed, 21 insertions(+), 11 deletions(-)

Comments

Dongsheng Yang June 6, 2023, 2:34 a.m. UTC | #1
在 2023/6/6 星期二 上午 4:27, Ilya Dryomov 写道:
> 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: Ilya Dryomov <idryomov@gmail.com>

Reviewed-by: Dongsheng Yang dongsheng.yang@easystack.cn
> ---
>   drivers/block/rbd.c | 32 +++++++++++++++++++++-----------
>   1 file changed, 21 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
> index 84ad3b17956f..6c847db6ee2c 100644
> --- a/drivers/block/rbd.c
> +++ b/drivers/block/rbd.c
> @@ -1334,14 +1334,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)
> @@ -2233,9 +2247,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;
>   }
> @@ -2341,8 +2352,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))
> @@ -3286,6 +3295,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;
>   
>
diff mbox series

Patch

diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 84ad3b17956f..6c847db6ee2c 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -1334,14 +1334,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)
@@ -2233,9 +2247,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;
 }
@@ -2341,8 +2352,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))
@@ -3286,6 +3295,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;