qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v4 03/10] qemu-nbd: add support for --object com


From: Kevin Wolf
Subject: Re: [Qemu-devel] [PATCH v4 03/10] qemu-nbd: add support for --object command line arg
Date: Wed, 27 Jan 2016 14:57:51 +0100
User-agent: Mutt/1.5.21 (2010-09-15)

Am 26.01.2016 um 14:34 hat Daniel P. Berrange geschrieben:
> Allow creation of user creatable object types with qemu-nbd
> via a new --object command line arg. This will be used to supply
> passwords and/or encryption keys to the various block driver
> backends via the recently added 'secret' object type.
> 
>  # printf letmein > mypasswd.txt
>  # qemu-nbd --object secret,id=sec0,file=mypasswd.txt \
>       ...other nbd args...
> 
> Signed-off-by: Daniel P. Berrange <address@hidden>
> ---
>  qemu-nbd.c    | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  qemu-nbd.texi |  6 ++++++
>  2 files changed, 60 insertions(+)
> 
> diff --git a/qemu-nbd.c b/qemu-nbd.c
> index ede4a54..8e5d36c 100644
> --- a/qemu-nbd.c
> +++ b/qemu-nbd.c
> @@ -23,9 +23,12 @@
>  #include "qemu/main-loop.h"
>  #include "qemu/sockets.h"
>  #include "qemu/error-report.h"
> +#include "qemu/config-file.h"
>  #include "block/snapshot.h"
>  #include "qapi/util.h"
>  #include "qapi/qmp/qstring.h"
> +#include "qapi/opts-visitor.h"
> +#include "qom/object_interfaces.h"
>  
>  #include <stdarg.h>
>  #include <stdio.h>
> @@ -44,6 +47,7 @@
>  #define QEMU_NBD_OPT_AIO           2
>  #define QEMU_NBD_OPT_DISCARD       3
>  #define QEMU_NBD_OPT_DETECT_ZEROES 4
> +#define QEMU_NBD_OPT_OBJECT        5
>  
>  static NBDExport *exp;
>  static int verbose;
> @@ -77,6 +81,9 @@ static void usage(const char *name)
>  "  -o, --offset=OFFSET       offset into the image\n"
>  "  -P, --partition=NUM       only expose partition NUM\n"
>  "\n"
> +"General purpose options:\n"
> +"  --object type,id=ID,...   define an object such as 'secret' for 
> providing\n"
> +"                            passwords and/or encryption keys\n"
>  #ifdef __linux__
>  "Kernel NBD client support:\n"
>  "  -c, --connect=DEV         connect FILE to the local NBD device DEV\n"
> @@ -374,6 +381,35 @@ static SocketAddress *nbd_build_socket_address(const 
> char *sockpath,
>  }
>  
>  
> +static QemuOptsList qemu_object_opts = {
> +    .name = "object",
> +    .implied_opt_name = "qom-type",
> +    .head = QTAILQ_HEAD_INITIALIZER(qemu_object_opts.head),
> +    .desc = {
> +        { }
> +    },
> +};
> +
> +static int object_create(void *opaque, QemuOpts *opts, Error **errp)
> +{
> +    Error *err = NULL;
> +    OptsVisitor *ov;
> +    QDict *pdict;
> +
> +    ov = opts_visitor_new(opts);
> +    pdict = qemu_opts_to_qdict(opts, NULL);
> +
> +    user_creatable_add(pdict, opts_get_visitor(ov), &err);
> +    opts_visitor_cleanup(ov);
> +    QDECREF(pdict);
> +
> +    if (err) {
> +        error_propagate(errp, err);
> +        return -1;
> +    }
> +    return 0;
> +}

Hm... This looks very similar to the same function in qemu-img.c. And
actually, vl.c is a bit different, but not too much either. Wouldn't it
make sense to share this code?

Also, now that I compared this to vl.c, there seem to be two differences
compared to the tools: Support for filtering (the tools don't seem to
need this; passing NULL as the callback could skip it) and an additional
obj_unref(obj).

I don't understand much of QOM, so I don't know what the obj_unref() is
for, but I'm wondering whether we need to do the same in the tools. Can
you explain?

>  int main(int argc, char **argv)
>  {
>      BlockBackend *blk;
> @@ -411,6 +447,7 @@ int main(int argc, char **argv)
>          { "format", 1, NULL, 'f' },
>          { "persistent", 0, NULL, 't' },
>          { "verbose", 0, NULL, 'v' },
> +        { "object", 1, NULL, QEMU_NBD_OPT_OBJECT },
>          { NULL, 0, NULL, 0 }
>      };
>      int ch;
> @@ -428,6 +465,7 @@ int main(int argc, char **argv)
>      Error *local_err = NULL;
>      BlockdevDetectZeroesOptions detect_zeroes = 
> BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF;
>      QDict *options = NULL;
> +    QemuOpts *opts;
>  
>      /* The client thread uses SIGTERM to interrupt the server.  A signal
>       * handler ensures that "qemu-nbd -v -c" exits with a nice status code.
> @@ -436,6 +474,8 @@ int main(int argc, char **argv)
>      memset(&sa_sigterm, 0, sizeof(sa_sigterm));
>      sa_sigterm.sa_handler = termsig_handler;
>      sigaction(SIGTERM, &sa_sigterm, NULL);
> +    module_call_init(MODULE_INIT_QOM);
> +    qemu_add_opts(&qemu_object_opts);

Like in qemu-img, I'd prefer directly using the pointer.

Kevin



reply via email to

[Prev in Thread] Current Thread [Next in Thread]