Message ID | 1474628299-27134-1-git-send-email-famz@redhat.com |
---|---|
State | New |
Headers | show |
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-stable@nongnu.org > Signed-off-by: Fam Zheng <famz@redhat.com> > --- > 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
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-stable@nongnu.org > Signed-off-by: Fam Zheng <famz@redhat.com> > --- > 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
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 {
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-stable@nongnu.org Signed-off-by: Fam Zheng <famz@redhat.com> --- block/block-backend.c | 7 +++++++ include/block/block_int.h | 1 + 2 files changed, 8 insertions(+)