Skip to content

Commit af91062

Browse files
Markus Armbrusterkevmw
Markus Armbruster
authored andcommitted
block: Factor out qobject_input_visitor_new_flat_confused()
Signed-off-by: Markus Armbruster <[email protected]> Reviewed-by: Kevin Wolf <[email protected]> Signed-off-by: Kevin Wolf <[email protected]>
1 parent 92adf9d commit af91062

File tree

13 files changed

+53
-62
lines changed

13 files changed

+53
-62
lines changed

block/nbd.c

+2-5
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,6 @@ static SocketAddress *nbd_config(BDRVNBDState *s, QDict *options,
263263
{
264264
SocketAddress *saddr = NULL;
265265
QDict *addr = NULL;
266-
QObject *crumpled_addr = NULL;
267266
Visitor *iv = NULL;
268267
Error *local_err = NULL;
269268

@@ -273,12 +272,11 @@ static SocketAddress *nbd_config(BDRVNBDState *s, QDict *options,
273272
goto done;
274273
}
275274

276-
crumpled_addr = qdict_crumple_for_keyval_qiv(addr, errp);
277-
if (!crumpled_addr) {
275+
iv = qobject_input_visitor_new_flat_confused(addr, errp);
276+
if (!iv) {
278277
goto done;
279278
}
280279

281-
iv = qobject_input_visitor_new_keyval(crumpled_addr);
282280
visit_type_SocketAddress(iv, NULL, &saddr, &local_err);
283281
if (local_err) {
284282
error_propagate(errp, local_err);
@@ -287,7 +285,6 @@ static SocketAddress *nbd_config(BDRVNBDState *s, QDict *options,
287285

288286
done:
289287
qobject_unref(addr);
290-
qobject_unref(crumpled_addr);
291288
visit_free(iv);
292289
return saddr;
293290
}

block/nfs.c

+2-5
Original file line numberDiff line numberDiff line change
@@ -556,20 +556,17 @@ static BlockdevOptionsNfs *nfs_options_qdict_to_qapi(QDict *options,
556556
Error **errp)
557557
{
558558
BlockdevOptionsNfs *opts = NULL;
559-
QObject *crumpled = NULL;
560559
Visitor *v;
561560
const QDictEntry *e;
562561
Error *local_err = NULL;
563562

564-
crumpled = qdict_crumple_for_keyval_qiv(options, errp);
565-
if (crumpled == NULL) {
563+
v = qobject_input_visitor_new_flat_confused(options, errp);
564+
if (!v) {
566565
return NULL;
567566
}
568567

569-
v = qobject_input_visitor_new_keyval(crumpled);
570568
visit_type_BlockdevOptionsNfs(v, NULL, &opts, &local_err);
571569
visit_free(v);
572-
qobject_unref(crumpled);
573570

574571
if (local_err) {
575572
error_propagate(errp, local_err);

block/parallels.c

+2-5
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,6 @@ static int coroutine_fn parallels_co_create_opts(const char *filename,
617617
Error *local_err = NULL;
618618
BlockDriverState *bs = NULL;
619619
QDict *qdict;
620-
QObject *qobj;
621620
Visitor *v;
622621
int ret;
623622

@@ -653,14 +652,12 @@ static int coroutine_fn parallels_co_create_opts(const char *filename,
653652
qdict_put_str(qdict, "driver", "parallels");
654653
qdict_put_str(qdict, "file", bs->node_name);
655654

656-
qobj = qdict_crumple_for_keyval_qiv(qdict, errp);
657-
if (!qobj) {
655+
v = qobject_input_visitor_new_flat_confused(qdict, errp);
656+
if (!v) {
658657
ret = -EINVAL;
659658
goto done;
660659
}
661660

662-
v = qobject_input_visitor_new_keyval(qobj);
663-
qobject_unref(qobj);
664661
visit_type_BlockdevCreateOptions(v, NULL, &create_options, &local_err);
665662
visit_free(v);
666663

block/qcow.c

+2-5
Original file line numberDiff line numberDiff line change
@@ -947,7 +947,6 @@ static int coroutine_fn qcow_co_create_opts(const char *filename,
947947
BlockdevCreateOptions *create_options = NULL;
948948
BlockDriverState *bs = NULL;
949949
QDict *qdict;
950-
QObject *qobj;
951950
Visitor *v;
952951
const char *val;
953952
Error *local_err = NULL;
@@ -997,14 +996,12 @@ static int coroutine_fn qcow_co_create_opts(const char *filename,
997996
qdict_put_str(qdict, "driver", "qcow");
998997
qdict_put_str(qdict, "file", bs->node_name);
999998

1000-
qobj = qdict_crumple_for_keyval_qiv(qdict, errp);
1001-
if (!qobj) {
999+
v = qobject_input_visitor_new_flat_confused(qdict, errp);
1000+
if (!v) {
10021001
ret = -EINVAL;
10031002
goto fail;
10041003
}
10051004

1006-
v = qobject_input_visitor_new_keyval(qobj);
1007-
qobject_unref(qobj);
10081005
visit_type_BlockdevCreateOptions(v, NULL, &create_options, &local_err);
10091006
visit_free(v);
10101007

block/qcow2.c

+2-5
Original file line numberDiff line numberDiff line change
@@ -3081,7 +3081,6 @@ static int coroutine_fn qcow2_co_create_opts(const char *filename, QemuOpts *opt
30813081
{
30823082
BlockdevCreateOptions *create_options = NULL;
30833083
QDict *qdict;
3084-
QObject *qobj;
30853084
Visitor *v;
30863085
BlockDriverState *bs = NULL;
30873086
Error *local_err = NULL;
@@ -3152,14 +3151,12 @@ static int coroutine_fn qcow2_co_create_opts(const char *filename, QemuOpts *opt
31523151
qdict_put_str(qdict, "file", bs->node_name);
31533152

31543153
/* Now get the QAPI type BlockdevCreateOptions */
3155-
qobj = qdict_crumple_for_keyval_qiv(qdict, errp);
3156-
if (!qobj) {
3154+
v = qobject_input_visitor_new_flat_confused(qdict, errp);
3155+
if (!v) {
31573156
ret = -EINVAL;
31583157
goto finish;
31593158
}
31603159

3161-
v = qobject_input_visitor_new_keyval(qobj);
3162-
qobject_unref(qobj);
31633160
visit_type_BlockdevCreateOptions(v, NULL, &create_options, &local_err);
31643161
visit_free(v);
31653162

block/qed.c

+2-5
Original file line numberDiff line numberDiff line change
@@ -723,7 +723,6 @@ static int coroutine_fn bdrv_qed_co_create_opts(const char *filename,
723723
{
724724
BlockdevCreateOptions *create_options = NULL;
725725
QDict *qdict;
726-
QObject *qobj;
727726
Visitor *v;
728727
BlockDriverState *bs = NULL;
729728
Error *local_err = NULL;
@@ -763,14 +762,12 @@ static int coroutine_fn bdrv_qed_co_create_opts(const char *filename,
763762
qdict_put_str(qdict, "driver", "qed");
764763
qdict_put_str(qdict, "file", bs->node_name);
765764

766-
qobj = qdict_crumple_for_keyval_qiv(qdict, errp);
767-
if (!qobj) {
765+
v = qobject_input_visitor_new_flat_confused(qdict, errp);
766+
if (!v) {
768767
ret = -EINVAL;
769768
goto fail;
770769
}
771770

772-
v = qobject_input_visitor_new_keyval(qobj);
773-
qobject_unref(qobj);
774771
visit_type_BlockdevCreateOptions(v, NULL, &create_options, &local_err);
775772
visit_free(v);
776773

block/rbd.c

+2-5
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,6 @@ static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags,
630630
BDRVRBDState *s = bs->opaque;
631631
BlockdevOptionsRbd *opts = NULL;
632632
Visitor *v;
633-
QObject *crumpled = NULL;
634633
const QDictEntry *e;
635634
Error *local_err = NULL;
636635
char *keypairs, *secretid;
@@ -647,16 +646,14 @@ static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags,
647646
}
648647

649648
/* Convert the remaining options into a QAPI object */
650-
crumpled = qdict_crumple_for_keyval_qiv(options, errp);
651-
if (crumpled == NULL) {
649+
v = qobject_input_visitor_new_flat_confused(options, errp);
650+
if (!v) {
652651
r = -EINVAL;
653652
goto out;
654653
}
655654

656-
v = qobject_input_visitor_new_keyval(crumpled);
657655
visit_type_BlockdevOptionsRbd(v, NULL, &opts, &local_err);
658656
visit_free(v);
659-
qobject_unref(crumpled);
660657

661658
if (local_err) {
662659
error_propagate(errp, local_err);

block/sheepdog.c

+4-10
Original file line numberDiff line numberDiff line change
@@ -539,19 +539,17 @@ static void sd_aio_setup(SheepdogAIOCB *acb, BDRVSheepdogState *s,
539539
static SocketAddress *sd_server_config(QDict *options, Error **errp)
540540
{
541541
QDict *server = NULL;
542-
QObject *crumpled_server = NULL;
543542
Visitor *iv = NULL;
544543
SocketAddress *saddr = NULL;
545544
Error *local_err = NULL;
546545

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

549-
crumpled_server = qdict_crumple_for_keyval_qiv(server, errp);
550-
if (!crumpled_server) {
548+
iv = qobject_input_visitor_new_flat_confused(server, errp);
549+
if (!iv) {
551550
goto done;
552551
}
553552

554-
iv = qobject_input_visitor_new_keyval(crumpled_server);
555553
visit_type_SocketAddress(iv, NULL, &saddr, &local_err);
556554
if (local_err) {
557555
error_propagate(errp, local_err);
@@ -560,7 +558,6 @@ static SocketAddress *sd_server_config(QDict *options, Error **errp)
560558

561559
done:
562560
visit_free(iv);
563-
qobject_unref(crumpled_server);
564561
qobject_unref(server);
565562
return saddr;
566563
}
@@ -2173,7 +2170,6 @@ static int coroutine_fn sd_co_create_opts(const char *filename, QemuOpts *opts,
21732170
{
21742171
BlockdevCreateOptions *create_options = NULL;
21752172
QDict *qdict, *location_qdict;
2176-
QObject *crumpled;
21772173
Visitor *v;
21782174
char *redundancy;
21792175
Error *local_err = NULL;
@@ -2209,16 +2205,14 @@ static int coroutine_fn sd_co_create_opts(const char *filename, QemuOpts *opts,
22092205
}
22102206

22112207
/* Get the QAPI object */
2212-
crumpled = qdict_crumple_for_keyval_qiv(qdict, errp);
2213-
if (crumpled == NULL) {
2208+
v = qobject_input_visitor_new_flat_confused(qdict, errp);
2209+
if (!v) {
22142210
ret = -EINVAL;
22152211
goto fail;
22162212
}
22172213

2218-
v = qobject_input_visitor_new_keyval(crumpled);
22192214
visit_type_BlockdevCreateOptions(v, NULL, &create_options, &local_err);
22202215
visit_free(v);
2221-
qobject_unref(crumpled);
22222216

22232217
if (local_err) {
22242218
error_propagate(errp, local_err);

block/ssh.c

+2-5
Original file line numberDiff line numberDiff line change
@@ -606,7 +606,6 @@ static BlockdevOptionsSsh *ssh_parse_options(QDict *options, Error **errp)
606606
BlockdevOptionsSsh *result = NULL;
607607
QemuOpts *opts = NULL;
608608
Error *local_err = NULL;
609-
QObject *crumpled;
610609
const QDictEntry *e;
611610
Visitor *v;
612611

@@ -623,15 +622,13 @@ static BlockdevOptionsSsh *ssh_parse_options(QDict *options, Error **errp)
623622
}
624623

625624
/* Create the QAPI object */
626-
crumpled = qdict_crumple_for_keyval_qiv(options, errp);
627-
if (crumpled == NULL) {
625+
v = qobject_input_visitor_new_flat_confused(options, errp);
626+
if (!v) {
628627
goto fail;
629628
}
630629

631-
v = qobject_input_visitor_new_keyval(crumpled);
632630
visit_type_BlockdevOptionsSsh(v, NULL, &result, &local_err);
633631
visit_free(v);
634-
qobject_unref(crumpled);
635632

636633
if (local_err) {
637634
error_propagate(errp, local_err);

block/vhdx.c

+2-5
Original file line numberDiff line numberDiff line change
@@ -1966,7 +1966,6 @@ static int coroutine_fn vhdx_co_create_opts(const char *filename,
19661966
{
19671967
BlockdevCreateOptions *create_options = NULL;
19681968
QDict *qdict;
1969-
QObject *qobj;
19701969
Visitor *v;
19711970
BlockDriverState *bs = NULL;
19721971
Error *local_err = NULL;
@@ -2005,14 +2004,12 @@ static int coroutine_fn vhdx_co_create_opts(const char *filename,
20052004
qdict_put_str(qdict, "driver", "vhdx");
20062005
qdict_put_str(qdict, "file", bs->node_name);
20072006

2008-
qobj = qdict_crumple_for_keyval_qiv(qdict, errp);
2009-
if (!qobj) {
2007+
v = qobject_input_visitor_new_flat_confused(qdict, errp);
2008+
if (!v) {
20102009
ret = -EINVAL;
20112010
goto fail;
20122011
}
20132012

2014-
v = qobject_input_visitor_new_keyval(qobj);
2015-
qobject_unref(qobj);
20162013
visit_type_BlockdevCreateOptions(v, NULL, &create_options, &local_err);
20172014
visit_free(v);
20182015

block/vpc.c

+2-5
Original file line numberDiff line numberDiff line change
@@ -1082,7 +1082,6 @@ static int coroutine_fn vpc_co_create_opts(const char *filename,
10821082
{
10831083
BlockdevCreateOptions *create_options = NULL;
10841084
QDict *qdict;
1085-
QObject *qobj;
10861085
Visitor *v;
10871086
BlockDriverState *bs = NULL;
10881087
Error *local_err = NULL;
@@ -1119,14 +1118,12 @@ static int coroutine_fn vpc_co_create_opts(const char *filename,
11191118
qdict_put_str(qdict, "driver", "vpc");
11201119
qdict_put_str(qdict, "file", bs->node_name);
11211120

1122-
qobj = qdict_crumple_for_keyval_qiv(qdict, errp);
1123-
if (!qobj) {
1121+
v = qobject_input_visitor_new_flat_confused(qdict, errp);
1122+
if (!v) {
11241123
ret = -EINVAL;
11251124
goto fail;
11261125
}
11271126

1128-
v = qobject_input_visitor_new_keyval(qobj);
1129-
qobject_unref(qobj);
11301127
visit_type_BlockdevCreateOptions(v, NULL, &create_options, &local_err);
11311128
visit_free(v);
11321129

include/block/qdict.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ void qdict_extract_subqdict(QDict *src, QDict **dst, const char *start);
2121
void qdict_array_split(QDict *src, QList **dst);
2222
int qdict_array_entries(QDict *src, const char *subqdict);
2323
QObject *qdict_crumple(const QDict *src, Error **errp);
24-
QObject *qdict_crumple_for_keyval_qiv(QDict *qdict, Error **errp);
2524
void qdict_flatten(QDict *qdict);
2625

2726
typedef struct QDictRenames {
@@ -30,4 +29,6 @@ typedef struct QDictRenames {
3029
} QDictRenames;
3130
bool qdict_rename_keys(QDict *qdict, const QDictRenames *renames, Error **errp);
3231

32+
Visitor *qobject_input_visitor_new_flat_confused(QDict *qdict,
33+
Error **errp);
3334
#endif

qobject/block-qdict.c

+27-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "qapi/qmp/qlist.h"
1414
#include "qapi/qmp/qnum.h"
1515
#include "qapi/qmp/qstring.h"
16+
#include "qapi/qobject-input-visitor.h"
1617
#include "qemu/cutils.h"
1718
#include "qapi/error.h"
1819

@@ -529,7 +530,7 @@ QObject *qdict_crumple(const QDict *src, Error **errp)
529530
* used for anything else, and it should go away once the block
530531
* subsystem has been cleaned up.
531532
*/
532-
QObject *qdict_crumple_for_keyval_qiv(QDict *src, Error **errp)
533+
static QObject *qdict_crumple_for_keyval_qiv(QDict *src, Error **errp)
533534
{
534535
QDict *tmp = NULL;
535536
char *buf;
@@ -695,3 +696,28 @@ bool qdict_rename_keys(QDict *qdict, const QDictRenames *renames, Error **errp)
695696
}
696697
return true;
697698
}
699+
700+
/*
701+
* Create a QObject input visitor for flat @qdict with possibly
702+
* confused scalar types.
703+
*
704+
* The block subsystem uses this function to visit its flat QDict with
705+
* possibly confused scalar types. It should not be used for anything
706+
* else, and it should go away once the block subsystem has been
707+
* cleaned up.
708+
*/
709+
Visitor *qobject_input_visitor_new_flat_confused(QDict *qdict,
710+
Error **errp)
711+
{
712+
QObject *crumpled;
713+
Visitor *v;
714+
715+
crumpled = qdict_crumple_for_keyval_qiv(qdict, errp);
716+
if (!crumpled) {
717+
return NULL;
718+
}
719+
720+
v = qobject_input_visitor_new_keyval(crumpled);
721+
qobject_unref(crumpled);
722+
return v;
723+
}

0 commit comments

Comments
 (0)