mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
nbd: Update qapi to support exporting multiple bitmaps
Since 'block-export-add' is new to 5.2, we can still tweak the interface; there, allowing 'bitmaps':['str'] is nicer than 'bitmap':'str'. This wires up the qapi and qemu-nbd changes to permit passing multiple bitmaps as distinct metadata contexts that the NBD client may request, but the actual support for more than one will require a further patch to the server. Note that there are no changes made to the existing deprecated 'nbd-server-add' command; this required splitting the QAPI type BlockExportOptionsNbd, which fortunately does not affect QMP introspection. Signed-off-by: Eric Blake <eblake@redhat.com> Message-Id: <20201027050556.269064-5-eblake@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Reviewed-by: Peter Krempa <pkrempa@redhat.com>
This commit is contained in:
parent
8675cbd68b
commit
cbad81cef8
5 changed files with 58 additions and 29 deletions
19
nbd/server.c
19
nbd/server.c
|
@ -1474,6 +1474,7 @@ static int nbd_export_create(BlockExport *blk_exp, BlockExportOptions *exp_args,
|
|||
uint64_t perm, shared_perm;
|
||||
bool readonly = !exp_args->writable;
|
||||
bool shared = !exp_args->writable;
|
||||
strList *bitmaps;
|
||||
int ret;
|
||||
|
||||
assert(exp_args->type == BLOCK_EXPORT_TYPE_NBD);
|
||||
|
@ -1533,12 +1534,18 @@ static int nbd_export_create(BlockExport *blk_exp, BlockExportOptions *exp_args,
|
|||
}
|
||||
exp->size = QEMU_ALIGN_DOWN(size, BDRV_SECTOR_SIZE);
|
||||
|
||||
if (arg->bitmap) {
|
||||
/* XXX Allow more than one bitmap */
|
||||
if (arg->bitmaps && arg->bitmaps->next) {
|
||||
error_setg(errp, "multiple bitmaps per export not supported yet");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
for (bitmaps = arg->bitmaps; bitmaps; bitmaps = bitmaps->next) {
|
||||
const char *bitmap = bitmaps->value;
|
||||
BlockDriverState *bs = blk_bs(blk);
|
||||
BdrvDirtyBitmap *bm = NULL;
|
||||
|
||||
while (bs) {
|
||||
bm = bdrv_find_dirty_bitmap(bs, arg->bitmap);
|
||||
bm = bdrv_find_dirty_bitmap(bs, bitmap);
|
||||
if (bm != NULL) {
|
||||
break;
|
||||
}
|
||||
|
@ -1548,7 +1555,7 @@ static int nbd_export_create(BlockExport *blk_exp, BlockExportOptions *exp_args,
|
|||
|
||||
if (bm == NULL) {
|
||||
ret = -ENOENT;
|
||||
error_setg(errp, "Bitmap '%s' is not found", arg->bitmap);
|
||||
error_setg(errp, "Bitmap '%s' is not found", bitmap);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
@ -1562,15 +1569,15 @@ static int nbd_export_create(BlockExport *blk_exp, BlockExportOptions *exp_args,
|
|||
ret = -EINVAL;
|
||||
error_setg(errp,
|
||||
"Enabled bitmap '%s' incompatible with readonly export",
|
||||
arg->bitmap);
|
||||
bitmap);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
bdrv_dirty_bitmap_set_busy(bm, true);
|
||||
exp->export_bitmap = bm;
|
||||
assert(strlen(arg->bitmap) <= BDRV_BITMAP_MAX_NAME_SIZE);
|
||||
assert(strlen(bitmap) <= BDRV_BITMAP_MAX_NAME_SIZE);
|
||||
exp->export_bitmap_context = g_strdup_printf("qemu:dirty-bitmap:%s",
|
||||
arg->bitmap);
|
||||
bitmap);
|
||||
assert(strlen(exp->export_bitmap_context) < NBD_MAX_STRING_SIZE);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue