diff options
author | Max Reitz <mreitz@redhat.com> | 2016-03-16 19:54:38 +0100 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2016-03-17 15:47:56 +0100 |
commit | efaa7c4eeb7490c6f37f34fbc77e91f29363eebd (patch) | |
tree | 20c63d015aed0a3032b58f641c9d43f9ce8b8b8e /block | |
parent | e5e785500bf1ca286f9069bc13f3ed8cb2e9eb8a (diff) |
blockdev: Split monitor reference from BB creation
Before this patch, blk_new() automatically assigned a name to the new
BlockBackend and considered it referenced by the monitor. This patch
removes the implicit monitor_add_blk() call from blk_new() (and
consequently the monitor_remove_blk() call from blk_delete(), too) and
thus blk_new() (and related functions) no longer take a BB name
argument.
In fact, there is only a single point where blk_new()/blk_new_open() is
called and the new BB is monitor-owned, and that is in blockdev_init().
Besides thus relieving us from having to invent names for all of the BBs
we use in qemu-img, this fixes a bug where qemu cannot create a new
image if there already is a monitor-owned BB named "image".
If a BB and its BDS tree are created in a single operation, as of this
patch the BDS tree will be created before the BB is given a name
(whereas it was the other way around before). This results in minor
change to the output of iotest 087, whose reference output is amended
accordingly.
Signed-off-by: Max Reitz <mreitz@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'block')
-rw-r--r-- | block/block-backend.c | 26 | ||||
-rw-r--r-- | block/parallels.c | 2 | ||||
-rw-r--r-- | block/qcow.c | 2 | ||||
-rw-r--r-- | block/qcow2.c | 6 | ||||
-rw-r--r-- | block/qed.c | 2 | ||||
-rw-r--r-- | block/sheepdog.c | 4 | ||||
-rw-r--r-- | block/vdi.c | 2 | ||||
-rw-r--r-- | block/vhdx.c | 2 | ||||
-rw-r--r-- | block/vmdk.c | 6 | ||||
-rw-r--r-- | block/vpc.c | 2 |
10 files changed, 21 insertions, 33 deletions
diff --git a/block/block-backend.c b/block/block-backend.c index a5b950c771..9ed39121b5 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -80,13 +80,11 @@ static QTAILQ_HEAD(, BlockBackend) monitor_block_backends = QTAILQ_HEAD_INITIALIZER(monitor_block_backends); /* - * Create a new BlockBackend with @name, with a reference count of one. - * @name must not be null or empty. - * Fail if a BlockBackend with this name already exists. + * Create a new BlockBackend with a reference count of one. * Store an error through @errp on failure, unless it's null. * Return the new BlockBackend on success, null on failure. */ -BlockBackend *blk_new(const char *name, Error **errp) +BlockBackend *blk_new(Error **errp) { BlockBackend *blk; @@ -94,14 +92,7 @@ BlockBackend *blk_new(const char *name, Error **errp) blk->refcnt = 1; notifier_list_init(&blk->remove_bs_notifiers); notifier_list_init(&blk->insert_bs_notifiers); - QTAILQ_INSERT_TAIL(&block_backends, blk, link); - - if (!monitor_add_blk(blk, name, errp)) { - blk_unref(blk); - return NULL; - } - return blk; } @@ -109,12 +100,12 @@ BlockBackend *blk_new(const char *name, Error **errp) * Create a new BlockBackend with a new BlockDriverState attached. * Otherwise just like blk_new(), which see. */ -BlockBackend *blk_new_with_bs(const char *name, Error **errp) +BlockBackend *blk_new_with_bs(Error **errp) { BlockBackend *blk; BlockDriverState *bs; - blk = blk_new(name, errp); + blk = blk_new(errp); if (!blk) { return NULL; } @@ -137,14 +128,13 @@ BlockBackend *blk_new_with_bs(const char *name, Error **errp) * though, so callers of this function have to be able to specify @filename and * @flags. */ -BlockBackend *blk_new_open(const char *name, const char *filename, - const char *reference, QDict *options, int flags, - Error **errp) +BlockBackend *blk_new_open(const char *filename, const char *reference, + QDict *options, int flags, Error **errp) { BlockBackend *blk; int ret; - blk = blk_new_with_bs(name, errp); + blk = blk_new_with_bs(errp); if (!blk) { QDECREF(options); return NULL; @@ -161,8 +151,6 @@ BlockBackend *blk_new_open(const char *name, const char *filename, static void blk_delete(BlockBackend *blk) { - monitor_remove_blk(blk); - assert(!blk->refcnt); assert(!blk->name); assert(!blk->dev); diff --git a/block/parallels.c b/block/parallels.c index 0d1a60c972..b322d05c08 100644 --- a/block/parallels.c +++ b/block/parallels.c @@ -478,7 +478,7 @@ static int parallels_create(const char *filename, QemuOpts *opts, Error **errp) return ret; } - file = blk_new_open("image", filename, NULL, NULL, + file = blk_new_open(filename, NULL, NULL, BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_PROTOCOL, &local_err); if (file == NULL) { diff --git a/block/qcow.c b/block/qcow.c index c09cb7989a..73cf8a7081 100644 --- a/block/qcow.c +++ b/block/qcow.c @@ -793,7 +793,7 @@ static int qcow_create(const char *filename, QemuOpts *opts, Error **errp) goto cleanup; } - qcow_blk = blk_new_open("image", filename, NULL, NULL, + qcow_blk = blk_new_open(filename, NULL, NULL, BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_PROTOCOL, &local_err); if (qcow_blk == NULL) { diff --git a/block/qcow2.c b/block/qcow2.c index 3fd664b9ca..5f4fea6a55 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -2159,7 +2159,7 @@ static int qcow2_create2(const char *filename, int64_t total_size, return ret; } - blk = blk_new_open("image", filename, NULL, NULL, + blk = blk_new_open(filename, NULL, NULL, BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_PROTOCOL, &local_err); if (blk == NULL) { @@ -2224,7 +2224,7 @@ static int qcow2_create2(const char *filename, int64_t total_size, */ options = qdict_new(); qdict_put(options, "driver", qstring_from_str("qcow2")); - blk = blk_new_open("image-qcow2", filename, NULL, options, + blk = blk_new_open(filename, NULL, options, BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_NO_FLUSH, &local_err); if (blk == NULL) { @@ -2286,7 +2286,7 @@ static int qcow2_create2(const char *filename, int64_t total_size, /* Reopen the image without BDRV_O_NO_FLUSH to flush it before returning */ options = qdict_new(); qdict_put(options, "driver", qstring_from_str("qcow2")); - blk = blk_new_open("image-flush", filename, NULL, options, + blk = blk_new_open(filename, NULL, options, BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_NO_BACKING, &local_err); if (blk == NULL) { diff --git a/block/qed.c b/block/qed.c index 225c6a5a80..5b24a9783f 100644 --- a/block/qed.c +++ b/block/qed.c @@ -574,7 +574,7 @@ static int qed_create(const char *filename, uint32_t cluster_size, return ret; } - blk = blk_new_open("image", filename, NULL, NULL, + blk = blk_new_open(filename, NULL, NULL, BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_PROTOCOL, &local_err); if (blk == NULL) { diff --git a/block/sheepdog.c b/block/sheepdog.c index 06ae3bac62..a3aeae4a67 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -1646,7 +1646,7 @@ static int sd_prealloc(const char *filename, Error **errp) void *buf = NULL; int ret; - blk = blk_new_open("image-prealloc", filename, NULL, NULL, + blk = blk_new_open(filename, NULL, NULL, BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_PROTOCOL, errp); if (blk == NULL) { @@ -1843,7 +1843,7 @@ static int sd_create(const char *filename, QemuOpts *opts, goto out; } - blk = blk_new_open("backing", backing_file, NULL, NULL, + blk = blk_new_open(backing_file, NULL, NULL, BDRV_O_PROTOCOL | BDRV_O_CACHE_WB, errp); if (blk == NULL) { ret = -EIO; diff --git a/block/vdi.c b/block/vdi.c index 662d14b74e..df9fa47db1 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -768,7 +768,7 @@ static int vdi_create(const char *filename, QemuOpts *opts, Error **errp) goto exit; } - blk = blk_new_open("image", filename, NULL, NULL, + blk = blk_new_open(filename, NULL, NULL, BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_PROTOCOL, &local_err); if (blk == NULL) { diff --git a/block/vhdx.c b/block/vhdx.c index e15020c9be..78fe56ca04 100644 --- a/block/vhdx.c +++ b/block/vhdx.c @@ -1838,7 +1838,7 @@ static int vhdx_create(const char *filename, QemuOpts *opts, Error **errp) goto exit; } - blk = blk_new_open("image", filename, NULL, NULL, + blk = blk_new_open(filename, NULL, NULL, BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_PROTOCOL, &local_err); if (blk == NULL) { diff --git a/block/vmdk.c b/block/vmdk.c index 2f8e6cf1c8..80f033835e 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -1661,7 +1661,7 @@ static int vmdk_create_extent(const char *filename, int64_t filesize, goto exit; } - blk = blk_new_open("extent", filename, NULL, NULL, + blk = blk_new_open(filename, NULL, NULL, BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_PROTOCOL, &local_err); if (blk == NULL) { @@ -1946,7 +1946,7 @@ static int vmdk_create(const char *filename, QemuOpts *opts, Error **errp) goto exit; } - blk = blk_new_open("backing", full_backing, NULL, NULL, + blk = blk_new_open(full_backing, NULL, NULL, BDRV_O_NO_BACKING | BDRV_O_CACHE_WB, errp); g_free(full_backing); if (blk == NULL) { @@ -2018,7 +2018,7 @@ static int vmdk_create(const char *filename, QemuOpts *opts, Error **errp) } } - new_blk = blk_new_open("descriptor", filename, NULL, NULL, + new_blk = blk_new_open(filename, NULL, NULL, BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_PROTOCOL, &local_err); if (new_blk == NULL) { diff --git a/block/vpc.c b/block/vpc.c index 0d1524d6f6..8435205a0c 100644 --- a/block/vpc.c +++ b/block/vpc.c @@ -888,7 +888,7 @@ static int vpc_create(const char *filename, QemuOpts *opts, Error **errp) goto out; } - blk = blk_new_open("image", filename, NULL, NULL, + blk = blk_new_open(filename, NULL, NULL, BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_PROTOCOL, &local_err); if (blk == NULL) { |