mirror of https://github.com/xemu-project/xemu.git
block: Pass driver-specific options to .bdrv_refresh_filename()
In order to decide whether a blkdebug: filename can be produced or a json: one is necessary, blkdebug checked whether bs->options had more options than just "config", "x-image" or "image" (the latter including nested options). That doesn't work well when generic block layer options are present. This patch passes an option QDict to the driver that contains only driver-specific options, i.e. the options for the general block layer as well as child nodes are already filtered out. Works much better this way. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Reviewed-by: Alberto Garcia <berto@igalia.com>
This commit is contained in:
parent
260fecf13b
commit
4cdd01d32e
5
block.c
5
block.c
|
@ -4027,7 +4027,10 @@ void bdrv_refresh_filename(BlockDriverState *bs)
|
||||||
bs->full_open_options = NULL;
|
bs->full_open_options = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
drv->bdrv_refresh_filename(bs);
|
opts = qdict_new();
|
||||||
|
append_open_options(opts, bs);
|
||||||
|
drv->bdrv_refresh_filename(bs, opts);
|
||||||
|
QDECREF(opts);
|
||||||
} else if (bs->file) {
|
} else if (bs->file) {
|
||||||
/* Try to reconstruct valid information from the underlying file */
|
/* Try to reconstruct valid information from the underlying file */
|
||||||
bool has_open_options;
|
bool has_open_options;
|
||||||
|
|
|
@ -674,17 +674,15 @@ static int blkdebug_truncate(BlockDriverState *bs, int64_t offset)
|
||||||
return bdrv_truncate(bs->file->bs, offset);
|
return bdrv_truncate(bs->file->bs, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void blkdebug_refresh_filename(BlockDriverState *bs)
|
static void blkdebug_refresh_filename(BlockDriverState *bs, QDict *options)
|
||||||
{
|
{
|
||||||
QDict *opts;
|
QDict *opts;
|
||||||
const QDictEntry *e;
|
const QDictEntry *e;
|
||||||
bool force_json = false;
|
bool force_json = false;
|
||||||
|
|
||||||
for (e = qdict_first(bs->options); e; e = qdict_next(bs->options, e)) {
|
for (e = qdict_first(options); e; e = qdict_next(options, e)) {
|
||||||
if (strcmp(qdict_entry_key(e), "config") &&
|
if (strcmp(qdict_entry_key(e), "config") &&
|
||||||
strcmp(qdict_entry_key(e), "x-image") &&
|
strcmp(qdict_entry_key(e), "x-image"))
|
||||||
strcmp(qdict_entry_key(e), "image") &&
|
|
||||||
strncmp(qdict_entry_key(e), "image.", strlen("image.")))
|
|
||||||
{
|
{
|
||||||
force_json = true;
|
force_json = true;
|
||||||
break;
|
break;
|
||||||
|
@ -700,7 +698,7 @@ static void blkdebug_refresh_filename(BlockDriverState *bs)
|
||||||
if (!force_json && bs->file->bs->exact_filename[0]) {
|
if (!force_json && bs->file->bs->exact_filename[0]) {
|
||||||
snprintf(bs->exact_filename, sizeof(bs->exact_filename),
|
snprintf(bs->exact_filename, sizeof(bs->exact_filename),
|
||||||
"blkdebug:%s:%s",
|
"blkdebug:%s:%s",
|
||||||
qdict_get_try_str(bs->options, "config") ?: "",
|
qdict_get_try_str(options, "config") ?: "",
|
||||||
bs->file->bs->exact_filename);
|
bs->file->bs->exact_filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -710,11 +708,8 @@ static void blkdebug_refresh_filename(BlockDriverState *bs)
|
||||||
QINCREF(bs->file->bs->full_open_options);
|
QINCREF(bs->file->bs->full_open_options);
|
||||||
qdict_put_obj(opts, "image", QOBJECT(bs->file->bs->full_open_options));
|
qdict_put_obj(opts, "image", QOBJECT(bs->file->bs->full_open_options));
|
||||||
|
|
||||||
for (e = qdict_first(bs->options); e; e = qdict_next(bs->options, e)) {
|
for (e = qdict_first(options); e; e = qdict_next(options, e)) {
|
||||||
if (strcmp(qdict_entry_key(e), "x-image") &&
|
if (strcmp(qdict_entry_key(e), "x-image")) {
|
||||||
strcmp(qdict_entry_key(e), "image") &&
|
|
||||||
strncmp(qdict_entry_key(e), "image.", strlen("image.")))
|
|
||||||
{
|
|
||||||
qobject_incref(qdict_entry_value(e));
|
qobject_incref(qdict_entry_value(e));
|
||||||
qdict_put_obj(opts, qdict_entry_key(e), qdict_entry_value(e));
|
qdict_put_obj(opts, qdict_entry_key(e), qdict_entry_value(e));
|
||||||
}
|
}
|
||||||
|
|
|
@ -307,7 +307,7 @@ static void blkverify_attach_aio_context(BlockDriverState *bs,
|
||||||
bdrv_attach_aio_context(s->test_file->bs, new_context);
|
bdrv_attach_aio_context(s->test_file->bs, new_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void blkverify_refresh_filename(BlockDriverState *bs)
|
static void blkverify_refresh_filename(BlockDriverState *bs, QDict *options)
|
||||||
{
|
{
|
||||||
BDRVBlkverifyState *s = bs->opaque;
|
BDRVBlkverifyState *s = bs->opaque;
|
||||||
|
|
||||||
|
|
10
block/nbd.c
10
block/nbd.c
|
@ -342,13 +342,13 @@ static void nbd_attach_aio_context(BlockDriverState *bs,
|
||||||
nbd_client_attach_aio_context(bs, new_context);
|
nbd_client_attach_aio_context(bs, new_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nbd_refresh_filename(BlockDriverState *bs)
|
static void nbd_refresh_filename(BlockDriverState *bs, QDict *options)
|
||||||
{
|
{
|
||||||
QDict *opts = qdict_new();
|
QDict *opts = qdict_new();
|
||||||
const char *path = qdict_get_try_str(bs->options, "path");
|
const char *path = qdict_get_try_str(options, "path");
|
||||||
const char *host = qdict_get_try_str(bs->options, "host");
|
const char *host = qdict_get_try_str(options, "host");
|
||||||
const char *port = qdict_get_try_str(bs->options, "port");
|
const char *port = qdict_get_try_str(options, "port");
|
||||||
const char *export = qdict_get_try_str(bs->options, "export");
|
const char *export = qdict_get_try_str(options, "export");
|
||||||
|
|
||||||
qdict_put_obj(opts, "driver", QOBJECT(qstring_from_str("nbd")));
|
qdict_put_obj(opts, "driver", QOBJECT(qstring_from_str("nbd")));
|
||||||
|
|
||||||
|
|
|
@ -997,7 +997,7 @@ static void quorum_attach_aio_context(BlockDriverState *bs,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void quorum_refresh_filename(BlockDriverState *bs)
|
static void quorum_refresh_filename(BlockDriverState *bs, QDict *options)
|
||||||
{
|
{
|
||||||
BDRVQuorumState *s = bs->opaque;
|
BDRVQuorumState *s = bs->opaque;
|
||||||
QDict *opts;
|
QDict *opts;
|
||||||
|
|
|
@ -136,7 +136,7 @@ struct BlockDriver {
|
||||||
int (*bdrv_set_key)(BlockDriverState *bs, const char *key);
|
int (*bdrv_set_key)(BlockDriverState *bs, const char *key);
|
||||||
int (*bdrv_make_empty)(BlockDriverState *bs);
|
int (*bdrv_make_empty)(BlockDriverState *bs);
|
||||||
|
|
||||||
void (*bdrv_refresh_filename)(BlockDriverState *bs);
|
void (*bdrv_refresh_filename)(BlockDriverState *bs, QDict *options);
|
||||||
|
|
||||||
/* aio */
|
/* aio */
|
||||||
BlockAIOCB *(*bdrv_aio_readv)(BlockDriverState *bs,
|
BlockAIOCB *(*bdrv_aio_readv)(BlockDriverState *bs,
|
||||||
|
|
Loading…
Reference in New Issue