[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 12/31] nbd/server: Simplify export shutdown
From: |
Kevin Wolf |
Subject: |
[PATCH v2 12/31] nbd/server: Simplify export shutdown |
Date: |
Thu, 24 Sep 2020 17:26:58 +0200 |
Closing export is somewhat convoluted because nbd_export_close() and
nbd_export_put() call each other and the ways they actually end up being
nested is not necessarily obvious.
However, it is not really necessary to call nbd_export_close() from
nbd_export_put() when putting the last reference because it only does
three things:
1. Close all clients. We're going to refcount 0 and all clients hold a
reference, so we know there is no active client any more.
2. Close the user reference (represented by exp->name being non-NULL).
The same argument applies: If the export were still named, we would
still have a reference.
3. Freeing exp->description. This is really cleanup work to be done when
the export is finally freed. There is no reason to already clear it
while clients are still in the process of shutting down.
So after moving the cleanup of exp->description, the code can be
simplified so that only nbd_export_close() calls nbd_export_put(), but
never the other way around.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
nbd/server.c | 17 ++++-------------
1 file changed, 4 insertions(+), 13 deletions(-)
diff --git a/nbd/server.c b/nbd/server.c
index 1cc915f01d..fb70374df5 100644
--- a/nbd/server.c
+++ b/nbd/server.c
@@ -1678,8 +1678,6 @@ void nbd_export_close(NBDExport *exp)
QTAILQ_REMOVE(&exports, exp, next);
QTAILQ_INSERT_TAIL(&closed_exports, exp, next);
}
- g_free(exp->description);
- exp->description = NULL;
nbd_export_put(exp);
}
@@ -1706,19 +1704,12 @@ void nbd_export_get(NBDExport *exp)
void nbd_export_put(NBDExport *exp)
{
assert(exp->refcount > 0);
- if (exp->refcount == 1) {
- nbd_export_close(exp);
- }
-
- /* nbd_export_close() may theoretically reduce refcount to 0. It may happen
- * if someone calls nbd_export_put() on named export not through
- * nbd_export_set_name() when refcount is 1. So, let's assert that
- * it is > 0.
- */
- assert(exp->refcount > 0);
if (--exp->refcount == 0) {
assert(exp->name == NULL);
- assert(exp->description == NULL);
+ assert(QTAILQ_EMPTY(&exp->clients));
+
+ g_free(exp->description);
+ exp->description = NULL;
if (exp->blk) {
if (exp->eject_notifier_blk) {
--
2.25.4
- [PATCH v2 01/31] nbd: Remove unused nbd_export_get_blockdev(), (continued)
- [PATCH v2 01/31] nbd: Remove unused nbd_export_get_blockdev(), Kevin Wolf, 2020/09/24
- [PATCH v2 02/31] qapi: Create block-export module, Kevin Wolf, 2020/09/24
- [PATCH v2 03/31] qapi: Rename BlockExport to BlockExportOptions, Kevin Wolf, 2020/09/24
- [PATCH v2 08/31] nbd: Add max-connections to nbd-server-start, Kevin Wolf, 2020/09/24
- [PATCH v2 09/31] nbd: Add writethrough to block-export-add, Kevin Wolf, 2020/09/24
- [PATCH v2 05/31] qemu-storage-daemon: Use qmp_block_export_add(), Kevin Wolf, 2020/09/24
- [PATCH v2 10/31] nbd: Remove NBDExport.close callback, Kevin Wolf, 2020/09/24
- [PATCH v2 04/31] block/export: Add BlockExport infrastructure and block-export-add, Kevin Wolf, 2020/09/24
- [PATCH v2 06/31] qemu-nbd: Use raw block driver for --offset, Kevin Wolf, 2020/09/24
- [PATCH v2 11/31] qemu-nbd: Use blk_exp_add() to create the export, Kevin Wolf, 2020/09/24
- [PATCH v2 12/31] nbd/server: Simplify export shutdown,
Kevin Wolf <=
- [PATCH v2 07/31] block/export: Remove magic from block-export-add, Kevin Wolf, 2020/09/24
- [PATCH v2 14/31] block/export: Move AioContext from NBDExport to BlockExport, Kevin Wolf, 2020/09/24
- [PATCH v2 16/31] block/export: Allocate BlockExport in blk_exp_add(), Kevin Wolf, 2020/09/24
- [PATCH v2 13/31] block/export: Move refcount from NBDExport to BlockExport, Kevin Wolf, 2020/09/24
- [PATCH v2 15/31] block/export: Add node-name to BlockExportOptions, Kevin Wolf, 2020/09/24
- [PATCH v2 19/31] block/export: Move strong user reference to block_exports, Kevin Wolf, 2020/09/24
- [PATCH v2 20/31] block/export: Add block-export-del, Kevin Wolf, 2020/09/24
- [PATCH v2 17/31] block/export: Add blk_exp_close_all(_type), Kevin Wolf, 2020/09/24
- [PATCH v2 22/31] block/export: Move blk to BlockExport, Kevin Wolf, 2020/09/24
- [PATCH v2 18/31] block/export: Add 'id' option to block-export-add, Kevin Wolf, 2020/09/24