qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-block] [PATCH v8 12/16] blockdev: Keep track of monitor-owned


From: Kevin Wolf
Subject: Re: [Qemu-block] [PATCH v8 12/16] blockdev: Keep track of monitor-owned BDS
Date: Fri, 29 Jan 2016 14:49:47 +0100
User-agent: Mutt/1.5.21 (2010-09-15)

Am 29.01.2016 um 14:44 hat Max Reitz geschrieben:
> On 28.01.2016 04:33, Fam Zheng wrote:
> > On Wed, 01/27 18:59, Max Reitz wrote:
> >> Signed-off-by: Max Reitz <address@hidden>
> >> ---
> >>  blockdev.c                             | 26 ++++++++++++++++++++++++++
> >>  include/block/block_int.h              |  4 ++++
> >>  stubs/Makefile.objs                    |  1 +
> >>  stubs/blockdev-close-all-bdrv-states.c |  5 +++++
> >>  4 files changed, 36 insertions(+)
> >>  create mode 100644 stubs/blockdev-close-all-bdrv-states.c
> >>
> >> diff --git a/blockdev.c b/blockdev.c
> >> index 09d4621..ac93f43 100644
> >> --- a/blockdev.c
> >> +++ b/blockdev.c
> >> @@ -50,6 +50,9 @@
> >>  #include "trace.h"
> >>  #include "sysemu/arch_init.h"
> >>  
> >> +static QTAILQ_HEAD(, BlockDriverState) monitor_bdrv_states =
> >> +    QTAILQ_HEAD_INITIALIZER(monitor_bdrv_states);
> >> +
> >>  static const char *const if_name[IF_COUNT] = {
> >>      [IF_NONE] = "none",
> >>      [IF_IDE] = "ide",
> >> @@ -702,6 +705,19 @@ fail:
> >>      return NULL;
> >>  }
> >>  
> >> +void blockdev_close_all_bdrv_states(void)
> >> +{
> >> +    BlockDriverState *bs, *next_bs;
> >> +
> >> +    QTAILQ_FOREACH_SAFE(bs, &monitor_bdrv_states, monitor_list, next_bs) {
> >> +        AioContext *ctx = bdrv_get_aio_context(bs);
> >> +
> >> +        aio_context_acquire(ctx);
> >> +        bdrv_unref(bs);
> >> +        aio_context_release(ctx);
> >> +    }
> >> +}
> >> +
> >>  static void qemu_opt_rename(QemuOpts *opts, const char *from, const char 
> >> *to,
> >>                              Error **errp)
> >>  {
> >> @@ -3875,12 +3891,15 @@ void qmp_blockdev_add(BlockdevOptions *options, 
> >> Error **errp)
> >>          if (!bs) {
> >>              goto fail;
> >>          }
> >> +
> >> +        QTAILQ_INSERT_TAIL(&monitor_bdrv_states, bs, monitor_list);
> >>      }
> >>  
> >>      if (bs && bdrv_key_required(bs)) {
> >>          if (blk) {
> >>              blk_unref(blk);
> >>          } else {
> >> +            QTAILQ_REMOVE(&monitor_bdrv_states, bs, monitor_list);
> >>              bdrv_unref(bs);
> >>          }
> >>          error_setg(errp, "blockdev-add doesn't support encrypted 
> >> devices");
> >> @@ -3945,11 +3964,18 @@ void qmp_x_blockdev_del(bool has_id, const char 
> >> *id,
> >>                         bdrv_get_device_or_node_name(bs));
> >>              goto out;
> >>          }
> >> +
> >> +        if (!blk && !bs->monitor_list.tqe_prev) {
> >> +            error_setg(errp, "Node %s is not owned by the monitor",
> >> +                       bs->node_name);
> >> +            goto out;
> >> +        }
> > 
> > Is this an extra restriction added by this patch?
> 
> I hope not. This is just an additional check that should not change
> behavior; if it does, we did something wrong.

Actually, if you were to respin the series, you could remove the check
that it replaces:

    if (bs->refcnt > 1 || !QLIST_EMPTY(&bs->parents)) {

The QLIST_EMPTY() check is trying to achieve the same as what you
introduce in a clean way now. It doesn't hurt at the moment, but I had
to get rid of the QLIST_EMPTY() check when I tried to convert BB to
BdrvChild.

Kevin

Attachment: pgpAvpXb0Lyj5.pgp
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]