On Tue, Nov 24, 2020 at 5:46 PM Markus Armbruster <arm...@redhat.com> wrote:
> Yuri Benditovich <yuri.benditov...@daynix.com> writes: > > > On Tue, Nov 24, 2020 at 3:36 PM Markus Armbruster <arm...@redhat.com> > wrote: > > > >> Markus Armbruster <arm...@redhat.com> writes: > >> > >> > Yuri Benditovich <yuri.benditov...@daynix.com> writes: > >> > > >> >> Please confirm that this patch is intended to solve only the problem > >> with > >> >> hmp (and disallow duplicated ids) > >> > > >> > The intent is to reject duplicate ID and to accept non-duplicate ID, > no > >> > matter how the device is created (CLI, HMP, QMP) or a prior instance > was > >> > deleted (HMP, QMP). > >> > > >> >> With it the netdev that was added from qemu's command line and was > >> deleted > >> >> (for example by hmp) still can't be created, correct? > >> > > >> > Yet another case; back to the drawing board... > >> > >> Next try. Hope this is one holds water :) > >> > >> > >> diff --git a/net/net.c b/net/net.c > >> index 794c652282..c1dc75fc37 100644 > >> --- a/net/net.c > >> +++ b/net/net.c > >> @@ -978,6 +978,7 @@ static int (* const > >> net_client_init_fun[NET_CLIENT_DRIVER__MAX])( > >> static int net_client_init1(const Netdev *netdev, bool is_netdev, Error > >> **errp) > >> { > >> NetClientState *peer = NULL; > >> + NetClientState *nc; > >> > >> if (is_netdev) { > >> if (netdev->type == NET_CLIENT_DRIVER_NIC || > >> @@ -1005,6 +1006,12 @@ static int net_client_init1(const Netdev *netdev, > >> bool is_netdev, Error **errp) > >> } > >> } > >> > >> + nc = qemu_find_netdev(netdev->id); > >> + if (nc) { > >> + error_setg(errp, "Duplicate ID '%s'", netdev->id); > >> + return -1; > >> + } > >> + > >> if (net_client_init_fun[netdev->type](netdev, netdev->id, peer, > errp) > >> < 0) { > >> /* FIXME drop when all init functions store an Error */ > >> if (errp && !*errp) { > >> @@ -1015,8 +1022,6 @@ static int net_client_init1(const Netdev *netdev, > >> bool is_netdev, Error **errp) > >> } > >> > >> if (is_netdev) { > >> - NetClientState *nc; > >> - > >> nc = qemu_find_netdev(netdev->id); > >> assert(nc); > >> nc->is_netdev = true; > >> @@ -1137,6 +1142,7 @@ void qmp_netdev_add(Netdev *netdev, Error **errp) > >> void qmp_netdev_del(const char *id, Error **errp) > >> { > >> NetClientState *nc; > >> + QemuOpts *opts; > >> > >> nc = qemu_find_netdev(id); > >> if (!nc) { > >> @@ -1151,6 +1157,16 @@ void qmp_netdev_del(const char *id, Error **errp) > >> } > >> > >> qemu_del_net_client(nc); > >> + > >> + /* > >> + * Wart: we need to delete the QemuOpts associated with netdevs > >> + * created via CLI or HMP, to avoid bogus "Duplicate ID" errors in > >> + * HMP netdev_add. > >> + */ > >> + opts = qemu_opts_find(qemu_find_opts("netdev"), id); > >> + if (opts) { > >> + qemu_opts_del(opts); > >> + } > >> } > >> > >> > > With this part there is no need to unconditionally delete the options > > in hmp_netdev_add, > > correct? > > Yes. > > The CLI accumulates -netdev in option group "netdev". It has to, or > else -writeconfig doesn't work. > > Before commit 08712fcb85 "net: Track netdevs in NetClientState rather > than QemuOpt", netdev_add added to the option group, and netdev_del > removed from it, both for HMP and QMP. Thus, every netdev had a > corresponding QemuOpts in this option group. > > Commit 08712fcb85 dropped this for QMP netdev_add and both netdev_del. > Now a netdev has a corresponding QemuOpts only when it was created with > CLI or HMP. Two issues: > > * QMP netdev_add loses its "no duplicate ID" check. > > My change to net_init_client1() fixes this. > > * Both netdev_add can leave QemuOpts behind, breaking HMP netdev_add. > > My change to qmp_netdev_del() fixes this. > > Questions? > > No questions, looking forward for the final patch Thanks