Paolo Bonzini <pbonz...@redhat.com> writes:

> 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 <kw...@redhat.com>
> Signed-off-by: Paolo Bonzini <pbonz...@redhat.com>
> ---
>  Makefile.objs |  4 ++--
>  block.c       | 19 ++++++++++++++-----
>  block.h       |  1 +
>  block_int.h   |  2 ++
>  4 file modificati, 19 inserzioni(+), 7 rimozioni(-)
>
> diff --git a/Makefile.objs b/Makefile.objs
> index 3f16d67..ca67885 100644
> --- a/Makefile.objs
> +++ b/Makefile.objs
> @@ -43,7 +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 blockjob.o aio.o aes.o qemu-config.o
> -block-obj-y += qemu-progress.o qemu-sockets.o uri.o
> +block-obj-y += qemu-progress.o qemu-sockets.o uri.o 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
> @@ -94,7 +94,7 @@ common-obj-y += bt-host.o bt-vhci.o
>  common-obj-y += dma-helpers.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-y += qtest.o
>  common-obj-y += vl.o
> diff --git a/block.c b/block.c
> index e95f613..56426a9 100644
> --- a/block.c
> +++ b/block.c
> @@ -30,6 +30,7 @@
>  #include "module.h"
>  #include "qjson.h"
>  #include "sysemu.h"
> +#include "notify.h"
>  #include "qemu-coroutine.h"
>  #include "qmp-commands.h"
>  #include "qemu-timer.h"
> @@ -312,9 +313,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;
> @@ -1098,12 +1106,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();

Dropping the bs->drv condition in a separate commit gives you a nice
place to explain why it's fine: the commit message.  I figure it is, but
it's not 100% obvious.

> +    notifier_list_notify(&bs->close_notifiers, bs);
>  
> +    if (bs->drv) {
>          if (bs == bs_snapshots) {
>              bs_snapshots = NULL;
>          }
[...]

Reply via email to