From: Max Reitz <mreitz@redhat.com>
To: qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>,
Paolo Bonzini <pbonzini@redhat.com>,
Stefan Hajnoczi <stefanha@redhat.com>,
Max Reitz <mreitz@redhat.com>
Subject: [Qemu-devel] [PATCH v2 05/22] block: Move BDS close notifiers into BB
Date: Mon, 9 Feb 2015 13:38:27 -0500 [thread overview]
Message-ID: <1423507124-29809-6-git-send-email-mreitz@redhat.com> (raw)
In-Reply-To: <1423507124-29809-1-git-send-email-mreitz@redhat.com>
The only remaining user of the BDS close notifiers is NBD which uses
them to determine when a BDS tree is being ejected. This patch removes
the BDS-level close notifiers and adds a notifier list to the
BlockBackend structure that is invoked whenever a BDS is removed. While
it might make sense to have a similar list for the "insert BDS tree"
event, there would be no users so far, so no such list is added here.
Note that the mixture of "eject" and "close" in the new NBD code is
intentional; notifiers to be called on bdrv_close_all() will be added
later, and those will reuse the BDRVCloseNotifier type.
Signed-off-by: Max Reitz <mreitz@redhat.com>
---
block.c | 7 -------
block/block-backend.c | 11 +++++++----
blockdev-nbd.c | 36 +-----------------------------------
include/block/block.h | 1 -
include/block/block_int.h | 2 --
include/sysemu/block-backend.h | 2 +-
nbd.c | 35 +++++++++++++++++++++++++++++++++++
7 files changed, 44 insertions(+), 50 deletions(-)
diff --git a/block.c b/block.c
index 99d9955..6ad80fe 100644
--- a/block.c
+++ b/block.c
@@ -371,7 +371,6 @@ BlockDriverState *bdrv_new(void)
for (i = 0; i < BLOCK_OP_TYPE_MAX; i++) {
QLIST_INIT(&bs->op_blockers[i]);
}
- notifier_list_init(&bs->close_notifiers);
notifier_with_return_list_init(&bs->before_write_notifiers);
qemu_co_queue_init(&bs->throttled_reqs[0]);
qemu_co_queue_init(&bs->throttled_reqs[1]);
@@ -381,11 +380,6 @@ BlockDriverState *bdrv_new(void)
return bs;
}
-void bdrv_add_close_notifier(BlockDriverState *bs, Notifier *notify)
-{
- notifier_list_add(&bs->close_notifiers, notify);
-}
-
BlockDriver *bdrv_find_format(const char *format_name)
{
BlockDriver *drv1;
@@ -1864,7 +1858,6 @@ void bdrv_close(BlockDriverState *bs)
bdrv_drain_all(); /* complete I/O */
bdrv_flush(bs);
bdrv_drain_all(); /* in case flush left pending I/O */
- notifier_list_notify(&bs->close_notifiers, bs);
if (bs->drv) {
if (bs->backing_hd) {
diff --git a/block/block-backend.c b/block/block-backend.c
index ad0af67..6d02184 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -47,6 +47,8 @@ struct BlockBackend {
BlockdevOnError on_read_error, on_write_error;
bool iostatus_enabled;
BlockDeviceIoStatus iostatus;
+
+ NotifierList remove_bs_notifiers;
};
typedef struct BlockBackendAIOCB {
@@ -97,6 +99,7 @@ BlockBackend *blk_new(const char *name, Error **errp)
blk = g_new0(BlockBackend, 1);
blk->name = g_strdup(name);
blk->refcnt = 1;
+ notifier_list_init(&blk->remove_bs_notifiers);
QTAILQ_INSERT_TAIL(&blk_backends, blk, link);
return blk;
}
@@ -320,6 +323,8 @@ void blk_remove_bs(BlockBackend *blk)
return;
}
+ notifier_list_notify(&blk->remove_bs_notifiers, blk);
+
blk_update_root_state(blk);
bdrv_unref(blk->bs);
@@ -1067,11 +1072,9 @@ void blk_remove_aio_context_notifier(BlockBackend *blk,
}
}
-void blk_add_close_notifier(BlockBackend *blk, Notifier *notify)
+void blk_add_remove_bs_notifier(BlockBackend *blk, Notifier *notify)
{
- if (blk->bs) {
- bdrv_add_close_notifier(blk->bs, notify);
- }
+ notifier_list_add(&blk->remove_bs_notifiers, notify);
}
void blk_io_plug(BlockBackend *blk)
diff --git a/blockdev-nbd.c b/blockdev-nbd.c
index 22e95d1..eb5f9a0 100644
--- a/blockdev-nbd.c
+++ b/blockdev-nbd.c
@@ -47,36 +47,11 @@ void qmp_nbd_server_start(SocketAddress *addr, Error **errp)
}
}
-/* Hook into the BlockDriverState notifiers to close the export when
- * the file is closed.
- */
-typedef struct NBDCloseNotifier {
- Notifier n;
- NBDExport *exp;
- QTAILQ_ENTRY(NBDCloseNotifier) next;
-} NBDCloseNotifier;
-
-static QTAILQ_HEAD(, NBDCloseNotifier) close_notifiers =
- QTAILQ_HEAD_INITIALIZER(close_notifiers);
-
-static void nbd_close_notifier(Notifier *n, void *data)
-{
- NBDCloseNotifier *cn = DO_UPCAST(NBDCloseNotifier, n, n);
-
- notifier_remove(&cn->n);
- QTAILQ_REMOVE(&close_notifiers, cn, next);
-
- nbd_export_close(cn->exp);
- nbd_export_put(cn->exp);
- g_free(cn);
-}
-
void qmp_nbd_server_add(const char *device, bool has_writable, bool writable,
Error **errp)
{
BlockBackend *blk;
NBDExport *exp;
- NBDCloseNotifier *n;
if (server_fd == -1) {
error_setg(errp, "NBD server not running");
@@ -108,20 +83,11 @@ void qmp_nbd_server_add(const char *device, bool has_writable, bool writable,
exp = nbd_export_new(blk, 0, -1, writable ? 0 : NBD_FLAG_READ_ONLY, NULL);
nbd_export_set_name(exp, device);
-
- n = g_new0(NBDCloseNotifier, 1);
- n->n.notify = nbd_close_notifier;
- n->exp = exp;
- blk_add_close_notifier(blk, &n->n);
- QTAILQ_INSERT_TAIL(&close_notifiers, n, next);
}
void qmp_nbd_server_stop(Error **errp)
{
- while (!QTAILQ_EMPTY(&close_notifiers)) {
- NBDCloseNotifier *cn = QTAILQ_FIRST(&close_notifiers);
- nbd_close_notifier(&cn->n, nbd_export_get_blockdev(cn->exp));
- }
+ nbd_export_close_all();
if (server_fd != -1) {
qemu_set_fd_handler2(server_fd, NULL, NULL, NULL, NULL);
diff --git a/include/block/block.h b/include/block/block.h
index 9e33c54..0708a48 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -196,7 +196,6 @@ int bdrv_reopen_prepare(BDRVReopenState *reopen_state,
void bdrv_reopen_commit(BDRVReopenState *reopen_state);
void bdrv_reopen_abort(BDRVReopenState *reopen_state);
void bdrv_close(BlockDriverState *bs);
-void bdrv_add_close_notifier(BlockDriverState *bs, Notifier *notify);
int bdrv_read(BlockDriverState *bs, int64_t sector_num,
uint8_t *buf, int nb_sectors);
int bdrv_read_unthrottled(BlockDriverState *bs, int64_t sector_num,
diff --git a/include/block/block_int.h b/include/block/block_int.h
index 8a40309..376ca2f 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -350,8 +350,6 @@ struct BlockDriverState {
BlockDriverState *backing_hd;
BlockDriverState *file;
- NotifierList close_notifiers;
-
/* Callback before write request is processed */
NotifierWithReturnList before_write_notifiers;
diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h
index e234aca..dc1e217 100644
--- a/include/sysemu/block-backend.h
+++ b/include/sysemu/block-backend.h
@@ -158,7 +158,7 @@ void blk_remove_aio_context_notifier(BlockBackend *blk,
void *),
void (*detach_aio_context)(void *),
void *opaque);
-void blk_add_close_notifier(BlockBackend *blk, Notifier *notify);
+void blk_add_remove_bs_notifier(BlockBackend *blk, Notifier *notify);
void blk_io_plug(BlockBackend *blk);
void blk_io_unplug(BlockBackend *blk);
BlockAcctStats *blk_get_stats(BlockBackend *blk);
diff --git a/nbd.c b/nbd.c
index 71159af..02ee686 100644
--- a/nbd.c
+++ b/nbd.c
@@ -964,9 +964,25 @@ static void blk_aio_detach(void *opaque)
exp->ctx = NULL;
}
+typedef struct NBDCloseNotifier {
+ Notifier n;
+ NBDExport *exp;
+ QTAILQ_ENTRY(NBDCloseNotifier) next;
+} NBDCloseNotifier;
+
+static QTAILQ_HEAD(, NBDCloseNotifier) eject_notifiers =
+ QTAILQ_HEAD_INITIALIZER(eject_notifiers);
+
+static void nbd_close_notifier(Notifier *n, void *data)
+{
+ NBDCloseNotifier *cn = DO_UPCAST(NBDCloseNotifier, n, n);
+ nbd_export_close(cn->exp);
+}
+
NBDExport *nbd_export_new(BlockBackend *blk, off_t dev_offset, off_t size,
uint32_t nbdflags, void (*close)(NBDExport *))
{
+ NBDCloseNotifier *eject_notifier = g_new0(NBDCloseNotifier, 1);
NBDExport *exp = g_malloc0(sizeof(NBDExport));
exp->refcount = 1;
QTAILQ_INIT(&exp->clients);
@@ -978,6 +994,13 @@ NBDExport *nbd_export_new(BlockBackend *blk, off_t dev_offset, off_t size,
exp->ctx = blk_get_aio_context(blk);
blk_ref(blk);
blk_add_aio_context_notifier(blk, blk_aio_attached, blk_aio_detach, exp);
+
+ eject_notifier->n.notify = nbd_close_notifier;
+ eject_notifier->exp = exp;
+ QTAILQ_INSERT_TAIL(&eject_notifiers, eject_notifier, next);
+
+ blk_add_remove_bs_notifier(blk, &eject_notifier->n);
+
/*
* NBD exports are used for non-shared storage migration. Make sure
* that BDRV_O_INCOMING is cleared and the image is ready for write
@@ -1022,6 +1045,7 @@ void nbd_export_set_name(NBDExport *exp, const char *name)
void nbd_export_close(NBDExport *exp)
{
+ NBDCloseNotifier *eject_notifier;
NBDClient *client, *next;
nbd_export_get(exp);
@@ -1031,6 +1055,17 @@ void nbd_export_close(NBDExport *exp)
nbd_export_set_name(exp, NULL);
nbd_export_put(exp);
if (exp->blk) {
+ QTAILQ_FOREACH(eject_notifier, &eject_notifiers, next) {
+ if (eject_notifier->exp == exp) {
+ break;
+ }
+ }
+ assert(eject_notifier);
+
+ notifier_remove(&eject_notifier->n);
+ QTAILQ_REMOVE(&eject_notifiers, eject_notifier, next);
+ g_free(eject_notifier);
+
blk_remove_aio_context_notifier(exp->blk, blk_aio_attached,
blk_aio_detach, exp);
blk_unref(exp->blk);
--
2.1.0
next prev parent reply other threads:[~2015-02-09 18:38 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-09 18:38 [Qemu-devel] [PATCH v2 00/22] block: Rework bdrv_close_all() Max Reitz
2015-02-09 18:38 ` [Qemu-devel] [PATCH v2 01/22] iotests: Move _filter_nbd into common.filter Max Reitz
2015-02-16 19:31 ` Eric Blake
2015-02-09 18:38 ` [Qemu-devel] [PATCH v2 02/22] iotests: Do not redirect qemu's stderr Max Reitz
2015-02-09 18:38 ` [Qemu-devel] [PATCH v2 03/22] iotests: Add test for eject under NBD server Max Reitz
2015-02-09 18:38 ` [Qemu-devel] [PATCH v2 04/22] quorum: Fix close path Max Reitz
2015-02-09 18:38 ` Max Reitz [this message]
2015-02-09 18:38 ` [Qemu-devel] [PATCH v2 06/22] block: Add bdrv_close_all() notifiers Max Reitz
2015-02-09 18:38 ` [Qemu-devel] [PATCH v2 07/22] block: Add bdrv_close_all() handlers Max Reitz
2015-02-13 23:02 ` Max Reitz
2015-02-09 18:38 ` [Qemu-devel] [PATCH v2 08/22] block: Use blk_remove_bs() in blk_delete() Max Reitz
2015-02-09 18:38 ` [Qemu-devel] [PATCH v2 09/22] blockdev: Use blk_remove_bs() in do_drive_del() Max Reitz
2015-02-09 18:38 ` [Qemu-devel] [PATCH v2 10/22] block: Make bdrv_close() static Max Reitz
2015-02-09 18:38 ` [Qemu-devel] [PATCH v2 11/22] block: Add blk_name_taken() Max Reitz
2015-02-09 18:38 ` [Qemu-devel] [PATCH v2 12/22] block: Add blk_next_inserted() Max Reitz
2015-02-09 18:38 ` [Qemu-devel] [PATCH v2 13/22] block: Add blk_commit_all() and blk_invalidate_cache_all() Max Reitz
2015-02-09 18:38 ` [Qemu-devel] [PATCH v2 14/22] block: Use BlockBackend more Max Reitz
2015-02-09 18:38 ` [Qemu-devel] [PATCH v2 15/22] blockdev: Add list of monitor-owned BlockBackends Max Reitz
2015-02-09 18:38 ` [Qemu-devel] [PATCH v2 16/22] blockdev: Remove blk_hide_on_behalf_of_do_drive_del() Max Reitz
2015-02-09 18:38 ` [Qemu-devel] [PATCH v2 17/22] block: Make bdrv_drain_one() public Max Reitz
2015-02-09 18:38 ` [Qemu-devel] [PATCH v2 18/22] block: Move some bdrv_*_all() functions to BB Max Reitz
2015-02-09 18:38 ` [Qemu-devel] [PATCH v2 19/22] block: Remove bdrv_states Max Reitz
2015-02-09 18:38 ` [Qemu-devel] [PATCH v2 20/22] blockdev: Keep track of monitor-owned BDS Max Reitz
2015-02-09 18:38 ` [Qemu-devel] [PATCH v2 21/22] block: Strip down bdrv_close_all() Max Reitz
2015-02-09 18:38 ` [Qemu-devel] [PATCH v2 22/22] iotests: Add test for multiple BB on BDS tree Max Reitz
2015-02-10 8:23 ` [Qemu-devel] [PATCH v2 00/22] block: Rework bdrv_close_all() Paolo Bonzini
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=1423507124-29809-6-git-send-email-mreitz@redhat.com \
--to=mreitz@redhat.com \
--cc=kwolf@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/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).