Re: [Qemu-block] [PATCH] block-backend: Preserve AioContext of root across medium change
On 23.09.2016 12:58, Fam Zheng wrote: > This is nop for non-dataplane case, but it prevents crash > (virtio_scsi_ctx_check assertion failure) when a scsi-cd change > operation happens on a virtio-scsi dataplane device. > > Cc: qemu-sta...@nongnu.org > Signed-off-by: Fam Zheng> --- > block/block-backend.c | 7 +++ > include/block/block_int.h | 1 + > 2 files changed, 8 insertions(+) > > diff --git a/block/block-backend.c b/block/block-backend.c > index d1349d9..c2cae9a 100644 > --- a/block/block-backend.c > +++ b/block/block-backend.c > @@ -1570,6 +1570,7 @@ void blk_update_root_state(BlockBackend *blk) > blk->root_state.open_flags= blk->root->bs->open_flags; > blk->root_state.read_only = blk->root->bs->read_only; > blk->root_state.detect_zeroes = blk->root->bs->detect_zeroes; > +blk->root_state.aio_context = blk->root->bs->aio_context; > } > > /* > @@ -1579,7 +1580,13 @@ void blk_update_root_state(BlockBackend *blk) > */ > void blk_apply_root_state(BlockBackend *blk, BlockDriverState *bs) > { > +AioContext *ctx = blk->root_state.aio_context; > bs->detect_zeroes = blk->root_state.detect_zeroes; > +if (ctx && ctx != qemu_get_aio_context()) { > +aio_context_acquire(ctx); > +bdrv_set_aio_context(bs, ctx); > +aio_context_release(ctx); > +} > } > > /* > diff --git a/include/block/block_int.h b/include/block/block_int.h > index ef3c047..23c64d2 100644 > --- a/include/block/block_int.h > +++ b/include/block/block_int.h > @@ -534,6 +534,7 @@ struct BlockBackendRootState { > int open_flags; > bool read_only; > BlockdevDetectZeroesOptions detect_zeroes; > +AioContext *aio_context; > }; > > typedef enum BlockMirrorBackingMode { The issue with using the BBRS is that it won't work with x-blockdev-{insert,remove}-medium. Instead, I think the AioContext should just be stored in the BB, for which Stefan sent an RFC back in April: http://lists.nongnu.org/archive/html/qemu-devel/2016-04/msg01844.html Max signature.asc Description: OpenPGP digital signature
Re: [Qemu-block] [PATCH] block-backend: Preserve AioContext of root across medium change
On 23/09/2016 12:58, Fam Zheng wrote: > This is nop for non-dataplane case, but it prevents crash > (virtio_scsi_ctx_check assertion failure) when a scsi-cd change > operation happens on a virtio-scsi dataplane device. > > Cc: qemu-sta...@nongnu.org > Signed-off-by: Fam Zheng> --- > block/block-backend.c | 7 +++ > include/block/block_int.h | 1 + > 2 files changed, 8 insertions(+) > > diff --git a/block/block-backend.c b/block/block-backend.c > index d1349d9..c2cae9a 100644 > --- a/block/block-backend.c > +++ b/block/block-backend.c > @@ -1570,6 +1570,7 @@ void blk_update_root_state(BlockBackend *blk) > blk->root_state.open_flags= blk->root->bs->open_flags; > blk->root_state.read_only = blk->root->bs->read_only; > blk->root_state.detect_zeroes = blk->root->bs->detect_zeroes; > +blk->root_state.aio_context = blk->root->bs->aio_context; > } > > /* > @@ -1579,7 +1580,13 @@ void blk_update_root_state(BlockBackend *blk) > */ > void blk_apply_root_state(BlockBackend *blk, BlockDriverState *bs) > { > +AioContext *ctx = blk->root_state.aio_context; > bs->detect_zeroes = blk->root_state.detect_zeroes; > +if (ctx && ctx != qemu_get_aio_context()) { > +aio_context_acquire(ctx); > +bdrv_set_aio_context(bs, ctx); > +aio_context_release(ctx); > +} > } > > /* > diff --git a/include/block/block_int.h b/include/block/block_int.h > index ef3c047..23c64d2 100644 > --- a/include/block/block_int.h > +++ b/include/block/block_int.h > @@ -534,6 +534,7 @@ struct BlockBackendRootState { > int open_flags; > bool read_only; > BlockdevDetectZeroesOptions detect_zeroes; > +AioContext *aio_context; > }; > > typedef enum BlockMirrorBackingMode { > Looks good. I look forward to when we can drop bdrv_set_aio_context altogether... It's only 70 patches away! :) Paolo
[Qemu-block] [PATCH] block-backend: Preserve AioContext of root across medium change
This is nop for non-dataplane case, but it prevents crash (virtio_scsi_ctx_check assertion failure) when a scsi-cd change operation happens on a virtio-scsi dataplane device. Cc: qemu-sta...@nongnu.org Signed-off-by: Fam Zheng--- block/block-backend.c | 7 +++ include/block/block_int.h | 1 + 2 files changed, 8 insertions(+) diff --git a/block/block-backend.c b/block/block-backend.c index d1349d9..c2cae9a 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -1570,6 +1570,7 @@ void blk_update_root_state(BlockBackend *blk) blk->root_state.open_flags= blk->root->bs->open_flags; blk->root_state.read_only = blk->root->bs->read_only; blk->root_state.detect_zeroes = blk->root->bs->detect_zeroes; +blk->root_state.aio_context = blk->root->bs->aio_context; } /* @@ -1579,7 +1580,13 @@ void blk_update_root_state(BlockBackend *blk) */ void blk_apply_root_state(BlockBackend *blk, BlockDriverState *bs) { +AioContext *ctx = blk->root_state.aio_context; bs->detect_zeroes = blk->root_state.detect_zeroes; +if (ctx && ctx != qemu_get_aio_context()) { +aio_context_acquire(ctx); +bdrv_set_aio_context(bs, ctx); +aio_context_release(ctx); +} } /* diff --git a/include/block/block_int.h b/include/block/block_int.h index ef3c047..23c64d2 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -534,6 +534,7 @@ struct BlockBackendRootState { int open_flags; bool read_only; BlockdevDetectZeroesOptions detect_zeroes; +AioContext *aio_context; }; typedef enum BlockMirrorBackingMode { -- 2.7.4