[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 8/9] block: Catch backing files assigned to non-C
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PATCH v2 8/9] block: Catch backing files assigned to non-COW drivers |
Date: |
Wed, 25 Jun 2014 16:35:58 +0200 |
Since we parse backing.* options to add a backing file from the command
line when the driver didn't assign one, it has been possible to have a
backing file for e.g. raw images (it just was never accessed).
This is obvious nonsense and should be rejected.
Signed-off-by: Kevin Wolf <address@hidden>
---
block.c | 7 +++++++
block/cow.c | 1 +
block/qcow.c | 1 +
block/qcow2.c | 1 +
block/qed.c | 1 +
block/vmdk.c | 1 +
include/block/block_int.h | 3 +++
tests/qemu-iotests/051 | 5 +++++
tests/qemu-iotests/051.out | 9 +++++++++
9 files changed, 29 insertions(+)
diff --git a/block.c b/block.c
index b179dd6..abe81b9 100644
--- a/block.c
+++ b/block.c
@@ -1192,6 +1192,13 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict
*options, Error **errp)
bdrv_get_full_backing_filename(bs, backing_filename, PATH_MAX);
}
+ if (!bs->drv || !bs->drv->supports_backing) {
+ ret = -EINVAL;
+ error_setg(errp, "Driver doesn't support backing files");
+ QDECREF(options);
+ goto free_exit;
+ }
+
backing_hd = bdrv_new("", errp);
if (bs->backing_format[0] != '\0') {
diff --git a/block/cow.c b/block/cow.c
index a05a92c..8f81ee6 100644
--- a/block/cow.c
+++ b/block/cow.c
@@ -414,6 +414,7 @@ static BlockDriver bdrv_cow = {
.bdrv_close = cow_close,
.bdrv_create = cow_create,
.bdrv_has_zero_init = bdrv_has_zero_init_1,
+ .supports_backing = true,
.bdrv_read = cow_co_read,
.bdrv_write = cow_co_write,
diff --git a/block/qcow.c b/block/qcow.c
index 1f2bac8..a874056 100644
--- a/block/qcow.c
+++ b/block/qcow.c
@@ -941,6 +941,7 @@ static BlockDriver bdrv_qcow = {
.bdrv_reopen_prepare = qcow_reopen_prepare,
.bdrv_create = qcow_create,
.bdrv_has_zero_init = bdrv_has_zero_init_1,
+ .supports_backing = true,
.bdrv_co_readv = qcow_co_readv,
.bdrv_co_writev = qcow_co_writev,
diff --git a/block/qcow2.c b/block/qcow2.c
index b9d2fa6..67e55c9 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -2418,6 +2418,7 @@ static BlockDriver bdrv_qcow2 = {
.bdrv_save_vmstate = qcow2_save_vmstate,
.bdrv_load_vmstate = qcow2_load_vmstate,
+ .supports_backing = true,
.bdrv_change_backing_file = qcow2_change_backing_file,
.bdrv_refresh_limits = qcow2_refresh_limits,
diff --git a/block/qed.c b/block/qed.c
index 092e6fb..eddae92 100644
--- a/block/qed.c
+++ b/block/qed.c
@@ -1652,6 +1652,7 @@ static BlockDriver bdrv_qed = {
.format_name = "qed",
.instance_size = sizeof(BDRVQEDState),
.create_opts = &qed_create_opts,
+ .supports_backing = true,
.bdrv_probe = bdrv_qed_probe,
.bdrv_rebind = bdrv_qed_rebind,
diff --git a/block/vmdk.c b/block/vmdk.c
index 83dd6fe..d0de019 100644
--- a/block/vmdk.c
+++ b/block/vmdk.c
@@ -2180,6 +2180,7 @@ static BlockDriver bdrv_vmdk = {
.bdrv_detach_aio_context = vmdk_detach_aio_context,
.bdrv_attach_aio_context = vmdk_attach_aio_context,
+ .supports_backing = true,
.create_opts = &vmdk_create_opts,
};
diff --git a/include/block/block_int.h b/include/block/block_int.h
index a1885d3..a015df6 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -100,6 +100,9 @@ struct BlockDriver {
*/
bool bdrv_needs_filename;
+ /* Set if a driver can support backing files */
+ bool supports_backing;
+
/* For handling image reopen for split or non-split files */
int (*bdrv_reopen_prepare)(BDRVReopenState *reopen_state,
BlockReopenQueue *queue, Error **errp);
diff --git a/tests/qemu-iotests/051 b/tests/qemu-iotests/051
index 30a712f..a41334e 100755
--- a/tests/qemu-iotests/051
+++ b/tests/qemu-iotests/051
@@ -100,6 +100,11 @@ echo
echo "info block" | run_qemu -drive
file="$TEST_IMG",driver=qcow2,backing.file.filename="$TEST_IMG.orig" -nodefaults
+# Drivers that don't support backing files
+run_qemu -drive
file="$TEST_IMG",driver=raw,backing.file.filename="$TEST_IMG.orig"
+run_qemu -drive
file="$TEST_IMG",file.backing.driver=file,file.backing.filename="$TEST_IMG.orig"
+run_qemu -drive
file="$TEST_IMG",file.backing.driver=qcow2,file.backing.file.filename="$TEST_IMG.orig"
+
echo
echo === Enable and disable lazy refcounting on the command line, plus some
invalid values ===
echo
diff --git a/tests/qemu-iotests/051.out b/tests/qemu-iotests/051.out
index 37cb049..791956f 100644
--- a/tests/qemu-iotests/051.out
+++ b/tests/qemu-iotests/051.out
@@ -54,6 +54,15 @@ ide0-hd0: TEST_DIR/t.qcow2 (qcow2)
Backing file: TEST_DIR/t.qcow2.orig (chain depth: 1)
(qemu) q[K[Dqu[K[D[Dqui[K[D[D[Dquit[K
+Testing: -drive
file=TEST_DIR/t.qcow2,driver=raw,backing.file.filename=TEST_DIR/t.qcow2.orig
+QEMU_PROG: -drive
file=TEST_DIR/t.qcow2,driver=raw,backing.file.filename=TEST_DIR/t.qcow2.orig:
could not open disk image TEST_DIR/t.qcow2: Driver doesn't support backing files
+
+Testing: -drive
file=TEST_DIR/t.qcow2,file.backing.driver=file,file.backing.filename=TEST_DIR/t.qcow2.orig
+QEMU_PROG: -drive
file=TEST_DIR/t.qcow2,file.backing.driver=file,file.backing.filename=TEST_DIR/t.qcow2.orig:
could not open disk image TEST_DIR/t.qcow2: Driver doesn't support backing
files
+
+Testing: -drive
file=TEST_DIR/t.qcow2,file.backing.driver=qcow2,file.backing.file.filename=TEST_DIR/t.qcow2.orig
+QEMU_PROG: -drive
file=TEST_DIR/t.qcow2,file.backing.driver=qcow2,file.backing.file.filename=TEST_DIR/t.qcow2.orig:
could not open disk image TEST_DIR/t.qcow2: Driver doesn't support backing
files
+
=== Enable and disable lazy refcounting on the command line, plus some invalid
values ===
--
1.8.3.1
- Re: [Qemu-devel] [PATCH v2 2/9] block: Move bdrv_fill_options() call to bdrv_open(), (continued)
- [Qemu-devel] [PATCH v2 1/9] block: Create bdrv_fill_options(), Kevin Wolf, 2014/06/25
- [Qemu-devel] [PATCH v2 5/9] block: Use common driver selection code for bdrv_open_file(), Kevin Wolf, 2014/06/25
- [Qemu-devel] [PATCH v2 3/9] block: Move json: parsing to bdrv_fill_options(), Kevin Wolf, 2014/06/25
- [Qemu-devel] [PATCH v2 4/9] block: Always pass driver name through options QDict, Kevin Wolf, 2014/06/25
- [Qemu-devel] [PATCH v2 6/9] block: Inline bdrv_file_open(), Kevin Wolf, 2014/06/25
- [Qemu-devel] [PATCH v2 7/9] block: Remove second bdrv_open() recursion, Kevin Wolf, 2014/06/25
- [Qemu-devel] [PATCH v2 8/9] block: Catch backing files assigned to non-COW drivers,
Kevin Wolf <=
- [Qemu-devel] [PATCH v2 9/9] block: Remove a special case for protocols, Kevin Wolf, 2014/06/25
- Re: [Qemu-devel] [PATCH v2 0/9] bdrv_open() cleanups, part 1, Kevin Wolf, 2014/06/26
- Re: [Qemu-devel] [PATCH v2 0/9] bdrv_open() cleanups, part 1, Max Reitz, 2014/06/26