qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, peter.maydell@linaro.org, qemu-devel@nongnu.org
Subject: [PULL 23/37] block/export: Move strong user reference to block_exports
Date: Fri,  2 Oct 2020 16:43:31 +0200	[thread overview]
Message-ID: <20201002144345.253865-24-kwolf@redhat.com> (raw)
In-Reply-To: <20201002144345.253865-1-kwolf@redhat.com>

The reference owned by the user/monitor that is created when adding the
export and dropped when removing it was tied to the 'exports' list in
nbd/server.c. Every block export will have a user reference, so move it
to the block export level and tie it to the 'block_exports' list in
block/export/export.c instead. This is necessary for introducing a QMP
command for removing exports.

Note that exports are present in block_exports even after the user has
requested shutdown. This is different from NBD's exports where exports
are immediately removed on a shutdown request, even if they are still in
the process of shutting down. In order to avoid that the user still
interacts with an export that is shutting down (and possibly removes it
a second time), we need to remember if the user actually still owns it.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Message-Id: <20200924152717.287415-20-kwolf@redhat.com>
Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 include/block/export.h | 8 ++++++++
 block/export/export.c  | 6 ++++++
 blockdev-nbd.c         | 5 -----
 nbd/server.c           | 2 --
 4 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/include/block/export.h b/include/block/export.h
index cdc6e161ea..4833947e89 100644
--- a/include/block/export.h
+++ b/include/block/export.h
@@ -60,6 +60,14 @@ struct BlockExport {
      */
     int refcount;
 
+    /*
+     * True if one of the references in refcount belongs to the user. After the
+     * user has dropped their reference, they may not e.g. remove the same
+     * export a second time (which would decrease the refcount without having
+     * it incremented first).
+     */
+    bool user_owned;
+
     /* The AioContext whose lock protects this BlockExport object. */
     AioContext *ctx;
 
diff --git a/block/export/export.c b/block/export/export.c
index 7a4a78449a..62699dfa05 100644
--- a/block/export/export.c
+++ b/block/export/export.c
@@ -80,6 +80,7 @@ BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp)
     *exp = (BlockExport) {
         .drv        = drv,
         .refcount   = 1,
+        .user_owned = true,
         .id         = g_strdup(export->id),
     };
 
@@ -143,6 +144,11 @@ void blk_exp_request_shutdown(BlockExport *exp)
 
     aio_context_acquire(aio_context);
     exp->drv->request_shutdown(exp);
+
+    assert(exp->user_owned);
+    exp->user_owned = false;
+    blk_exp_unref(exp);
+
     aio_context_release(aio_context);
 }
 
diff --git a/blockdev-nbd.c b/blockdev-nbd.c
index 814554dd90..9efbaef8f7 100644
--- a/blockdev-nbd.c
+++ b/blockdev-nbd.c
@@ -235,11 +235,6 @@ int nbd_export_create(BlockExport *exp, BlockExportOptions *exp_args,
         goto out;
     }
 
-    /* The list of named exports has a strong reference to this export now and
-     * our only way of accessing it is through nbd_export_find(), so we can drop
-     * the strong reference that is @exp. */
-    blk_exp_unref(exp);
-
     ret = 0;
  out:
     aio_context_release(aio_context);
diff --git a/nbd/server.c b/nbd/server.c
index 32147e4871..22a1d66168 100644
--- a/nbd/server.c
+++ b/nbd/server.c
@@ -1616,7 +1616,6 @@ int nbd_export_new(BlockExport *blk_exp, BlockDriverState *bs,
 
     blk_add_aio_context_notifier(blk, blk_aio_attached, blk_aio_detach, exp);
 
-    blk_exp_ref(&exp->common);
     QTAILQ_INSERT_TAIL(&exports, exp, next);
 
     return 0;
@@ -1663,7 +1662,6 @@ static void nbd_export_request_shutdown(BlockExport *blk_exp)
         client_close(client, true);
     }
     if (exp->name) {
-        blk_exp_unref(&exp->common);
         g_free(exp->name);
         exp->name = NULL;
         QTAILQ_REMOVE(&exports, exp, next);
-- 
2.25.4



  parent reply	other threads:[~2020-10-02 15:09 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-02 14:43 [PULL 00/37] Block layer patches Kevin Wolf
2020-10-02 14:43 ` [PULL 01/37] block/sheepdog: Replace magic val by NANOSECONDS_PER_SECOND definition Kevin Wolf
2020-10-02 14:43 ` [PULL 02/37] tests/check-block: Do not run the iotests with old versions of bash Kevin Wolf
2020-10-02 14:43 ` [PULL 03/37] docs: Document the throttle block filter Kevin Wolf
2020-10-02 14:43 ` [PULL 04/37] qemu-io-cmds: Simplify help_oneline Kevin Wolf
2020-10-02 14:43 ` [PULL 05/37] nbd: Remove unused nbd_export_get_blockdev() Kevin Wolf
2020-10-02 14:43 ` [PULL 06/37] qapi: Create block-export module Kevin Wolf
2020-10-02 14:43 ` [PULL 07/37] qapi: Rename BlockExport to BlockExportOptions Kevin Wolf
2020-10-02 14:43 ` [PULL 08/37] block/export: Add BlockExport infrastructure and block-export-add Kevin Wolf
2020-10-02 14:43 ` [PULL 09/37] qemu-storage-daemon: Use qmp_block_export_add() Kevin Wolf
2020-10-02 14:43 ` [PULL 10/37] qemu-nbd: Use raw block driver for --offset Kevin Wolf
2020-10-02 14:43 ` [PULL 11/37] block/export: Remove magic from block-export-add Kevin Wolf
2020-10-02 14:43 ` [PULL 12/37] nbd: Add max-connections to nbd-server-start Kevin Wolf
2020-10-02 14:43 ` [PULL 13/37] nbd: Add writethrough to block-export-add Kevin Wolf
2020-10-02 14:43 ` [PULL 14/37] nbd: Remove NBDExport.close callback Kevin Wolf
2020-10-02 14:43 ` [PULL 15/37] qemu-nbd: Use blk_exp_add() to create the export Kevin Wolf
2020-10-02 14:43 ` [PULL 16/37] nbd/server: Simplify export shutdown Kevin Wolf
2020-10-02 14:43 ` [PULL 17/37] block/export: Move refcount from NBDExport to BlockExport Kevin Wolf
2020-10-02 14:43 ` [PULL 18/37] block/export: Move AioContext " Kevin Wolf
2020-10-02 14:43 ` [PULL 19/37] block/export: Add node-name to BlockExportOptions Kevin Wolf
2020-10-02 14:43 ` [PULL 20/37] block/export: Allocate BlockExport in blk_exp_add() Kevin Wolf
2020-10-02 14:43 ` [PULL 21/37] block/export: Add blk_exp_close_all(_type) Kevin Wolf
2020-10-02 14:43 ` [PULL 22/37] block/export: Add 'id' option to block-export-add Kevin Wolf
2020-10-02 14:43 ` Kevin Wolf [this message]
2020-10-02 14:43 ` [PULL 24/37] block/export: Add block-export-del Kevin Wolf
2020-10-02 14:43 ` [PULL 25/37] block/export: Add BLOCK_EXPORT_DELETED event Kevin Wolf
2020-10-02 14:43 ` [PULL 26/37] block/export: Move blk to BlockExport Kevin Wolf
2020-10-02 14:43 ` [PULL 27/37] block/export: Create BlockBackend in blk_exp_add() Kevin Wolf
2020-10-02 14:43 ` [PULL 28/37] block/export: Add query-block-exports Kevin Wolf
2020-10-02 14:43 ` [PULL 29/37] block/export: Move writable to BlockExportOptions Kevin Wolf
2020-10-02 14:43 ` [PULL 30/37] nbd: Merge nbd_export_new() and nbd_export_create() Kevin Wolf
2020-10-02 14:43 ` [PULL 31/37] nbd: Deprecate nbd-server-add/remove Kevin Wolf
2020-10-02 14:43 ` [PULL 32/37] iotests: Factor out qemu_tool_pipe_and_status() Kevin Wolf
2020-10-02 14:43 ` [PULL 33/37] iotests: Introduce qemu_nbd_list_log() Kevin Wolf
2020-10-02 14:43 ` [PULL 34/37] iotests: Allow supported and unsupported formats at the same time Kevin Wolf
2020-10-02 14:43 ` [PULL 35/37] iotests: Test block-export-* QMP interface Kevin Wolf
2020-10-02 14:43 ` [PULL 36/37] qemu-storage-daemon: Fix help line for --export Kevin Wolf
2020-10-02 14:43 ` [PULL 37/37] qcow2: Use L1E_SIZE in qcow2_write_l1_entry() Kevin Wolf
2020-10-02 18:11 ` [PULL 00/37] Block layer patches Peter Maydell

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=20201002144345.253865-24-kwolf@redhat.com \
    --to=kwolf@redhat.com \
    --cc=peter.maydell@linaro.org \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).