Re: [Qemu-block] [PATCH] block-backend: Preserve AioContext of root across medium change

2016-09-23 Thread Max Reitz
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

2016-09-23 Thread Paolo Bonzini
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

2016-09-23 Thread Fam Zheng
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