Message ID | 20220923125227.300202-3-hreitz@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | blcok: Start/end drain on correct AioContext | expand |
Am 23.09.2022 um 14:52 hat Hanna Reitz geschrieben: > blk_get_aio_context() asserts that blk->ctx is always equal to the root > BDS's context (if there is a root BDS). Therefore, > blk_do_set_aio_context() must update blk->ctx immediately after the root > BDS's context has changed. > > Without this patch, the next patch would break iotest 238, because > bdrv_drained_begin() (called by blk_do_set_aio_context()) may then > invoke bdrv_child_get_parent_aio_context() on the root child, i.e. > blk_get_aio_context(). However, by this point, blk->ctx would not have > been updated and thus differ from the root node's context. This patch > fixes that. > > Signed-off-by: Hanna Reitz <hreitz@redhat.com> > --- > block/block-backend.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/block/block-backend.c b/block/block-backend.c > index d4a5df2ac2..abdb5ff5af 100644 > --- a/block/block-backend.c > +++ b/block/block-backend.c > @@ -2156,6 +2156,7 @@ static int blk_do_set_aio_context(BlockBackend *blk, AioContext *new_context, > return ret; > } > } > + blk->ctx = new_context; > if (tgm->throttle_state) { > bdrv_drained_begin(bs); > throttle_group_detach_aio_context(tgm); > @@ -2164,9 +2165,10 @@ static int blk_do_set_aio_context(BlockBackend *blk, AioContext *new_context, > } > > bdrv_unref(bs); > + } else { > + blk->ctx = new_context; > } > > - blk->ctx = new_context; > return 0; > } Makes sense. Maybe in the first branch a comment wouldn't hurt (like "make blk->ctx consistent with the root node again before any other operations like drain"). Reviewed-by: Kevin Wolf <kwolf@redhat.com>
diff --git a/block/block-backend.c b/block/block-backend.c index d4a5df2ac2..abdb5ff5af 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -2156,6 +2156,7 @@ static int blk_do_set_aio_context(BlockBackend *blk, AioContext *new_context, return ret; } } + blk->ctx = new_context; if (tgm->throttle_state) { bdrv_drained_begin(bs); throttle_group_detach_aio_context(tgm); @@ -2164,9 +2165,10 @@ static int blk_do_set_aio_context(BlockBackend *blk, AioContext *new_context, } bdrv_unref(bs); + } else { + blk->ctx = new_context; } - blk->ctx = new_context; return 0; }
blk_get_aio_context() asserts that blk->ctx is always equal to the root BDS's context (if there is a root BDS). Therefore, blk_do_set_aio_context() must update blk->ctx immediately after the root BDS's context has changed. Without this patch, the next patch would break iotest 238, because bdrv_drained_begin() (called by blk_do_set_aio_context()) may then invoke bdrv_child_get_parent_aio_context() on the root child, i.e. blk_get_aio_context(). However, by this point, blk->ctx would not have been updated and thus differ from the root node's context. This patch fixes that. Signed-off-by: Hanna Reitz <hreitz@redhat.com> --- block/block-backend.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)