diff options
author | Kevin Wolf <kwolf@redhat.com> | 2017-08-15 21:07:38 +0800 |
---|---|---|
committer | Eric Blake <eblake@redhat.com> | 2017-08-15 10:03:27 -0500 |
commit | 3dff24f2dffc5f3aa46dc014122012848bd7959d (patch) | |
tree | aa459063738332e70e97f05802b03cd219913cb1 /nbd | |
parent | 80adf54ecc3b456828f3d6fe71eeda5572369bb2 (diff) | |
download | qemu-3dff24f2dffc5f3aa46dc014122012848bd7959d.zip qemu-3dff24f2dffc5f3aa46dc014122012848bd7959d.tar.gz qemu-3dff24f2dffc5f3aa46dc014122012848bd7959d.tar.bz2 |
nbd: Fix order of bdrv_set_perm and bdrv_invalidate_cache
The "inactive" state of BDS affects whether the permissions can be
granted, we must call bdrv_invalidate_cache before bdrv_set_perm to
support "-incoming defer" case.
Reported-by: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Signed-off-by: Fam Zheng <famz@redhat.com>
Message-Id: <20170815130740.31229-3-famz@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Diffstat (limited to 'nbd')
-rw-r--r-- | nbd/server.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/nbd/server.c b/nbd/server.c index 82a78bf..993ade3 100644 --- a/nbd/server.c +++ b/nbd/server.c @@ -1045,11 +1045,22 @@ NBDExport *nbd_export_new(BlockDriverState *bs, off_t dev_offset, off_t size, bool writethrough, BlockBackend *on_eject_blk, Error **errp) { + AioContext *ctx; BlockBackend *blk; NBDExport *exp = g_malloc0(sizeof(NBDExport)); uint64_t perm; int ret; + /* + * NBD exports are used for non-shared storage migration. Make sure + * that BDRV_O_INACTIVE is cleared and the image is ready for write + * access since the export could be available before migration handover. + */ + ctx = bdrv_get_aio_context(bs); + aio_context_acquire(ctx); + bdrv_invalidate_cache(bs, NULL); + aio_context_release(ctx); + /* Don't allow resize while the NBD server is running, otherwise we don't * care what happens with the node. */ perm = BLK_PERM_CONSISTENT_READ; @@ -1087,15 +1098,6 @@ NBDExport *nbd_export_new(BlockDriverState *bs, off_t dev_offset, off_t size, exp->eject_notifier.notify = nbd_eject_notifier; blk_add_remove_bs_notifier(on_eject_blk, &exp->eject_notifier); } - - /* - * NBD exports are used for non-shared storage migration. Make sure - * that BDRV_O_INACTIVE is cleared and the image is ready for write - * access since the export could be available before migration handover. - */ - aio_context_acquire(exp->ctx); - blk_invalidate_cache(blk, NULL); - aio_context_release(exp->ctx); return exp; fail: |