[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 24/38] blockdev: Allow more options for BB-less B
From: |
Max Reitz |
Subject: |
[Qemu-devel] [PATCH v3 24/38] blockdev: Allow more options for BB-less BDS tree |
Date: |
Wed, 3 Jun 2015 21:44:05 +0200 |
Most of the options which blockdev_init() parses for both the
BlockBackend and the root BDS are valid for just the root BDS as well
(e.g. read-only). This patch allows specifying these options even if not
creating a BlockBackend.
Signed-off-by: Max Reitz <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
---
blockdev.c | 156 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 150 insertions(+), 6 deletions(-)
diff --git a/blockdev.c b/blockdev.c
index 8d672ac..03d6334 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -591,6 +591,61 @@ err_no_opts:
return NULL;
}
+static QemuOptsList qemu_root_bds_opts;
+
+/* Takes the ownership of bs_opts */
+static BlockDriverState *bds_tree_init(QDict *bs_opts, Error **errp)
+{
+ BlockDriverState *bs;
+ QemuOpts *opts;
+ Error *local_error = NULL;
+ ThrottleConfig cfg;
+ BlockdevDetectZeroesOptions detect_zeroes;
+ int ret;
+ int bdrv_flags = 0;
+
+ opts = qemu_opts_create(&qemu_root_bds_opts, NULL, 1, errp);
+ if (!opts) {
+ goto fail;
+ }
+
+ qemu_opts_absorb_qdict(opts, bs_opts, &local_error);
+ if (local_error) {
+ error_propagate(errp, local_error);
+ goto fail;
+ }
+
+ extract_common_blockdev_options(opts, &bdrv_flags, &cfg, &detect_zeroes,
+ &local_error);
+ if (local_error) {
+ error_propagate(errp, local_error);
+ goto fail;
+ }
+
+ bs = NULL;
+ ret = bdrv_open(&bs, NULL, NULL, bs_opts, bdrv_flags, NULL, errp);
+ if (ret < 0) {
+ goto fail_no_bs_opts;
+ }
+
+ bs->detect_zeroes = detect_zeroes;
+
+ /* disk I/O throttling */
+ if (throttle_enabled(&cfg)) {
+ bdrv_io_limits_enable(bs);
+ bdrv_set_io_limits(bs, &cfg);
+ }
+
+fail_no_bs_opts:
+ qemu_opts_del(opts);
+ return bs;
+
+fail:
+ qemu_opts_del(opts);
+ QDECREF(bs_opts);
+ return NULL;
+}
+
static void qemu_opt_rename(QemuOpts *opts, const char *from, const char *to,
Error **errp)
{
@@ -3148,18 +3203,14 @@ void qmp_blockdev_add(BlockdevOptions *options, Error
**errp)
bs = blk_bs(blk);
} else {
- int ret;
-
if (!qdict_get_try_str(qdict, "node-name")) {
error_setg(errp, "'id' and/or 'node-name' need to be specified for
"
"the root node");
goto fail;
}
- bs = NULL;
- ret = bdrv_open(&bs, NULL, NULL, qdict, BDRV_O_RDWR | BDRV_O_CACHE_WB,
- NULL, errp);
- if (ret < 0) {
+ bs = bds_tree_init(qdict, errp);
+ if (!bs) {
goto fail;
}
}
@@ -3310,6 +3361,99 @@ QemuOptsList qemu_common_drive_opts = {
},
};
+static QemuOptsList qemu_root_bds_opts = {
+ .name = "root-bds",
+ .head = QTAILQ_HEAD_INITIALIZER(qemu_common_drive_opts.head),
+ .desc = {
+ {
+ .name = "discard",
+ .type = QEMU_OPT_STRING,
+ .help = "discard operation (ignore/off, unmap/on)",
+ },{
+ .name = "cache.writeback",
+ .type = QEMU_OPT_BOOL,
+ .help = "enables writeback mode for any caches",
+ },{
+ .name = "cache.direct",
+ .type = QEMU_OPT_BOOL,
+ .help = "enables use of O_DIRECT (bypass the host page cache)",
+ },{
+ .name = "cache.no-flush",
+ .type = QEMU_OPT_BOOL,
+ .help = "ignore any flush requests for the device",
+ },{
+ .name = "aio",
+ .type = QEMU_OPT_STRING,
+ .help = "host AIO implementation (threads, native)",
+ },{
+ .name = "read-only",
+ .type = QEMU_OPT_BOOL,
+ .help = "open drive file as read-only",
+ },{
+ .name = "throttling.iops-total",
+ .type = QEMU_OPT_NUMBER,
+ .help = "limit total I/O operations per second",
+ },{
+ .name = "throttling.iops-read",
+ .type = QEMU_OPT_NUMBER,
+ .help = "limit read operations per second",
+ },{
+ .name = "throttling.iops-write",
+ .type = QEMU_OPT_NUMBER,
+ .help = "limit write operations per second",
+ },{
+ .name = "throttling.bps-total",
+ .type = QEMU_OPT_NUMBER,
+ .help = "limit total bytes per second",
+ },{
+ .name = "throttling.bps-read",
+ .type = QEMU_OPT_NUMBER,
+ .help = "limit read bytes per second",
+ },{
+ .name = "throttling.bps-write",
+ .type = QEMU_OPT_NUMBER,
+ .help = "limit write bytes per second",
+ },{
+ .name = "throttling.iops-total-max",
+ .type = QEMU_OPT_NUMBER,
+ .help = "I/O operations burst",
+ },{
+ .name = "throttling.iops-read-max",
+ .type = QEMU_OPT_NUMBER,
+ .help = "I/O operations read burst",
+ },{
+ .name = "throttling.iops-write-max",
+ .type = QEMU_OPT_NUMBER,
+ .help = "I/O operations write burst",
+ },{
+ .name = "throttling.bps-total-max",
+ .type = QEMU_OPT_NUMBER,
+ .help = "total bytes burst",
+ },{
+ .name = "throttling.bps-read-max",
+ .type = QEMU_OPT_NUMBER,
+ .help = "total bytes read burst",
+ },{
+ .name = "throttling.bps-write-max",
+ .type = QEMU_OPT_NUMBER,
+ .help = "total bytes write burst",
+ },{
+ .name = "throttling.iops-size",
+ .type = QEMU_OPT_NUMBER,
+ .help = "when limiting by iops max size of an I/O in bytes",
+ },{
+ .name = "copy-on-read",
+ .type = QEMU_OPT_BOOL,
+ .help = "copy read data from backing file into image file",
+ },{
+ .name = "detect-zeroes",
+ .type = QEMU_OPT_STRING,
+ .help = "try to optimize zero writes (off, on, unmap)",
+ },
+ { /* end of list */ }
+ },
+};
+
QemuOptsList qemu_drive_opts = {
.name = "drive",
.head = QTAILQ_HEAD_INITIALIZER(qemu_drive_opts.head),
--
2.4.1
- [Qemu-devel] [PATCH v3 15/38] block: Move I/O status and error actions into BB, (continued)
- [Qemu-devel] [PATCH v3 15/38] block: Move I/O status and error actions into BB, Max Reitz, 2015/06/03
- [Qemu-devel] [PATCH v3 17/38] block: Make some BB functions fall back to BBRS, Max Reitz, 2015/06/03
- [Qemu-devel] [PATCH v3 18/38] block: Fail requests to empty BlockBackend, Max Reitz, 2015/06/03
- [Qemu-devel] [PATCH v3 20/38] block: Add blk_insert_bs(), Max Reitz, 2015/06/03
- [Qemu-devel] [PATCH v3 19/38] block: Prepare remaining BB functions for NULL BDS, Max Reitz, 2015/06/03
- [Qemu-devel] [PATCH v3 21/38] block: Prepare for NULL BDS, Max Reitz, 2015/06/03
- [Qemu-devel] [PATCH v3 22/38] blockdev: Do not create BDS for empty drive, Max Reitz, 2015/06/03
- [Qemu-devel] [PATCH v3 24/38] blockdev: Allow more options for BB-less BDS tree,
Max Reitz <=
- [Qemu-devel] [PATCH v3 23/38] blockdev: Pull out blockdev option extraction, Max Reitz, 2015/06/03
- [Qemu-devel] [PATCH v3 26/38] blockdev: Add blockdev-open-tray, Max Reitz, 2015/06/03
- [Qemu-devel] [PATCH v3 25/38] block: Add blk_remove_bs(), Max Reitz, 2015/06/03
- [Qemu-devel] [PATCH v3 28/38] blockdev: Add blockdev-remove-medium, Max Reitz, 2015/06/03
- [Qemu-devel] [PATCH v3 29/38] blockdev: Add blockdev-insert-medium, Max Reitz, 2015/06/03
- [Qemu-devel] [PATCH v3 27/38] blockdev: Add blockdev-close-tray, Max Reitz, 2015/06/03