nbd: Merge nbd_export_new() and nbd_export_create()
There is no real reason any more why nbd_export_new() and nbd_export_create() should be separate functions. The latter only performs a few checks before it calls the former. What makes the current state stand out is that it's the only function in BlockExportDriver that is not a static function inside nbd/server.c, but a small wrapper in blockdev-nbd.c that then calls back into nbd/server.c for the real functionality. Move all the checks to nbd/server.c and make the resulting function static to improve readability. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Message-Id: <20200924152717.287415-27-kwolf@redhat.com> Acked-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
30dbc81d31
commit
5b1cb49704
@ -37,6 +37,11 @@ void nbd_server_is_qemu_nbd(bool value)
|
||||
is_qemu_nbd = value;
|
||||
}
|
||||
|
||||
bool nbd_server_is_running(void)
|
||||
{
|
||||
return nbd_server || is_qemu_nbd;
|
||||
}
|
||||
|
||||
static void nbd_blockdev_client_closed(NBDClient *client, bool ignored)
|
||||
{
|
||||
nbd_client_put(client);
|
||||
@ -173,41 +178,6 @@ void qmp_nbd_server_start(SocketAddressLegacy *addr,
|
||||
qapi_free_SocketAddress(addr_flat);
|
||||
}
|
||||
|
||||
int nbd_export_create(BlockExport *exp, BlockExportOptions *exp_args,
|
||||
Error **errp)
|
||||
{
|
||||
BlockExportOptionsNbd *arg = &exp_args->u.nbd;
|
||||
|
||||
assert(exp_args->type == BLOCK_EXPORT_TYPE_NBD);
|
||||
|
||||
if (!nbd_server && !is_qemu_nbd) {
|
||||
error_setg(errp, "NBD server not running");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!arg->has_name) {
|
||||
arg->name = exp_args->node_name;
|
||||
}
|
||||
|
||||
if (strlen(arg->name) > NBD_MAX_STRING_SIZE) {
|
||||
error_setg(errp, "export name '%s' too long", arg->name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (arg->description && strlen(arg->description) > NBD_MAX_STRING_SIZE) {
|
||||
error_setg(errp, "description '%s' too long", arg->description);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (nbd_export_find(arg->name)) {
|
||||
error_setg(errp, "NBD server already has export named '%s'", arg->name);
|
||||
return -EEXIST;
|
||||
}
|
||||
|
||||
return nbd_export_new(exp, arg->name, arg->description, arg->bitmap,
|
||||
!exp_args->writable, !exp_args->writable, errp);
|
||||
}
|
||||
|
||||
void qmp_nbd_server_add(NbdServerAddOptions *arg, Error **errp)
|
||||
{
|
||||
BlockExport *export;
|
||||
|
@ -330,12 +330,6 @@ int nbd_errno_to_system_errno(int err);
|
||||
typedef struct NBDExport NBDExport;
|
||||
typedef struct NBDClient NBDClient;
|
||||
|
||||
int nbd_export_create(BlockExport *exp, BlockExportOptions *exp_args,
|
||||
Error **errp);
|
||||
int nbd_export_new(BlockExport *blk_exp,
|
||||
const char *name, const char *desc,
|
||||
const char *bitmap, bool readonly, bool shared,
|
||||
Error **errp);
|
||||
void nbd_export_set_on_eject_blk(BlockExport *exp, BlockBackend *blk);
|
||||
|
||||
AioContext *nbd_export_aio_context(NBDExport *exp);
|
||||
@ -349,6 +343,7 @@ void nbd_client_get(NBDClient *client);
|
||||
void nbd_client_put(NBDClient *client);
|
||||
|
||||
void nbd_server_is_qemu_nbd(bool value);
|
||||
bool nbd_server_is_running(void);
|
||||
void nbd_server_start(SocketAddress *addr, const char *tls_creds,
|
||||
const char *tls_authz, uint32_t max_connections,
|
||||
Error **errp);
|
||||
|
54
nbd/server.c
54
nbd/server.c
@ -1507,17 +1507,44 @@ void nbd_export_set_on_eject_blk(BlockExport *exp, BlockBackend *blk)
|
||||
blk_add_remove_bs_notifier(blk, &nbd_exp->eject_notifier);
|
||||
}
|
||||
|
||||
int nbd_export_new(BlockExport *blk_exp,
|
||||
const char *name, const char *desc,
|
||||
const char *bitmap, bool readonly, bool shared,
|
||||
Error **errp)
|
||||
static int nbd_export_create(BlockExport *blk_exp, BlockExportOptions *exp_args,
|
||||
Error **errp)
|
||||
{
|
||||
NBDExport *exp = container_of(blk_exp, NBDExport, common);
|
||||
BlockExportOptionsNbd *arg = &exp_args->u.nbd;
|
||||
BlockBackend *blk = blk_exp->blk;
|
||||
int64_t size;
|
||||
uint64_t perm, shared_perm;
|
||||
bool readonly = !exp_args->writable;
|
||||
bool shared = !exp_args->writable;
|
||||
int ret;
|
||||
|
||||
assert(exp_args->type == BLOCK_EXPORT_TYPE_NBD);
|
||||
|
||||
if (!nbd_server_is_running()) {
|
||||
error_setg(errp, "NBD server not running");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!arg->has_name) {
|
||||
arg->name = exp_args->node_name;
|
||||
}
|
||||
|
||||
if (strlen(arg->name) > NBD_MAX_STRING_SIZE) {
|
||||
error_setg(errp, "export name '%s' too long", arg->name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (arg->description && strlen(arg->description) > NBD_MAX_STRING_SIZE) {
|
||||
error_setg(errp, "description '%s' too long", arg->description);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (nbd_export_find(arg->name)) {
|
||||
error_setg(errp, "NBD server already has export named '%s'", arg->name);
|
||||
return -EEXIST;
|
||||
}
|
||||
|
||||
size = blk_getlength(blk);
|
||||
if (size < 0) {
|
||||
error_setg_errno(errp, -size,
|
||||
@ -1525,8 +1552,6 @@ int nbd_export_new(BlockExport *blk_exp,
|
||||
return size;
|
||||
}
|
||||
|
||||
assert(name && strlen(name) <= NBD_MAX_STRING_SIZE);
|
||||
|
||||
/* Don't allow resize while the NBD server is running, otherwise we don't
|
||||
* care what happens with the node. */
|
||||
blk_get_perm(blk, &perm, &shared_perm);
|
||||
@ -1538,9 +1563,8 @@ int nbd_export_new(BlockExport *blk_exp,
|
||||
blk_set_allow_aio_context_change(blk, true);
|
||||
|
||||
QTAILQ_INIT(&exp->clients);
|
||||
exp->name = g_strdup(name);
|
||||
assert(!desc || strlen(desc) <= NBD_MAX_STRING_SIZE);
|
||||
exp->description = g_strdup(desc);
|
||||
exp->name = g_strdup(arg->name);
|
||||
exp->description = g_strdup(arg->description);
|
||||
exp->nbdflags = (NBD_FLAG_HAS_FLAGS | NBD_FLAG_SEND_FLUSH |
|
||||
NBD_FLAG_SEND_FUA | NBD_FLAG_SEND_CACHE);
|
||||
if (readonly) {
|
||||
@ -1554,12 +1578,12 @@ int nbd_export_new(BlockExport *blk_exp,
|
||||
}
|
||||
exp->size = QEMU_ALIGN_DOWN(size, BDRV_SECTOR_SIZE);
|
||||
|
||||
if (bitmap) {
|
||||
if (arg->bitmap) {
|
||||
BlockDriverState *bs = blk_bs(blk);
|
||||
BdrvDirtyBitmap *bm = NULL;
|
||||
|
||||
while (bs) {
|
||||
bm = bdrv_find_dirty_bitmap(bs, bitmap);
|
||||
bm = bdrv_find_dirty_bitmap(bs, arg->bitmap);
|
||||
if (bm != NULL) {
|
||||
break;
|
||||
}
|
||||
@ -1569,7 +1593,7 @@ int nbd_export_new(BlockExport *blk_exp,
|
||||
|
||||
if (bm == NULL) {
|
||||
ret = -ENOENT;
|
||||
error_setg(errp, "Bitmap '%s' is not found", bitmap);
|
||||
error_setg(errp, "Bitmap '%s' is not found", arg->bitmap);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@ -1583,15 +1607,15 @@ int nbd_export_new(BlockExport *blk_exp,
|
||||
ret = -EINVAL;
|
||||
error_setg(errp,
|
||||
"Enabled bitmap '%s' incompatible with readonly export",
|
||||
bitmap);
|
||||
arg->bitmap);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
bdrv_dirty_bitmap_set_busy(bm, true);
|
||||
exp->export_bitmap = bm;
|
||||
assert(strlen(bitmap) <= BDRV_BITMAP_MAX_NAME_SIZE);
|
||||
assert(strlen(arg->bitmap) <= BDRV_BITMAP_MAX_NAME_SIZE);
|
||||
exp->export_bitmap_context = g_strdup_printf("qemu:dirty-bitmap:%s",
|
||||
bitmap);
|
||||
arg->bitmap);
|
||||
assert(strlen(exp->export_bitmap_context) < NBD_MAX_STRING_SIZE);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user