Skip to content

Commit

Permalink
sheepdog: Fix blockdev-add
Browse files Browse the repository at this point in the history
Commit 831acdc "sheepdog: Implement bdrv_parse_filename()" and commit
d282f34 "sheepdog: Support blockdev-add" have different ideas on how
the QemuOpts parameters for the server address are named.  Fix that.
While there, rename BlockdevOptionsSheepdog member addr to server, for
consistency with BlockdevOptionsSsh, BlockdevOptionsGluster,
BlockdevOptionsNbd.

Commit 831acdc's example becomes

    --drive driver=sheepdog,server.type=inet,server.host=fido,server.port=7000,vdi=dolly

instead of

    --drive driver=sheepdog,host=fido,vdi=dolly

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Tested-by: Kashyap Chamarthy <kchamart@redhat.com>
Message-id: 1490895797-29094-10-git-send-email-armbru@redhat.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
  • Loading branch information
Markus Armbruster authored and XanClic committed Apr 3, 2017
1 parent 9445673 commit d1c1368
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 34 deletions.
90 changes: 58 additions & 32 deletions block/sheepdog.c
Expand Up @@ -13,9 +13,11 @@
*/

#include "qemu/osdep.h"
#include "qapi-visit.h"
#include "qapi/error.h"
#include "qapi/qmp/qdict.h"
#include "qapi/qmp/qint.h"
#include "qapi/qobject-input-visitor.h"
#include "qemu/uri.h"
#include "qemu/error-report.h"
#include "qemu/sockets.h"
Expand Down Expand Up @@ -547,6 +549,47 @@ static SocketAddress *sd_socket_address(const char *path,
return addr;
}

static SocketAddress *sd_server_config(QDict *options, Error **errp)
{
QDict *server = NULL;
QObject *crumpled_server = NULL;
Visitor *iv = NULL;
SocketAddressFlat *saddr_flat = NULL;
SocketAddress *saddr = NULL;
Error *local_err = NULL;

qdict_extract_subqdict(options, &server, "server.");

crumpled_server = qdict_crumple(server, errp);
if (!crumpled_server) {
goto done;
}

/*
* FIXME .numeric, .to, .ipv4 or .ipv6 don't work with -drive
* server.type=inet. .to doesn't matter, it's ignored anyway.
* That's because when @options come from -blockdev or
* blockdev_add, members are typed according to the QAPI schema,
* but when they come from -drive, they're all QString. The
* visitor expects the former.
*/
iv = qobject_input_visitor_new(crumpled_server);
visit_type_SocketAddressFlat(iv, NULL, &saddr_flat, &local_err);
if (local_err) {
error_propagate(errp, local_err);
goto done;
}

saddr = socket_address_crumple(saddr_flat);

done:
qapi_free_SocketAddressFlat(saddr_flat);
visit_free(iv);
qobject_decref(crumpled_server);
QDECREF(server);
return saddr;
}

/* Return -EIO in case of error, file descriptor on success */
static int connect_to_sdog(BDRVSheepdogState *s, Error **errp)
{
Expand Down Expand Up @@ -1174,15 +1217,15 @@ static void sd_parse_filename(const char *filename, QDict *options,
return;
}

if (cfg.host) {
qdict_set_default_str(options, "host", cfg.host);
}
if (cfg.port) {
snprintf(buf, sizeof(buf), "%d", cfg.port);
qdict_set_default_str(options, "port", buf);
}
if (cfg.path) {
qdict_set_default_str(options, "path", cfg.path);
qdict_set_default_str(options, "server.path", cfg.path);
qdict_set_default_str(options, "server.type", "unix");
} else {
qdict_set_default_str(options, "server.type", "inet");
qdict_set_default_str(options, "server.host",
cfg.host ?: SD_DEFAULT_ADDR);
snprintf(buf, sizeof(buf), "%d", cfg.port ?: SD_DEFAULT_PORT);
qdict_set_default_str(options, "server.port", buf);
}
qdict_set_default_str(options, "vdi", cfg.vdi);
qdict_set_default_str(options, "tag", cfg.tag);
Expand Down Expand Up @@ -1509,18 +1552,6 @@ static QemuOptsList runtime_opts = {
.name = "sheepdog",
.head = QTAILQ_HEAD_INITIALIZER(runtime_opts.head),
.desc = {
{
.name = "host",
.type = QEMU_OPT_STRING,
},
{
.name = "port",
.type = QEMU_OPT_STRING,
},
{
.name = "path",
.type = QEMU_OPT_STRING,
},
{
.name = "vdi",
.type = QEMU_OPT_STRING,
Expand All @@ -1543,7 +1574,7 @@ static int sd_open(BlockDriverState *bs, QDict *options, int flags,
int ret, fd;
uint32_t vid = 0;
BDRVSheepdogState *s = bs->opaque;
const char *host, *port, *path, *vdi, *snap_id_str, *tag;
const char *vdi, *snap_id_str, *tag;
uint64_t snap_id;
char *buf = NULL;
QemuOpts *opts;
Expand All @@ -1560,20 +1591,17 @@ static int sd_open(BlockDriverState *bs, QDict *options, int flags,
goto err_no_fd;
}

host = qemu_opt_get(opts, "host");
port = qemu_opt_get(opts, "port");
path = qemu_opt_get(opts, "path");
s->addr = sd_server_config(options, errp);
if (!s->addr) {
ret = -EINVAL;
goto err_no_fd;
}

vdi = qemu_opt_get(opts, "vdi");
snap_id_str = qemu_opt_get(opts, "snap-id");
snap_id = qemu_opt_get_number(opts, "snap-id", CURRENT_VDI_ID);
tag = qemu_opt_get(opts, "tag");

if ((host || port) && path) {
error_setg(errp, "can't use 'path' together with 'host' or 'port'");
ret = -EINVAL;
goto err_no_fd;
}

if (!vdi) {
error_setg(errp, "parameter 'vdi' is missing");
ret = -EINVAL;
Expand Down Expand Up @@ -1604,8 +1632,6 @@ static int sd_open(BlockDriverState *bs, QDict *options, int flags,
goto err_no_fd;
}

s->addr = sd_socket_address(path, host, port);

QLIST_INIT(&s->inflight_aio_head);
QLIST_INIT(&s->failed_aio_head);
QLIST_INIT(&s->inflight_aiocb_head);
Expand Down
4 changes: 2 additions & 2 deletions qapi/block-core.json
Expand Up @@ -2623,7 +2623,7 @@
# Driver specific block device options for sheepdog
#
# @vdi: Virtual disk image name
# @addr: The Sheepdog server to connect to
# @server: The Sheepdog server to connect to
# @snap-id: Snapshot ID
# @tag: Snapshot tag name
#
Expand All @@ -2632,7 +2632,7 @@
# Since: 2.9
##
{ 'struct': 'BlockdevOptionsSheepdog',
'data': { 'addr': 'SocketAddressFlat',
'data': { 'server': 'SocketAddressFlat',
'vdi': 'str',
'*snap-id': 'uint32',
'*tag': 'str' } }
Expand Down

0 comments on commit d1c1368

Please sign in to comment.