From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:47124) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TIhMq-0004jO-TD for qemu-devel@nongnu.org; Mon, 01 Oct 2012 10:53:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TIhMl-0002nc-Vq for qemu-devel@nongnu.org; Mon, 01 Oct 2012 10:53:08 -0400 Received: from mail-pb0-f45.google.com ([209.85.160.45]:52777) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TIhMl-0002ld-Po for qemu-devel@nongnu.org; Mon, 01 Oct 2012 10:53:03 -0400 Received: by mail-pb0-f45.google.com with SMTP id rp2so7872317pbb.4 for ; Mon, 01 Oct 2012 07:53:03 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Mon, 1 Oct 2012 16:52:22 +0200 Message-Id: <1349103144-6827-8-git-send-email-pbonzini@redhat.com> In-Reply-To: <1349103144-6827-1-git-send-email-pbonzini@redhat.com> References: <1349103144-6827-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH v2 7/9] block: add close notifiers List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: lcapitulino@redhat.com The first user of close notifiers will be the embedded NBD server. It is possible to use them to do some of the ad hoc processing (e.g. for block jobs and I/O limits) that is currently done by bdrv_close. Acked-by: Kevin Wolf Signed-off-by: Paolo Bonzini --- Makefile.objs | 3 ++- block.c | 19 ++++++++++++++----- block.h | 1 + block_int.h | 2 ++ 4 file modificati, 19 inserzioni(+), 6 rimozioni(-) diff --git a/Makefile.objs b/Makefile.objs index 03da150..124f783 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -43,6 +43,7 @@ coroutine-obj-$(CONFIG_WIN32) += coroutine-win32.o block-obj-y = cutils.o iov.o cache-utils.o qemu-option.o module.o async.o block-obj-y += nbd.o block.o aio.o aes.o qemu-config.o qemu-progress.o qemu-sockets.o +block-obj-y += notify.o block-obj-y += $(coroutine-obj-y) $(qobject-obj-y) $(version-obj-y) block-obj-$(CONFIG_POSIX) += posix-aio-compat.o block-obj-$(CONFIG_LINUX_AIO) += linux-aio.o @@ -92,7 +93,7 @@ common-obj-y += bt-host.o bt-vhci.o common-obj-y += iov.o acl.o common-obj-$(CONFIG_POSIX) += compatfd.o -common-obj-y += notify.o event_notifier.o +common-obj-y += event_notifier.o common-obj-y += qemu-timer.o qemu-timer-common.o common-obj-$(CONFIG_SLIRP) += slirp/ diff --git a/block.c b/block.c index 751ebdc..795d359 100644 --- a/block.c +++ b/block.c @@ -28,6 +28,7 @@ #include "block_int.h" #include "module.h" #include "qjson.h" +#include "notify.h" #include "qemu-coroutine.h" #include "qmp-commands.h" #include "qemu-timer.h" @@ -310,9 +311,16 @@ BlockDriverState *bdrv_new(const char *device_name) QTAILQ_INSERT_TAIL(&bdrv_states, bs, list); } bdrv_iostatus_disable(bs); + notifier_list_init(&bs->close_notifiers); + 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; @@ -1096,12 +1104,13 @@ void bdrv_reopen_abort(BDRVReopenState *reopen_state) void bdrv_close(BlockDriverState *bs) { bdrv_flush(bs); - if (bs->drv) { - if (bs->job) { - block_job_cancel_sync(bs->job); - } - bdrv_drain_all(); + if (bs->job) { + block_job_cancel_sync(bs->job); + } + bdrv_drain_all(); + notifier_list_notify(&bs->close_notifiers, bs); + if (bs->drv) { if (bs == bs_snapshots) { bs_snapshots = NULL; } diff --git a/block.h b/block.h index b1095d8..17d8b00 100644 --- a/block.h +++ b/block.h @@ -149,6 +149,7 @@ 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_attach_dev(BlockDriverState *bs, void *dev); void bdrv_attach_dev_nofail(BlockDriverState *bs, void *dev); void bdrv_detach_dev(BlockDriverState *bs, void *dev); diff --git a/block_int.h b/block_int.h index ac4245c..41754ce 100644 --- a/block_int.h +++ b/block_int.h @@ -299,6 +299,8 @@ struct BlockDriverState { BlockDriverState *backing_hd; BlockDriverState *file; + NotifierList close_notifiers; + /* number of in-flight copy-on-read requests */ unsigned int copy_on_read_in_flight; -- 1.7.12