On Sat, Dec 15, 2018 at 07:53:21AM -0600, Eric Blake wrote: > We want to be able to detect whether a given qemu NBD server is > exposing the right export(s) and dirty bitmaps, at least for > regression testing. We could use 'nbd-client -l' from the upstream > NBD project to list exports, but it's annoying to rely on > out-of-tree binaries; furthermore, nbd-client doesn't necessarily > know about all of the qemu NBD extensions. Thus, we plan on adding > a new mode to qemu-nbd that merely sniffs all possible information > from the server during handshake phase, then disconnects and dumps > the information. > > This patch continues the work of the previous patch, by adding the > ability to track the list of available meta contexts into > NBDExportInfo. It benefits from the recent refactoring patches > with a new nbd_list_meta_contexts() that reuses much of the same > framework as setting a meta context. > > Signed-off-by: Eric Blake <ebl...@redhat.com> > > --- > v2: new patch to split out collection of meta context collection > s/free/g_free/ [Vladimir] > --- > include/block/nbd.h | 2 ++ > nbd/client.c | 41 +++++++++++++++++++++++++++++++++++++++-- > 2 files changed, 41 insertions(+), 2 deletions(-) > > diff --git a/include/block/nbd.h b/include/block/nbd.h > index 09d2157efe0..6d9fbb941d7 100644 > --- a/include/block/nbd.h > +++ b/include/block/nbd.h > @@ -284,6 +284,8 @@ struct NBDExportInfo { > > /* Set by server results during nbd_receive_export_list() */ > char *description; > + int n_contexts; > + char **contexts; > }; > typedef struct NBDExportInfo NBDExportInfo; > > diff --git a/nbd/client.c b/nbd/client.c > index 0e6c575ccad..d392b5e8bee 100644 > --- a/nbd/client.c > +++ b/nbd/client.c > @@ -808,6 +808,36 @@ static int nbd_negotiate_simple_meta_context(QIOChannel > *ioc, > } > } > > +/* > + * nbd_list_meta_contexts: > + * Request the server to list all meta contexts for export @info->name. > + * return 0 if list is complete (even if empty), > + * -1 with errp set for any other error > + */ > +static int nbd_list_meta_contexts(QIOChannel *ioc, > + NBDExportInfo *info, > + Error **errp) > +{ > + int ret; > + > + if (nbd_send_one_meta_context(ioc, NBD_OPT_LIST_META_CONTEXT, > + info->name, NULL, errp) < 0) { > + return -1; > + } > + > + while (1) { > + char *context; > + > + ret = nbd_receive_one_meta_context(ioc, NBD_OPT_LIST_META_CONTEXT, > + &context, NULL, errp); > + if (ret <= 0) { > + return ret; > + } > + info->contexts = g_renew(char *, info->contexts, ++info->n_contexts); > + info->contexts[info->n_contexts - 1] = context; > + } > +} > + > /* > * nbd_start_negotiate: > * Start the handshake to the server. After a positive return, the server > @@ -1054,7 +1084,7 @@ int nbd_receive_negotiate(QIOChannel *ioc, > QCryptoTLSCreds *tlscreds, > /* Clean up result of nbd_receive_export_list */ > void nbd_free_export_list(NBDExportInfo *info, int count) > { > - int i; > + int i, j; > > if (!info) { > return; > @@ -1063,6 +1093,10 @@ void nbd_free_export_list(NBDExportInfo *info, int > count) > for (i = 0; i < count; i++) { > g_free(info[i].name); > g_free(info[i].description); > + for (j = 0; j < info[i].n_contexts; j++) { > + g_free(info[i].contexts[j]); > + } > + g_free(info[i].contexts); > } > g_free(info); > } > @@ -1130,7 +1164,10 @@ int nbd_receive_export_list(QIOChannel *ioc, > QCryptoTLSCreds *tlscreds, > break; > } > > - /* TODO: Grab meta contexts */ > + if (result == 3 && > + nbd_list_meta_contexts(ioc, &array[i], errp) < 0) { > + goto out; > + } > } > > /* Send NBD_OPT_ABORT as a courtesy before hanging up */ > -- > 2.17.2
Reviewed-by: Richard W.M. Jones <rjo...@redhat.com> Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com libguestfs lets you edit virtual machines. Supports shell scripting, bindings from many languages. http://libguestfs.org