All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Blake <eblake@redhat.com>
To: Kevin Wolf <kwolf@redhat.com>, qemu-block@nongnu.org
Cc: Peter Krempa <pkrempa@redhat.com>,
	qemu-devel@nongnu.org, mreitz@redhat.com
Subject: Re: [RFC PATCH 07/22] block/export: Remove magic from block-export-add
Date: Wed, 19 Aug 2020 14:50:19 -0500	[thread overview]
Message-ID: <b2958a79-f7c6-7bc2-8895-50924f15afd9@redhat.com> (raw)
In-Reply-To: <20200813162935.210070-8-kwolf@redhat.com>

cc: Peter Krempa

On 8/13/20 11:29 AM, Kevin Wolf wrote:
> nbd-server-add tries to be convenient and adds two questionable
> features that we don't want to share in block-export-add, even for NBD
> exports:
> 
> 1. When requesting a writable export of a read-only device, the export
>     is silently downgraded to read-only. This should be an error in the
>     context of block-export-add.

I'd be happy for this to be an error even with nbd-export-add; I don't 
think it would harm any of libvirt's existing usage (either for storage 
migration, or for incremental backups).

Side note: In the past, I had a proposal to enhance the NBD Protocol to 
allow a client to advertise to the server its intent on being a 
read-only or read-write client.  Not relevant to this patch, but this 
part of the commit message reminds me that I should revisit that topic 
(Rich and I recently hit another case in nbdkit where such an extension 
would be nice, when it comes to using NBD's multi-conn for better 
performance on a read-only connection, but only if the server knows the 
client intends to be read-only)

> 
> 2. When using a BlockBackend name, unplugging the device from the guest
>     will automatically stop the NBD server, too. This may sometimes be
>     what you want, but it could also be very surprising. Let's keep
>     things explicit with block-export-add. If the user wants to stop the
>     export, they should tell us so.

Here, keeping the nbd command different from the block-export command 
seems tolerable.  On the other hand, I wonder if Peter needs to change 
anything in libvirt's incremental backup code to handle this sudden 
disappearance of an NBD device during a disk hot-unplug (that is, either 
the presence of an ongoing pull-mode backup should block disk unplug, or 
libvirt needs a way to guarantee that an ongoing backup NBD device 
remains in spite of subsequent disk actions on the guest).  Depending on 
libvirt's needs, we may want to revisit the nbd command to have the same 
policy as block-export-add, plus an introspectible feature notation.

> 
> Move these things into the nbd-server-add QMP command handler so that
> they apply only there.
> 
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
>   include/block/nbd.h   |  3 ++-

> +void qmp_block_export_add(BlockExportOptions *export, Error **errp)
> +{
> +    blk_exp_add(export, errp);
>   }
>   
>   void qmp_nbd_server_add(BlockExportOptionsNbd *arg, Error **errp)
>   {
> -    BlockExportOptions export = {
> +    BlockExport *export;
> +    BlockDriverState *bs;
> +    BlockBackend *on_eject_blk;
> +
> +    BlockExportOptions export_opts = {
>           .type = BLOCK_EXPORT_TYPE_NBD,
>           .u.nbd = *arg,
>       };
> -    qmp_block_export_add(&export, errp);
> +
> +    /*
> +     * nbd-server-add doesn't complain when a read-only device should be
> +     * exported as writable, but simply downgrades it. This is an error with
> +     * block-export-add.

I'd be happy with either marking this deprecated now (and fixing it in 
two releases), or declaring it a bug in nbd-server-add now (and fixing 
it outright).

> +     */
> +    bs = bdrv_lookup_bs(arg->device, arg->device, NULL);
> +    if (bs && bdrv_is_read_only(bs)) {
> +        arg->writable = false;
> +    }
> +
> +    export = blk_exp_add(&export_opts, errp);
> +    if (!export) {
> +        return;
> +    }
> +
> +    /*
> +     * nbd-server-add removes the export when the named BlockBackend used for
> +     * @device goes away.
> +     */
> +    on_eject_blk = blk_by_name(arg->device);
> +    if (on_eject_blk) {
> +        nbd_export_set_on_eject_blk(export, on_eject_blk);
> +    }

Wait - is the magic export removal tied only to exporting a drive name, 
and not a node name?  So as long as libvirt is using only node names 
whwen adding exports, a drive being unplugged won't interfere?

Overall, the change makes sense to me, although I'd love to see if we 
could go further on the writable vs. read-only issue.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org



  parent reply	other threads:[~2020-08-19 19:51 UTC|newest]

Thread overview: 90+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-08-13 16:29 [RFC PATCH 00/22] block/export: Add infrastructure and QAPI for block exports Kevin Wolf
2020-08-13 16:29 ` [RFC PATCH 01/22] nbd: Remove unused nbd_export_get_blockdev() Kevin Wolf
2020-08-17  8:14   ` Max Reitz
2020-08-19 18:13   ` Eric Blake
2020-08-13 16:29 ` [RFC PATCH 02/22] qapi: Create block-export module Kevin Wolf
2020-08-17  8:50   ` Max Reitz
2020-08-19 18:17   ` Eric Blake
2020-08-13 16:29 ` [RFC PATCH 03/22] qapi: Rename BlockExport to BlockExportOptions Kevin Wolf
2020-08-17  9:13   ` Max Reitz
2020-08-19 18:19   ` Eric Blake
2020-08-13 16:29 ` [RFC PATCH 04/22] block/export: Add BlockExport infrastructure and block-export-add Kevin Wolf
2020-08-17 10:03   ` Max Reitz
2020-08-17 12:45     ` Kevin Wolf
2020-08-17 13:19       ` Max Reitz
2020-08-17 13:29         ` Kevin Wolf
2020-08-17 13:53           ` Max Reitz
2020-08-19 18:31   ` Eric Blake
2020-08-13 16:29 ` [RFC PATCH 05/22] qemu-storage-daemon: Use qmp_block_export_add() Kevin Wolf
2020-08-17 10:13   ` Max Reitz
2020-08-19 19:14   ` Eric Blake
2020-08-13 16:29 ` [RFC PATCH 06/22] qemu-nbd: Use raw block driver for --offset Kevin Wolf
2020-08-17 10:56   ` Max Reitz
2020-08-17 11:41   ` Max Reitz
2020-08-17 17:19   ` Nir Soffer
2020-08-18  8:47     ` Kevin Wolf
2020-08-18  9:05       ` Nir Soffer
2020-08-19 19:33   ` Eric Blake
2020-08-13 16:29 ` [RFC PATCH 07/22] block/export: Remove magic from block-export-add Kevin Wolf
2020-08-17 11:41   ` Max Reitz
2020-08-17 12:49     ` Kevin Wolf
2020-08-17 13:22       ` Max Reitz
2020-08-19 19:50   ` Eric Blake [this message]
2020-08-20 11:05     ` Kevin Wolf
2020-08-20 14:41       ` Eric Blake
2020-08-20 15:28         ` Peter Krempa
2020-08-13 16:29 ` [RFC PATCH 08/22] nbd: Add max-connections to nbd-server-start Kevin Wolf
2020-08-17 12:37   ` Max Reitz
2020-08-17 13:01     ` Kevin Wolf
2020-08-19 20:00   ` Eric Blake
2020-08-20 11:12     ` Kevin Wolf
2020-08-13 16:29 ` [RFC PATCH 09/22] nbd: Add writethrough to block-export-add Kevin Wolf
2020-08-17 12:56   ` Max Reitz
2020-08-17 13:13     ` Kevin Wolf
2020-08-17 13:51       ` Max Reitz
2020-08-17 14:32         ` Kevin Wolf
2020-08-17 15:35           ` Max Reitz
2020-08-19 20:05     ` Eric Blake
2020-08-19 20:13   ` Eric Blake
2020-08-13 16:29 ` [RFC PATCH 10/22] nbd: Remove NBDExport.close callback Kevin Wolf
2020-08-17 14:02   ` Max Reitz
2020-08-19 20:17   ` Eric Blake
2020-08-13 16:29 ` [RFC PATCH 11/22] qemu-nbd: Use blk_exp_add() to create the export Kevin Wolf
2020-08-17 14:27   ` Max Reitz
2020-08-17 14:38     ` Max Reitz
2020-08-17 15:01     ` Kevin Wolf
2020-08-19 20:35   ` Eric Blake
2020-08-13 16:29 ` [RFC PATCH 12/22] nbd/server: Simplify export shutdown Kevin Wolf
2020-08-17 14:32   ` Max Reitz
2020-08-19 20:45   ` Eric Blake
2020-08-13 16:29 ` [RFC PATCH 13/22] block/export: Move refcount from NBDExport to BlockExport Kevin Wolf
2020-08-17 14:49   ` Max Reitz
2020-08-19 20:58   ` Eric Blake
2020-08-20 14:15     ` Kevin Wolf
2020-08-13 16:29 ` [RFC PATCH 14/22] block/export: Move AioContext " Kevin Wolf
2020-08-17 14:56   ` Max Reitz
2020-08-17 15:22     ` Kevin Wolf
2020-08-17 15:47       ` Max Reitz
2020-08-13 16:29 ` [RFC PATCH 15/22] block/export: Move device to BlockExportOptions Kevin Wolf
2020-08-17 15:13   ` Max Reitz
2020-08-17 15:27     ` Kevin Wolf
2020-08-17 15:49       ` Max Reitz
2020-08-19 21:13   ` Eric Blake
2020-08-13 16:29 ` [RFC PATCH 16/22] block/export: Allocate BlockExport in blk_exp_add() Kevin Wolf
2020-08-18 14:25   ` Max Reitz
2020-08-13 16:29 ` [RFC PATCH 17/22] block/export: Add blk_exp_close_all(_type) Kevin Wolf
2020-08-18 15:00   ` Max Reitz
2020-08-13 16:29 ` [RFC PATCH 18/22] block/export: Add 'id' option to block-export-add Kevin Wolf
2020-08-18 15:08   ` Max Reitz
2020-08-13 16:29 ` [RFC PATCH 19/22] block/export: Move strong user reference to block_exports Kevin Wolf
2020-08-19  8:35   ` Max Reitz
2020-08-19 11:56   ` Max Reitz
2020-08-19 14:23     ` Kevin Wolf
2020-08-19 14:48       ` Max Reitz
2020-08-13 16:29 ` [RFC PATCH 20/22] block/export: Add block-export-del Kevin Wolf
2020-08-19  9:54   ` Max Reitz
2020-08-13 16:29 ` [RFC PATCH 21/22] block/export: Move blk to BlockExport Kevin Wolf
2020-08-19 10:53   ` Max Reitz
2020-08-13 16:29 ` [RFC PATCH 22/22] block/export: Add query-block-exports Kevin Wolf
2020-08-19 11:04   ` Max Reitz
2020-08-19 12:04     ` Kevin Wolf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b2958a79-f7c6-7bc2-8895-50924f15afd9@redhat.com \
    --to=eblake@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=pkrempa@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.