qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Fam Zheng <famz@redhat.com>
To: Kevin Wolf <kwolf@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PULL 04/54] block: Add reference parameter to bdrv_open()
Date: Sun, 23 Feb 2014 09:04:27 +0800	[thread overview]
Message-ID: <20140223010427.GA3986@T430.redhat.com> (raw)
In-Reply-To: <1393020771-32712-5-git-send-email-kwolf@redhat.com>

On Fri, 02/21 23:12, Kevin Wolf wrote:
> From: Max Reitz <mreitz@redhat.com>
> 
> Allow bdrv_open() to handle references to existing block devices just as
> bdrv_file_open() is already capable of.
> 
> Signed-off-by: Max Reitz <mreitz@redhat.com>
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
>  block.c               | 44 +++++++++++++++++++++++++++++++++++++-------
>  block/qcow2.c         |  4 ++--
>  block/vmdk.c          |  3 ++-
>  block/vvfat.c         |  2 +-
>  blockdev.c            | 12 ++++++------
>  hw/block/xen_disk.c   |  4 ++--
>  include/block/block.h |  5 +++--
>  qemu-img.c            |  8 ++++----
>  qemu-io.c             |  4 +++-
>  qemu-nbd.c            |  2 +-
>  10 files changed, 61 insertions(+), 27 deletions(-)
> 
> diff --git a/block.c b/block.c
> index c39bd3d..86a32e7 100644
> --- a/block.c
> +++ b/block.c
> @@ -1046,7 +1046,7 @@ int bdrv_file_open(BlockDriverState **pbs, const char *filename,
>      }
>  
>      if (!drv->bdrv_file_open) {
> -        ret = bdrv_open(&bs, filename, options, flags, drv, &local_err);
> +        ret = bdrv_open(&bs, filename, NULL, options, flags, drv, &local_err);
>          options = NULL;
>      } else {
>          ret = bdrv_open_common(bs, NULL, options, flags, drv, &local_err);
> @@ -1125,7 +1125,7 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp)
>  
>      assert(bs->backing_hd == NULL);
>      ret = bdrv_open(&bs->backing_hd,
> -                    *backing_filename ? backing_filename : NULL, options,
> +                    *backing_filename ? backing_filename : NULL, NULL, options,
>                      back_flags, back_drv, &local_err);
>      if (ret < 0) {
>          bs->backing_hd = NULL;
> @@ -1206,7 +1206,7 @@ int bdrv_open_image(BlockDriverState **pbs, const char *filename,
>              goto done;
>          }
>  
> -        ret = bdrv_open(pbs, filename, image_options, flags, NULL, errp);
> +        ret = bdrv_open(pbs, filename, NULL, image_options, flags, NULL, errp);
>      } else {
>          ret = bdrv_file_open(pbs, filename, reference, image_options, flags,
>                               errp);
> @@ -1227,9 +1227,14 @@ done:
>   *
>   * If *pbs is NULL, a new BDS will be created with a pointer to it stored there.
>   * If it is not NULL, the referenced BDS will be reused.
> + *
> + * The reference parameter may be used to specify an existing block device which
> + * should be opened. If specified, neither options nor a filename may be given,
> + * nor can an existing BDS be reused (that is, *pbs has to be NULL).
>   */
> -int bdrv_open(BlockDriverState **pbs, const char *filename, QDict *options,
> -              int flags, BlockDriver *drv, Error **errp)
> +int bdrv_open(BlockDriverState **pbs, const char *filename,
> +              const char *reference, QDict *options, int flags,
> +              BlockDriver *drv, Error **errp)
>  {
>      int ret;
>      /* TODO: extra byte is a hack to ensure MAX_PATH space on Windows. */
> @@ -1240,6 +1245,31 @@ int bdrv_open(BlockDriverState **pbs, const char *filename, QDict *options,
>  
>      assert(pbs);
>  
> +    if (reference) {
> +        bool options_non_empty = options ? qdict_size(options) : false;
> +        QDECREF(options);
> +
> +        if (*pbs) {
> +            error_setg(errp, "Cannot reuse an existing BDS when referencing "
> +                       "another block device");
> +            return -EINVAL;
> +        }
> +
> +        if (filename || options_non_empty) {
> +            error_setg(errp, "Cannot reference an existing block device with "
> +                       "additional options or a new filename");
> +            return -EINVAL;
> +        }
> +
> +        bs = bdrv_lookup_bs(reference, reference, errp);
> +        if (!bs) {
> +            return -ENODEV;
> +        }
> +        bdrv_ref(bs);
> +        *pbs = bs;
> +        return 0;
> +    }
> +
>      if (*pbs) {
>          bs = *pbs;
>      } else {
> @@ -1268,7 +1298,7 @@ int bdrv_open(BlockDriverState **pbs, const char *filename, QDict *options,
>          /* Get the required size from the image */
>          QINCREF(options);
>          bs1 = NULL;
> -        ret = bdrv_open(&bs1, filename, options, BDRV_O_NO_BACKING,
> +        ret = bdrv_open(&bs1, filename, NULL, options, BDRV_O_NO_BACKING,
>                          drv, &local_err);
>          if (ret < 0) {
>              goto fail;
> @@ -5309,7 +5339,7 @@ void bdrv_img_create(const char *filename, const char *fmt,
>                  flags & ~(BDRV_O_RDWR | BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
>  
>              bs = NULL;
> -            ret = bdrv_open(&bs, backing_file->value.s, NULL, back_flags,
> +            ret = bdrv_open(&bs, backing_file->value.s, NULL, NULL, back_flags,
>                              backing_drv, &local_err);
>              if (ret < 0) {
>                  error_setg_errno(errp, -ret, "Could not open '%s': %s",
> diff --git a/block/qcow2.c b/block/qcow2.c
> index 309ea12..e2aa5c1 100644
> --- a/block/qcow2.c
> +++ b/block/qcow2.c
> @@ -1553,7 +1553,7 @@ static int qcow2_create2(const char *filename, int64_t total_size,
>       */
>      BlockDriver* drv = bdrv_find_format("qcow2");
>      assert(drv != NULL);
> -    ret = bdrv_open(&bs, filename, NULL,
> +    ret = bdrv_open(&bs, filename, NULL, NULL,
>          BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_NO_FLUSH, drv, &local_err);
>      if (ret < 0) {
>          error_propagate(errp, local_err);
> @@ -1604,7 +1604,7 @@ static int qcow2_create2(const char *filename, int64_t total_size,
>      bs = NULL;
>  
>      /* Reopen the image without BDRV_O_NO_FLUSH to flush it before returning */
> -    ret = bdrv_open(&bs, filename, NULL,
> +    ret = bdrv_open(&bs, filename, NULL, NULL,
>                      BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_NO_BACKING,
>                      drv, &local_err);
>      if (local_err) {
> diff --git a/block/vmdk.c b/block/vmdk.c
> index 0622db5..5df486f 100644
> --- a/block/vmdk.c
> +++ b/block/vmdk.c
> @@ -1756,7 +1756,8 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options,
>      }
>      if (backing_file) {
>          BlockDriverState *bs = NULL;
> -        ret = bdrv_open(&bs, backing_file, NULL, BDRV_O_NO_BACKING, NULL, errp);
> +        ret = bdrv_open(&bs, backing_file, NULL, NULL, BDRV_O_NO_BACKING, NULL,
> +                        errp);
>          if (ret != 0) {
>              goto exit;
>          }
> diff --git a/block/vvfat.c b/block/vvfat.c
> index 0a9f886..4bde3bd 100644
> --- a/block/vvfat.c
> +++ b/block/vvfat.c
> @@ -2937,7 +2937,7 @@ static int enable_write_target(BDRVVVFATState *s)
>      }
>  
>      s->qcow = NULL;
> -    ret = bdrv_open(&s->qcow, s->qcow_filename, NULL,
> +    ret = bdrv_open(&s->qcow, s->qcow_filename, NULL, NULL,
>              BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_NO_FLUSH, bdrv_qcow,
>              &local_err);
>      if (ret < 0) {
> diff --git a/blockdev.c b/blockdev.c
> index 056ec4c..357f760 100644
> --- a/blockdev.c
> +++ b/blockdev.c
> @@ -504,7 +504,7 @@ static DriveInfo *blockdev_init(const char *file, QDict *bs_opts,
>      bdrv_flags |= ro ? 0 : BDRV_O_RDWR;
>  
>      QINCREF(bs_opts);
> -    ret = bdrv_open(&dinfo->bdrv, file, bs_opts, bdrv_flags, drv, &error);
> +    ret = bdrv_open(&dinfo->bdrv, file, NULL, bs_opts, bdrv_flags, drv, &error);
>  
>      if (ret < 0) {
>          error_setg(errp, "could not open disk image %s: %s",
> @@ -1333,7 +1333,7 @@ static void external_snapshot_prepare(BlkTransactionState *common,
>      /* TODO Inherit bs->options or only take explicit options with an
>       * extended QMP command? */
>      assert(state->new_bs == NULL);
> -    ret = bdrv_open(&state->new_bs, new_image_file, options,
> +    ret = bdrv_open(&state->new_bs, new_image_file, NULL, options,
>                      flags | BDRV_O_NO_BACKING, drv, &local_err);
>      /* We will manually add the backing_hd field to the bs later */
>      if (ret != 0) {
> @@ -1582,7 +1582,7 @@ static void qmp_bdrv_open_encrypted(BlockDriverState *bs, const char *filename,
>      Error *local_err = NULL;
>      int ret;
>  
> -    ret = bdrv_open(&bs, filename, NULL, bdrv_flags, drv, &local_err);
> +    ret = bdrv_open(&bs, filename, NULL, NULL, bdrv_flags, drv, &local_err);
>      if (ret < 0) {
>          error_propagate(errp, local_err);
>          return;
> @@ -2019,7 +2019,7 @@ void qmp_drive_backup(const char *device, const char *target,
>      }
>  
>      target_bs = NULL;
> -    ret = bdrv_open(&target_bs, target, NULL, flags, drv, &local_err);
> +    ret = bdrv_open(&target_bs, target, NULL, NULL, flags, drv, &local_err);
>      if (ret < 0) {
>          error_propagate(errp, local_err);
>          return;
> @@ -2162,8 +2162,8 @@ void qmp_drive_mirror(const char *device, const char *target,
>       * file.
>       */
>      target_bs = NULL;
> -    ret = bdrv_open(&target_bs, target, NULL, flags | BDRV_O_NO_BACKING, drv,
> -                    &local_err);
> +    ret = bdrv_open(&target_bs, target, NULL, NULL, flags | BDRV_O_NO_BACKING,
> +                    drv, &local_err);
>      if (ret < 0) {
>          error_propagate(errp, local_err);
>          return;
> diff --git a/hw/block/xen_disk.c b/hw/block/xen_disk.c
> index 14e6d0b..61e6ff3 100644
> --- a/hw/block/xen_disk.c
> +++ b/hw/block/xen_disk.c
> @@ -813,8 +813,8 @@ static int blk_connect(struct XenDevice *xendev)
>              Error *local_err = NULL;
>              BlockDriver *drv = bdrv_find_whitelisted_format(blkdev->fileproto,
>                                                             readonly);
> -            if (bdrv_open(&blkdev->bs,
> -                          blkdev->filename, NULL, qflags, drv, &local_err) != 0)
> +            if (bdrv_open(&blkdev->bs, blkdev->filename, NULL, NULL, qflags,
> +                          drv, &local_err) != 0)
>              {
>                  xen_be_printf(&blkdev->xendev, 0, "error: %s\n",
>                                error_get_pretty(local_err));
> diff --git a/include/block/block.h b/include/block/block.h
> index 980869d..a421041 100644
> --- a/include/block/block.h
> +++ b/include/block/block.h
> @@ -190,8 +190,9 @@ int bdrv_open_image(BlockDriverState **pbs, const char *filename,
>                      QDict *options, const char *bdref_key, int flags,
>                      bool force_raw, bool allow_none, Error **errp);
>  int bdrv_open_backing_file(BlockDriverState *bs, QDict *options, Error **errp);
> -int bdrv_open(BlockDriverState **pbs, const char *filename, QDict *options,
> -              int flags, BlockDriver *drv, Error **errp);
> +int bdrv_open(BlockDriverState **pbs, const char *filename,
> +              const char *reference, QDict *options, int flags,
> +              BlockDriver *drv, Error **errp);
>  BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue *bs_queue,
>                                      BlockDriverState *bs, int flags);
>  int bdrv_reopen_multiple(BlockReopenQueue *bs_queue, Error **errp);
> diff --git a/qemu-img.c b/qemu-img.c
> index 59b1013..79ab3e8 100644
> --- a/qemu-img.c
> +++ b/qemu-img.c
> @@ -289,7 +289,7 @@ static BlockDriverState *bdrv_new_open(const char *filename,
>          drv = NULL;
>      }
>  
> -    ret = bdrv_open(&bs, filename, NULL, flags, drv, &local_err);
> +    ret = bdrv_open(&bs, filename, NULL, NULL, flags, drv, &local_err);
>      if (ret < 0) {
>          error_report("Could not open '%s': %s", filename,
>                       error_get_pretty(local_err));
> @@ -2312,7 +2312,7 @@ static int img_rebase(int argc, char **argv)
>  
>          bs_old_backing = bdrv_new("old_backing");
>          bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
> -        ret = bdrv_open(&bs_old_backing, backing_name, NULL, BDRV_O_FLAGS,
> +        ret = bdrv_open(&bs_old_backing, backing_name, NULL, NULL, BDRV_O_FLAGS,
>                          old_backing_drv, &local_err);
>          if (ret) {
>              error_report("Could not open old backing file '%s': %s",
> @@ -2322,8 +2322,8 @@ static int img_rebase(int argc, char **argv)
>          }
>          if (out_baseimg[0]) {
>              bs_new_backing = bdrv_new("new_backing");
> -            ret = bdrv_open(&bs_new_backing, out_baseimg, NULL, BDRV_O_FLAGS,
> -                        new_backing_drv, &local_err);
> +            ret = bdrv_open(&bs_new_backing, out_baseimg, NULL, NULL,
> +                            BDRV_O_FLAGS, new_backing_drv, &local_err);
>              if (ret) {
>                  error_report("Could not open new backing file '%s': %s",
>                               out_baseimg, error_get_pretty(local_err));
> diff --git a/qemu-io.c b/qemu-io.c
> index 8da8f6e..61d54c0 100644
> --- a/qemu-io.c
> +++ b/qemu-io.c
> @@ -68,7 +68,9 @@ static int openfile(char *name, int flags, int growable, QDict *opts)
>      } else {
>          qemuio_bs = bdrv_new("hda");
>  
> -        if (bdrv_open(&qemuio_bs, name, opts, flags, NULL, &local_err) < 0) {
> +        if (bdrv_open(&qemuio_bs, name, NULL, opts, flags, NULL, &local_err)
> +            < 0)
> +        {

checkpatch.pl is not happy with this open brace on new line.

Fam

  reply	other threads:[~2014-02-23  1:04 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-21 22:11 [Qemu-devel] [PULL 00/54] Block patches Kevin Wolf
2014-02-21 22:11 ` [Qemu-devel] [PULL 01/54] qcow2: Set zero flag for discarded clusters Kevin Wolf
2014-02-22  0:01   ` Eric Blake
2014-02-24  9:46     ` Kevin Wolf
2014-02-21 22:11 ` [Qemu-devel] [PULL 02/54] block: Fix bdrv_is_first_non_filter() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 03/54] block: Change BDS parameter of bdrv_open() to ** Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 04/54] block: Add reference parameter to bdrv_open() Kevin Wolf
2014-02-23  1:04   ` Fam Zheng [this message]
2014-02-21 22:12 ` [Qemu-devel] [PULL 05/54] block: Make bdrv_file_open() static Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 06/54] block: Reuse reference handling from bdrv_open() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 07/54] block: Remove bdrv_new() from bdrv_file_open() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 08/54] block: Handle bs->options in bdrv_open() only Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 09/54] block: Reuse success path from bdrv_open() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 10/54] block: Remove bdrv_open_image()'s force_raw option Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 11/54] nbd: produce a better error if neither host nor port is passed Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 12/54] nbd: correctly propagate errors Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 13/54] nbd: inline tcp_socket_incoming_spec into sole caller Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 14/54] nbd: move socket wrappers to qemu-nbd Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 15/54] iscsi: fix indentation Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 16/54] iscsi: correctly propagate errors in iscsi_open Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 17/54] gluster: default scheme to gluster:// and host to localhost Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 18/54] gluster: correctly propagate errors Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 19/54] cow: " Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 20/54] curl: " Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 21/54] qcow: " Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 22/54] qed: " Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 23/54] vhdx: " Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 24/54] vvfat: " Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 25/54] vmdk: extract vmdk_read_desc Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 26/54] vmdk: push vmdk_read_desc up to caller Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 27/54] vmdk: do not try opening a file as both image and descriptor Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 28/54] vmdk: correctly propagate errors Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 29/54] block: do not abuse EMEDIUMTYPE Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 30/54] vdi: say why an image is bad Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 31/54] qemu-option: has_help_option() and is_valid_option_list() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 32/54] qemu-img create: Support multiple -o options Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 33/54] qemu-img convert: " Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 34/54] qemu-img amend: " Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 35/54] qemu-img: Allow -o help with incomplete argument list Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 36/54] qemu-iotests: Check qemu-img command line parsing Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 37/54] qemu-config: Sections must consist of keys Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 38/54] qdict: Extract non-QDicts in qdict_array_split() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 39/54] check-qdict: Adjust test for qdict_array_split() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 40/54] check-qdict: Test termination of qdict_array_split() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 41/54] quorum: Create quorum.c, add QuorumChildRequest and QuorumAIOCB Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 42/54] quorum: Create BDRVQuorumState and BlkDriver and do init Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 43/54] quorum: Add quorum_aio_writev and its dependencies Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 44/54] blkverify: Extract qemu_iovec_clone() and qemu_iovec_compare() from blkverify Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 45/54] quorum: Add quorum_aio_readv Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 46/54] quorum: Add quorum mechanism Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 47/54] quorum: Add quorum_getlength() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 48/54] quorum: Add quorum_invalidate_cache() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 49/54] quorum: Add quorum_co_flush() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 50/54] quorum: Implement recursive .bdrv_recurse_is_first_non_filter in quorum Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 51/54] quorum: Add quorum_open() and quorum_close() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 52/54] quorum: Add unit test Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 53/54] quorum: Simplify quorum_open() Kevin Wolf
2014-02-21 22:12 ` [Qemu-devel] [PULL 54/54] iotests: Mixed quorum child device specifications Kevin Wolf
2014-02-25 11:53 ` [Qemu-devel] [PULL 00/54] Block patches Peter Maydell

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=20140223010427.GA3986@T430.redhat.com \
    --to=famz@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /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).