diff mbox

[1/3] block: Add errp to bdrv_new()

Message ID 1397735592-802-2-git-send-email-kwolf@redhat.com
State New
Headers show

Commit Message

Kevin Wolf April 17, 2014, 11:53 a.m. UTC
This patch adds an errp parameter to bdrv_new() and updates all its
callers. The next patch will make use of this in order to check for
duplicate IDs. Most of the callers know that their ID is fine, so they
can simply assert that there is no error.

Behaviour doesn't change with this patch yet as bdrv_new() doesn't
actually assign errors to errp.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 block.c               | 8 +++++---
 block/iscsi.c         | 4 +++-
 block/vvfat.c         | 3 ++-
 blockdev.c            | 9 +++++++--
 hw/block/xen_disk.c   | 7 +++++--
 include/block/block.h | 2 +-
 qemu-img.c            | 9 ++++++---
 qemu-io.c             | 3 ++-
 qemu-nbd.c            | 4 +++-
 9 files changed, 34 insertions(+), 15 deletions(-)

Comments

Eric Blake April 17, 2014, 12:11 p.m. UTC | #1
On 04/17/2014 05:53 AM, Kevin Wolf wrote:
> This patch adds an errp parameter to bdrv_new() and updates all its
> callers. The next patch will make use of this in order to check for
> duplicate IDs. Most of the callers know that their ID is fine, so they
> can simply assert that there is no error.
> 
> Behaviour doesn't change with this patch yet as bdrv_new() doesn't
> actually assign errors to errp.
> 
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---

> @@ -1220,7 +1220,8 @@ void bdrv_append_temp_snapshot(BlockDriverState *bs, Error **errp)
>      qdict_put(snapshot_options, "file.filename",
>                qstring_from_str(tmp_filename));
>  
> -    bs_snapshot = bdrv_new("");
> +    bs_snapshot = bdrv_new("", &local_err);
> +    assert(!local_err);

Please write this as bdrv_new("", &error_abort) rather than as two
lines; throughout the patch.
Kevin Wolf April 17, 2014, 12:44 p.m. UTC | #2
Am 17.04.2014 um 14:11 hat Eric Blake geschrieben:
> On 04/17/2014 05:53 AM, Kevin Wolf wrote:
> > This patch adds an errp parameter to bdrv_new() and updates all its
> > callers. The next patch will make use of this in order to check for
> > duplicate IDs. Most of the callers know that their ID is fine, so they
> > can simply assert that there is no error.
> > 
> > Behaviour doesn't change with this patch yet as bdrv_new() doesn't
> > actually assign errors to errp.
> > 
> > Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> > ---
> 
> > @@ -1220,7 +1220,8 @@ void bdrv_append_temp_snapshot(BlockDriverState *bs, Error **errp)
> >      qdict_put(snapshot_options, "file.filename",
> >                qstring_from_str(tmp_filename));
> >  
> > -    bs_snapshot = bdrv_new("");
> > +    bs_snapshot = bdrv_new("", &local_err);
> > +    assert(!local_err);
> 
> Please write this as bdrv_new("", &error_abort) rather than as two
> lines; throughout the patch.

Ah, yes, I forgot that this exists. I'll change that.

Also, qemu-iotests noticed that not all of these assertions actually
hold true, so I need to respin the series anyway.

Kevin
diff mbox

Patch

diff --git a/block.c b/block.c
index 0ff5764..7784b68 100644
--- a/block.c
+++ b/block.c
@@ -332,7 +332,7 @@  void bdrv_register(BlockDriver *bdrv)
 }
 
 /* create a new block device (by default it is empty) */
-BlockDriverState *bdrv_new(const char *device_name)
+BlockDriverState *bdrv_new(const char *device_name, Error **errp)
 {
     BlockDriverState *bs;
 
@@ -1220,7 +1220,8 @@  void bdrv_append_temp_snapshot(BlockDriverState *bs, Error **errp)
     qdict_put(snapshot_options, "file.filename",
               qstring_from_str(tmp_filename));
 
-    bs_snapshot = bdrv_new("");
+    bs_snapshot = bdrv_new("", &local_err);
+    assert(!local_err);
     bs_snapshot->is_temporary = 1;
 
     ret = bdrv_open(&bs_snapshot, NULL, NULL, snapshot_options,
@@ -1287,7 +1288,8 @@  int bdrv_open(BlockDriverState **pbs, const char *filename,
     if (*pbs) {
         bs = *pbs;
     } else {
-        bs = bdrv_new("");
+        bs = bdrv_new("", &local_err);
+        assert(!local_err);
     }
 
     /* NULL means an empty set of options */
diff --git a/block/iscsi.c b/block/iscsi.c
index f425573..a722b57 100644
--- a/block/iscsi.c
+++ b/block/iscsi.c
@@ -1400,8 +1400,10 @@  static int iscsi_create(const char *filename, QEMUOptionParameter *options,
     BlockDriverState *bs;
     IscsiLun *iscsilun = NULL;
     QDict *bs_options;
+    Error *local_err = NULL;
 
-    bs = bdrv_new("");
+    bs = bdrv_new("", &local_err);
+    assert(!local_err);
 
     /* Read out options */
     while (options && options->name) {
diff --git a/block/vvfat.c b/block/vvfat.c
index 1978c9e..eb860f1 100644
--- a/block/vvfat.c
+++ b/block/vvfat.c
@@ -2947,7 +2947,8 @@  static int enable_write_target(BDRVVVFATState *s)
     unlink(s->qcow_filename);
 #endif
 
-    s->bs->backing_hd = bdrv_new("");
+    s->bs->backing_hd = bdrv_new("", &local_err);
+    assert(!local_err);
     s->bs->backing_hd->drv = &vvfat_write_target;
     s->bs->backing_hd->opaque = g_malloc(sizeof(void*));
     *(void**)s->bs->backing_hd->opaque = s;
diff --git a/blockdev.c b/blockdev.c
index 5dd01ea..3a11a62 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -461,7 +461,11 @@  static DriveInfo *blockdev_init(const char *file, QDict *bs_opts,
     /* init */
     dinfo = g_malloc0(sizeof(*dinfo));
     dinfo->id = g_strdup(qemu_opts_id(opts));
-    dinfo->bdrv = bdrv_new(dinfo->id);
+    dinfo->bdrv = bdrv_new(dinfo->id, &error);
+    if (error) {
+        error_propagate(errp, error);
+        goto bdrv_new_err;
+    }
     dinfo->bdrv->open_flags = snapshot ? BDRV_O_SNAPSHOT : 0;
     dinfo->bdrv->read_only = ro;
     dinfo->refcount = 1;
@@ -523,8 +527,9 @@  static DriveInfo *blockdev_init(const char *file, QDict *bs_opts,
 
 err:
     bdrv_unref(dinfo->bdrv);
-    g_free(dinfo->id);
     QTAILQ_REMOVE(&drives, dinfo, next);
+bdrv_new_err:
+    g_free(dinfo->id);
     g_free(dinfo);
 early_err:
     QDECREF(bs_opts);
diff --git a/hw/block/xen_disk.c b/hw/block/xen_disk.c
index bc061e6..a8fea72 100644
--- a/hw/block/xen_disk.c
+++ b/hw/block/xen_disk.c
@@ -817,11 +817,14 @@  static int blk_connect(struct XenDevice *xendev)
     index = (blkdev->xendev.dev - 202 * 256) / 16;
     blkdev->dinfo = drive_get(IF_XEN, 0, index);
     if (!blkdev->dinfo) {
+        Error *local_err = NULL;
         /* setup via xenbus -> create new block driver instance */
         xen_be_printf(&blkdev->xendev, 2, "create new bdrv (xenbus setup)\n");
-        blkdev->bs = bdrv_new(blkdev->dev);
+        blkdev->bs = bdrv_new(blkdev->dev, &local_err);
+        if (local_err) {
+            blkdev->bs = NULL;
+        }
         if (blkdev->bs) {
-            Error *local_err = NULL;
             BlockDriver *drv = bdrv_find_whitelisted_format(blkdev->fileproto,
                                                            readonly);
             if (bdrv_open(&blkdev->bs, blkdev->filename, NULL, NULL, qflags,
diff --git a/include/block/block.h b/include/block/block.h
index 2b51eec..c12808a 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -180,7 +180,7 @@  int bdrv_create(BlockDriver *drv, const char* filename,
     QEMUOptionParameter *options, Error **errp);
 int bdrv_create_file(const char* filename, QEMUOptionParameter *options,
                      Error **errp);
-BlockDriverState *bdrv_new(const char *device_name);
+BlockDriverState *bdrv_new(const char *device_name, Error **errp);
 void bdrv_make_anon(BlockDriverState *bs);
 void bdrv_swap(BlockDriverState *bs_new, BlockDriverState *bs_old);
 void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top);
diff --git a/qemu-img.c b/qemu-img.c
index 8455994..fd3d9d8 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -274,7 +274,8 @@  static BlockDriverState *bdrv_new_open(const char *filename,
     Error *local_err = NULL;
     int ret;
 
-    bs = bdrv_new("image");
+    bs = bdrv_new("image", &local_err);
+    assert(!local_err);
 
     if (fmt) {
         drv = bdrv_find_format(fmt);
@@ -2344,7 +2345,8 @@  static int img_rebase(int argc, char **argv)
     } else {
         char backing_name[1024];
 
-        bs_old_backing = bdrv_new("old_backing");
+        bs_old_backing = bdrv_new("old_backing", &local_err);
+        assert(!local_err);
         bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
         ret = bdrv_open(&bs_old_backing, backing_name, NULL, NULL, BDRV_O_FLAGS,
                         old_backing_drv, &local_err);
@@ -2355,7 +2357,8 @@  static int img_rebase(int argc, char **argv)
             goto out;
         }
         if (out_baseimg[0]) {
-            bs_new_backing = bdrv_new("new_backing");
+            bs_new_backing = bdrv_new("new_backing", &local_err);
+            assert(!local_err);
             ret = bdrv_open(&bs_new_backing, out_baseimg, NULL, NULL,
                             BDRV_O_FLAGS, new_backing_drv, &local_err);
             if (ret) {
diff --git a/qemu-io.c b/qemu-io.c
index 5d7b53f..88cb80e 100644
--- a/qemu-io.c
+++ b/qemu-io.c
@@ -67,7 +67,8 @@  static int openfile(char *name, int flags, int growable, QDict *opts)
             return 1;
         }
     } else {
-        qemuio_bs = bdrv_new("hda");
+        qemuio_bs = bdrv_new("hda", &local_err);
+        assert(!local_err);
 
         if (bdrv_open(&qemuio_bs, name, NULL, opts, flags, NULL, &local_err)
             < 0)
diff --git a/qemu-nbd.c b/qemu-nbd.c
index 899e67c..5c8fc3d 100644
--- a/qemu-nbd.c
+++ b/qemu-nbd.c
@@ -657,7 +657,9 @@  int main(int argc, char **argv)
         drv = NULL;
     }
 
-    bs = bdrv_new("hda");
+    bs = bdrv_new("hda", &local_err);
+    assert(!local_err);
+
     srcpath = argv[optind];
     ret = bdrv_open(&bs, srcpath, NULL, NULL, flags, drv, &local_err);
     if (ret < 0) {