[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v4 14/26] block: add flag to indicate that no I/O wi
From: |
Daniel P. Berrange |
Subject: |
[Qemu-devel] [PATCH v4 14/26] block: add flag to indicate that no I/O will be performed |
Date: |
Mon, 29 Feb 2016 12:00:49 +0000 |
When opening an image it is useful to know whether the caller
intends to perform I/O on the image or not. In the case of
encrypted images this will allow the block driver to avoid
having to prompt for decryption keys when we merely want to
query header metadata about the image. eg qemu-img info
This flag is enforced at the top level only, since even if
we don't want todo I/O on the 'qcow2' file payload, the
underlying 'file' driver will still need todo I/O to read
the qcow2 header, for example.
Reviewed-by: Eric Blake <address@hidden>
Signed-off-by: Daniel P. Berrange <address@hidden>
---
block.c | 5 +++--
block/io.c | 2 ++
include/block/block.h | 1 +
qemu-img.c | 44 ++++++++++++++++++++++----------------------
4 files changed, 28 insertions(+), 24 deletions(-)
diff --git a/block.c b/block.c
index ba24b8e..1fd4a14 100644
--- a/block.c
+++ b/block.c
@@ -720,7 +720,8 @@ static void bdrv_inherited_options(int *child_flags, QDict
*child_options,
flags |= BDRV_O_UNMAP;
/* Clear flags that only apply to the top layer */
- flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING | BDRV_O_COPY_ON_READ);
+ flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING | BDRV_O_COPY_ON_READ |
+ BDRV_O_NO_IO);
*child_flags = flags;
}
@@ -740,7 +741,7 @@ static void bdrv_inherited_fmt_options(int *child_flags,
QDict *child_options,
child_file.inherit_options(child_flags, child_options,
parent_flags, parent_options);
- *child_flags &= ~BDRV_O_PROTOCOL;
+ *child_flags &= ~(BDRV_O_PROTOCOL | BDRV_O_NO_IO);
}
const BdrvChildRole child_format = {
diff --git a/block/io.c b/block/io.c
index a69bfc4..010e25a 100644
--- a/block/io.c
+++ b/block/io.c
@@ -862,6 +862,7 @@ static int coroutine_fn
bdrv_aligned_preadv(BlockDriverState *bs,
assert((offset & (BDRV_SECTOR_SIZE - 1)) == 0);
assert((bytes & (BDRV_SECTOR_SIZE - 1)) == 0);
assert(!qiov || bytes == qiov->size);
+ assert((bs->open_flags & BDRV_O_NO_IO) == 0);
/* Handle Copy on Read and associated serialisation */
if (flags & BDRV_REQ_COPY_ON_READ) {
@@ -1148,6 +1149,7 @@ static int coroutine_fn
bdrv_aligned_pwritev(BlockDriverState *bs,
assert((offset & (BDRV_SECTOR_SIZE - 1)) == 0);
assert((bytes & (BDRV_SECTOR_SIZE - 1)) == 0);
assert(!qiov || bytes == qiov->size);
+ assert((bs->open_flags & BDRV_O_NO_IO) == 0);
waited = wait_serialising_requests(req);
assert(!waited || !req->serialising);
diff --git a/include/block/block.h b/include/block/block.h
index 1c4f4d8..4e2653d 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -91,6 +91,7 @@ typedef struct HDGeometry {
#define BDRV_O_PROTOCOL 0x8000 /* if no block driver is explicitly given:
select an appropriate protocol driver,
ignoring the format layer */
+#define BDRV_O_NO_IO 0x10000 /* don't initialize for I/O */
#define BDRV_O_CACHE_MASK (BDRV_O_NOCACHE | BDRV_O_CACHE_WB | BDRV_O_NO_FLUSH)
diff --git a/qemu-img.c b/qemu-img.c
index 2edb139..e91100e 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -224,13 +224,13 @@ static int print_block_option_help(const char *filename,
const char *fmt)
static int img_open_password(BlockBackend *blk, const char *filename,
- bool require_io, bool quiet)
+ int flags, bool quiet)
{
BlockDriverState *bs;
char password[256];
bs = blk_bs(blk);
- if (bdrv_is_encrypted(bs) && require_io) {
+ if (bdrv_is_encrypted(bs) && !(flags & BDRV_O_NO_IO)) {
qprintf(quiet, "Disk image '%s' is encrypted.\n", filename);
if (qemu_read_password(password, sizeof(password)) < 0) {
error_report("No password given");
@@ -248,7 +248,7 @@ static int img_open_password(BlockBackend *blk, const char
*filename,
static BlockBackend *img_open_opts(const char *id,
const char *optstr,
QemuOpts *opts, int flags,
- bool require_io, bool quiet)
+ bool quiet)
{
QDict *options;
Error *local_err = NULL;
@@ -260,7 +260,7 @@ static BlockBackend *img_open_opts(const char *id,
return NULL;
}
- if (img_open_password(blk, optstr, require_io, quiet) < 0) {
+ if (img_open_password(blk, optstr, flags, quiet) < 0) {
blk_unref(blk);
return NULL;
}
@@ -269,7 +269,7 @@ static BlockBackend *img_open_opts(const char *id,
static BlockBackend *img_open_file(const char *id, const char *filename,
const char *fmt, int flags,
- bool require_io, bool quiet)
+ bool quiet)
{
BlockBackend *blk;
Error *local_err = NULL;
@@ -286,7 +286,7 @@ static BlockBackend *img_open_file(const char *id, const
char *filename,
return NULL;
}
- if (img_open_password(blk, filename, require_io, quiet) < 0) {
+ if (img_open_password(blk, filename, flags, quiet) < 0) {
blk_unref(blk);
return NULL;
}
@@ -298,7 +298,7 @@ static BlockBackend *img_open(const char *id,
bool image_opts,
const char *filename,
const char *fmt, int flags,
- bool require_io, bool quiet)
+ bool quiet)
{
BlockBackend *blk;
if (image_opts) {
@@ -312,9 +312,9 @@ static BlockBackend *img_open(const char *id,
if (!opts) {
return NULL;
}
- blk = img_open_opts(id, filename, opts, flags, true, quiet);
+ blk = img_open_opts(id, filename, opts, flags, quiet);
} else {
- blk = img_open_file(id, filename, fmt, flags, true, quiet);
+ blk = img_open_file(id, filename, fmt, flags, quiet);
}
return blk;
}
@@ -686,7 +686,7 @@ static int img_check(int argc, char **argv)
return 1;
}
- blk = img_open("image", image_opts, filename, fmt, flags, true, quiet);
+ blk = img_open("image", image_opts, filename, fmt, flags, quiet);
if (!blk) {
return 1;
}
@@ -878,7 +878,7 @@ static int img_commit(int argc, char **argv)
return 1;
}
- blk = img_open("image", image_opts, filename, fmt, flags, true, quiet);
+ blk = img_open("image", image_opts, filename, fmt, flags, quiet);
if (!blk) {
return 1;
}
@@ -1212,13 +1212,13 @@ static int img_compare(int argc, char **argv)
goto out3;
}
- blk1 = img_open("image_1", image_opts, filename1, fmt1, flags, true,
quiet);
+ blk1 = img_open("image_1", image_opts, filename1, fmt1, flags, quiet);
if (!blk1) {
ret = 2;
goto out3;
}
- blk2 = img_open("image_2", image_opts, filename2, fmt2, flags, true,
quiet);
+ blk2 = img_open("image_2", image_opts, filename2, fmt2, flags, quiet);
if (!blk2) {
ret = 2;
goto out2;
@@ -1902,7 +1902,7 @@ static int img_convert(int argc, char **argv)
char *id = bs_n > 1 ? g_strdup_printf("source_%d", bs_i)
: g_strdup("source");
blk[bs_i] = img_open(id, image_opts, argv[optind + bs_i],
- fmt, src_flags, true, quiet);
+ fmt, src_flags, quiet);
g_free(id);
if (!blk[bs_i]) {
ret = -1;
@@ -2049,7 +2049,7 @@ static int img_convert(int argc, char **argv)
* Not critical right now, so fix can wait...
*/
out_blk = img_open_file("target", out_filename,
- out_fmt, flags, true, quiet);
+ out_fmt, flags, quiet);
if (!out_blk) {
ret = -1;
goto out;
@@ -2241,8 +2241,8 @@ static ImageInfoList *collect_image_info_list(bool
image_opts,
g_hash_table_insert(filenames, (gpointer)filename, NULL);
blk = img_open("image", image_opts, filename, fmt,
- BDRV_O_FLAGS | BDRV_O_NO_BACKING,
- false, false);
+ BDRV_O_FLAGS | BDRV_O_NO_BACKING | BDRV_O_NO_IO,
+ false);
if (!blk) {
goto err;
}
@@ -2573,7 +2573,7 @@ static int img_map(int argc, char **argv)
}
blk = img_open("image", image_opts, filename, fmt,
- BDRV_O_FLAGS, true, false);
+ BDRV_O_FLAGS, false);
if (!blk) {
return 1;
}
@@ -2719,7 +2719,7 @@ static int img_snapshot(int argc, char **argv)
/* Open the image */
blk = img_open("image", image_opts, filename, NULL,
- bdrv_oflags, true, quiet);
+ bdrv_oflags, quiet);
if (!blk) {
return 1;
}
@@ -2888,7 +2888,7 @@ static int img_rebase(int argc, char **argv)
* Ignore the old backing file for unsafe rebase in case we want to correct
* the reference to a renamed or moved backing file.
*/
- blk = img_open("image", image_opts, filename, fmt, flags, true, quiet);
+ blk = img_open("image", image_opts, filename, fmt, flags, quiet);
if (!blk) {
ret = -1;
goto out;
@@ -3229,7 +3229,7 @@ static int img_resize(int argc, char **argv)
qemu_opts_del(param);
blk = img_open("image", image_opts, filename, fmt,
- BDRV_O_FLAGS | BDRV_O_RDWR, true, quiet);
+ BDRV_O_FLAGS | BDRV_O_RDWR, quiet);
if (!blk) {
ret = -1;
goto out;
@@ -3388,7 +3388,7 @@ static int img_amend(int argc, char **argv)
goto out;
}
- blk = img_open("image", image_opts, filename, fmt, flags, true, quiet);
+ blk = img_open("image", image_opts, filename, fmt, flags, quiet);
if (!blk) {
ret = -1;
goto out;
--
2.5.0
- [Qemu-devel] [PATCH v4 07/26] crypto: add support for the serpent cipher algorithm, (continued)
- [Qemu-devel] [PATCH v4 07/26] crypto: add support for the serpent cipher algorithm, Daniel P. Berrange, 2016/02/29
- [Qemu-devel] [PATCH v4 04/26] crypto: add support for anti-forensic split algorithm, Daniel P. Berrange, 2016/02/29
- [Qemu-devel] [PATCH v4 03/26] crypto: add support for generating initialization vectors, Daniel P. Berrange, 2016/02/29
- [Qemu-devel] [PATCH v4 06/26] crypto: add support for the cast5-128 cipher algorithm, Daniel P. Berrange, 2016/02/29
- [Qemu-devel] [PATCH v4 08/26] crypto: add support for the twofish cipher algorithm, Daniel P. Berrange, 2016/02/29
- [Qemu-devel] [PATCH v4 15/26] qemu-img/qemu-io: don't prompt for passwords if not required, Daniel P. Berrange, 2016/02/29
- [Qemu-devel] [PATCH v4 16/26] tests: redirect stderr to stdout for iotests, Daniel P. Berrange, 2016/02/29
- [Qemu-devel] [PATCH v4 12/26] crypto: add block encryption framework, Daniel P. Berrange, 2016/02/29
- [Qemu-devel] [PATCH v4 18/26] tests: add output filter to python I/O tests helper, Daniel P. Berrange, 2016/02/29
- [Qemu-devel] [PATCH v4 09/26] crypto: import an implementation of the XTS cipher mode, Daniel P. Berrange, 2016/02/29
- [Qemu-devel] [PATCH v4 14/26] block: add flag to indicate that no I/O will be performed,
Daniel P. Berrange <=
- [Qemu-devel] [PATCH v4 23/26] qcow: convert QCow to use QCryptoBlock for encryption, Daniel P. Berrange, 2016/02/29
- [Qemu-devel] [PATCH v4 11/26] crypto: wire up XTS mode for cipher APIs, Daniel P. Berrange, 2016/02/29
- [Qemu-devel] [PATCH v4 17/26] tests: refactor python I/O tests helper main method, Daniel P. Berrange, 2016/02/29
- [Qemu-devel] [PATCH v4 10/26] crypto: refactor code for dealing with AES cipher, Daniel P. Berrange, 2016/02/29
- [Qemu-devel] [PATCH v4 20/26] qcow2: make qcow2_encrypt_sectors encrypt in place, Daniel P. Berrange, 2016/02/29
- [Qemu-devel] [PATCH v4 22/26] qcow: make encrypt_sectors encrypt in place, Daniel P. Berrange, 2016/02/29
- [Qemu-devel] [PATCH v4 24/26] block: rip out all traces of password prompting, Daniel P. Berrange, 2016/02/29
- [Qemu-devel] [PATCH v4 26/26] block: remove support for legecy AES qcow/qcow2 encryption, Daniel P. Berrange, 2016/02/29
- [Qemu-devel] [PATCH v4 13/26] crypto: implement the LUKS block encryption format, Daniel P. Berrange, 2016/02/29
- [Qemu-devel] [PATCH v4 25/26] block: remove all encryption handling APIs, Daniel P. Berrange, 2016/02/29