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

Re: [Xen-devel] [Qemu-devel] [QEMU PATCH] block: Remove blk_attach_dev_legacy() / legacy_dev code



Thomas Huth <thuth@xxxxxxxxxx> writes:

> The last user of blk_attach_dev_legacy() is the code in xen_disk.c.
> It passes a pointer to a XenBlkDev as second parameter. XenBlkDev
> is derived from XenDevice which in turn is derived from DeviceState
> since commit 3a6c9172ac5951e ("xen: create qdev for each backend device").
> Thus the code can also simply use blk_attach_dev() with a pointer
> to the DeviceState instead.
> So we can finally remove all code related to the "legacy_dev" flag, too,
> and turn the related "void *" in block-backend.c into "DeviceState *"
> to fix some of the remaining TODOs there.
>
> Signed-off-by: Thomas Huth <thuth@xxxxxxxxxx>
> ---
>  Note: I haven't tested the Xen code since I don't have a working Xen
>  installation at hand. I'd appreciate if someone could check it...

Same here.  All I can do is review.

>  block/block-backend.c          | 54 
> +++++++-----------------------------------
>  hw/block/xen_disk.c            |  6 +++--
>  include/sysemu/block-backend.h |  5 ++--
>  3 files changed, 15 insertions(+), 50 deletions(-)
>
> diff --git a/block/block-backend.c b/block/block-backend.c
> index 60d37a0..3c3118f 100644
> --- a/block/block-backend.c
> +++ b/block/block-backend.c
> @@ -47,9 +47,7 @@ struct BlockBackend {
>      QTAILQ_ENTRY(BlockBackend) monitor_link; /* for monitor_block_backends */
>      BlockBackendPublic public;
>  
> -    void *dev;                  /* attached device model, if any */
> -    bool legacy_dev;            /* true if dev is not a DeviceState */
> -    /* TODO change to DeviceState when all users are qdevified */
> +    DeviceState *dev;           /* attached device model, if any */
>      const BlockDevOps *dev_ops;
>      void *dev_opaque;
>  
> @@ -836,7 +834,11 @@ void blk_get_perm(BlockBackend *blk, uint64_t *perm, 
> uint64_t *shared_perm)
>      *shared_perm = blk->shared_perm;
>  }
>  
> -static int blk_do_attach_dev(BlockBackend *blk, void *dev)
> +/*
> + * Attach device model @dev to @blk.
> + * Return 0 on success, -EBUSY when a device model is attached already.
> + */
> +int blk_attach_dev(BlockBackend *blk, DeviceState *dev)
>  {
>      if (blk->dev) {
>          return -EBUSY;
> @@ -851,40 +853,16 @@ static int blk_do_attach_dev(BlockBackend *blk, void 
> *dev)
>  
>      blk_ref(blk);
>      blk->dev = dev;
> -    blk->legacy_dev = false;
>      blk_iostatus_reset(blk);
>  
>      return 0;
>  }
>  
>  /*
> - * Attach device model @dev to @blk.
> - * Return 0 on success, -EBUSY when a device model is attached already.
> - */
> -int blk_attach_dev(BlockBackend *blk, DeviceState *dev)
> -{
> -    return blk_do_attach_dev(blk, dev);
> -}
> -
> -/*
> - * Attach device model @dev to @blk.
> - * @blk must not have a device model attached already.
> - * TODO qdevified devices don't use this, remove when devices are qdevified
> - */
> -void blk_attach_dev_legacy(BlockBackend *blk, void *dev)
> -{
> -    if (blk_do_attach_dev(blk, dev) < 0) {
> -        abort();
> -    }
> -    blk->legacy_dev = true;
> -}
> -
> -/*
>   * Detach device model @dev from @blk.
>   * @dev must be currently attached to @blk.
>   */
> -void blk_detach_dev(BlockBackend *blk, void *dev)
> -/* TODO change to DeviceState *dev when all users are qdevified */
> +void blk_detach_dev(BlockBackend *blk, DeviceState *dev)
>  {
>      assert(blk->dev == dev);
>      blk->dev = NULL;
> @@ -898,8 +876,7 @@ void blk_detach_dev(BlockBackend *blk, void *dev)
>  /*
>   * Return the device model attached to @blk if any, else null.
>   */
> -void *blk_get_attached_dev(BlockBackend *blk)
> -/* TODO change to return DeviceState * when all users are qdevified */
> +DeviceState *blk_get_attached_dev(BlockBackend *blk)
>  {
>      return blk->dev;
>  }
> @@ -908,10 +885,7 @@ void *blk_get_attached_dev(BlockBackend *blk)
>   * device attached to the BlockBackend. */
>  char *blk_get_attached_dev_id(BlockBackend *blk)
>  {
> -    DeviceState *dev;
> -
> -    assert(!blk->legacy_dev);
> -    dev = blk->dev;
> +    DeviceState *dev = blk->dev;
>  
>      if (!dev) {
>          return g_strdup("");
> @@ -949,11 +923,6 @@ BlockBackend *blk_by_dev(void *dev)
>  void blk_set_dev_ops(BlockBackend *blk, const BlockDevOps *ops,
>                       void *opaque)
>  {
> -    /* All drivers that use blk_set_dev_ops() are qdevified and we want to 
> keep
> -     * it that way, so we can assume blk->dev, if present, is a DeviceState 
> if
> -     * blk->dev_ops is set. Non-device users may use dev_ops without device. 
> */
> -    assert(!blk->legacy_dev);
> -
>      blk->dev_ops = ops;
>      blk->dev_opaque = opaque;
>  
> @@ -979,8 +948,6 @@ void blk_dev_change_media_cb(BlockBackend *blk, bool 
> load, Error **errp)
>          bool tray_was_open, tray_is_open;
>          Error *local_err = NULL;
>  
> -        assert(!blk->legacy_dev);
> -
>          tray_was_open = blk_dev_is_tray_open(blk);
>          blk->dev_ops->change_media_cb(blk->dev_opaque, load, &local_err);
>          if (local_err) {
> @@ -1779,9 +1746,6 @@ void blk_eject(BlockBackend *blk, bool eject_flag)
>      BlockDriverState *bs = blk_bs(blk);
>      char *id;
>  
> -    /* blk_eject is only called by qdevified devices */
> -    assert(!blk->legacy_dev);
> -
>      if (bs) {
>          bdrv_eject(bs, eject_flag);
>      }
> diff --git a/hw/block/xen_disk.c b/hw/block/xen_disk.c
> index 36eff94..9605caf 100644
> --- a/hw/block/xen_disk.c
> +++ b/hw/block/xen_disk.c
> @@ -801,7 +801,9 @@ static int blk_connect(struct XenDevice *xendev)
>           * so we can blk_unref() unconditionally */
>          blk_ref(blkdev->blk);
>      }
> -    blk_attach_dev_legacy(blkdev->blk, blkdev);
> +    if (blk_attach_dev(blkdev->blk, DEVICE(blkdev)) < 0) {
> +        return -1;
> +    }

Other error returns in this function call xen_pv_printf() first.  Should
this one, too?

>      blkdev->file_size = blk_getlength(blkdev->blk);
>      if (blkdev->file_size < 0) {
>          BlockDriverState *bs = blk_bs(blkdev->blk);
> @@ -951,7 +953,7 @@ static void blk_disconnect(struct XenDevice *xendev)
>  
>      if (blkdev->blk) {
>          blk_set_aio_context(blkdev->blk, qemu_get_aio_context());
> -        blk_detach_dev(blkdev->blk, blkdev);
> +        blk_detach_dev(blkdev->blk, DEVICE(blkdev));
>          blk_unref(blkdev->blk);
>          blkdev->blk = NULL;
>      }
> diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h
> index c96bcde..39507d6 100644
> --- a/include/sysemu/block-backend.h
> +++ b/include/sysemu/block-backend.h
> @@ -110,9 +110,8 @@ void blk_iostatus_disable(BlockBackend *blk);
>  void blk_iostatus_reset(BlockBackend *blk);
>  void blk_iostatus_set_err(BlockBackend *blk, int error);
>  int blk_attach_dev(BlockBackend *blk, DeviceState *dev);
> -void blk_attach_dev_legacy(BlockBackend *blk, void *dev);
> -void blk_detach_dev(BlockBackend *blk, void *dev);
> -void *blk_get_attached_dev(BlockBackend *blk);
> +void blk_detach_dev(BlockBackend *blk, DeviceState *dev);
> +DeviceState *blk_get_attached_dev(BlockBackend *blk);
>  char *blk_get_attached_dev_id(BlockBackend *blk);
>  BlockBackend *blk_by_dev(void *dev);
>  BlockBackend *blk_by_qdev_id(const char *id, Error **errp);

I didn't verify your claim that DEVICE(blkdev) is okay.  Apart from
that, looks good to me.

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.