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 |
在 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 --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;
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(-)