On Wed, May 18, 2016 at 04:24:08PM +0800, Fam Zheng wrote: > If the BDS is attached, it will want to stay on the AioContext where its > BlockBackend is. Don't call bdrv_set_aio_context in this case.
What should the user do when they hit this error? > Signed-off-by: Fam Zheng <f...@redhat.com> > --- > blockdev.c | 12 +++++++++++- > 1 file changed, 11 insertions(+), 1 deletion(-) > > diff --git a/blockdev.c b/blockdev.c > index 1892b8e..eb15593 100644 > --- a/blockdev.c > +++ b/blockdev.c > @@ -3376,8 +3376,18 @@ void do_blockdev_backup(const char *device, const char > *target, > } > target_bs = blk_bs(target_blk); > > + if (bdrv_get_aio_context(target_bs) != aio_context) { > + if (!target_bs->blk) { > + /* The target BDS is not attached, we can safely move it to > another > + * AioContext. */ > + bdrv_set_aio_context(target_bs, aio_context); > + } else { > + error_setg(errp, "Target is attached to a different thread from " > + "source."); > + goto out; > + } > + } > bdrv_ref(target_bs); > - bdrv_set_aio_context(target_bs, aio_context); > backup_start(bs, target_bs, speed, sync, NULL, on_source_error, > on_target_error, block_job_cb, bs, txn, &local_err); > if (local_err != NULL) { > -- > 2.8.2 >
signature.asc
Description: PGP signature