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>
This commit is contained in:
parent
80adf54ecc
commit
3dff24f2df
20
nbd/server.c
20
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,
|
bool writethrough, BlockBackend *on_eject_blk,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
|
AioContext *ctx;
|
||||||
BlockBackend *blk;
|
BlockBackend *blk;
|
||||||
NBDExport *exp = g_malloc0(sizeof(NBDExport));
|
NBDExport *exp = g_malloc0(sizeof(NBDExport));
|
||||||
uint64_t perm;
|
uint64_t perm;
|
||||||
int ret;
|
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
|
/* Don't allow resize while the NBD server is running, otherwise we don't
|
||||||
* care what happens with the node. */
|
* care what happens with the node. */
|
||||||
perm = BLK_PERM_CONSISTENT_READ;
|
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;
|
exp->eject_notifier.notify = nbd_eject_notifier;
|
||||||
blk_add_remove_bs_notifier(on_eject_blk, &exp->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;
|
return exp;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
|
Loading…
Reference in New Issue