From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43246) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VMzIj-0002tv-Qe for qemu-devel@nongnu.org; Fri, 20 Sep 2013 07:55:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VMzId-0008Vu-Qq for qemu-devel@nongnu.org; Fri, 20 Sep 2013 07:55:09 -0400 Received: from mx1.redhat.com ([209.132.183.28]:33586) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VMzId-0008U7-JY for qemu-devel@nongnu.org; Fri, 20 Sep 2013 07:55:03 -0400 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r8KBt2rF018896 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 20 Sep 2013 07:55:03 -0400 From: Kevin Wolf Date: Fri, 20 Sep 2013 13:54:29 +0200 Message-Id: <1379678070-14346-17-git-send-email-kwolf@redhat.com> In-Reply-To: <1379678070-14346-1-git-send-email-kwolf@redhat.com> References: <1379678070-14346-1-git-send-email-kwolf@redhat.com> Subject: [Qemu-devel] [PATCH 16/17] blockdev: Don't disable COR automatically with blockdev-add List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, armbru@redhat.com, stefanha@redhat.com, mreitz@redhat.com If a read-only device is configured with copy-on-read=on, the old code only prints a warning and automatically disables copy on read. Make it a real error for blockdev-add. Signed-off-by: Kevin Wolf --- block.c | 9 +++++++-- blockdev.c | 31 +++++++++++++++++++++++++++---- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/block.c b/block.c index e176c6f..adafa3d 100644 --- a/block.c +++ b/block.c @@ -774,8 +774,13 @@ static int bdrv_open_common(BlockDriverState *bs, BlockDriverState *file, } assert(bs->copy_on_read == 0); /* bdrv_new() and bdrv_close() make it so */ - if (!bs->read_only && (flags & BDRV_O_COPY_ON_READ)) { - bdrv_enable_copy_on_read(bs); + if (flags & BDRV_O_COPY_ON_READ) { + if (!bs->read_only) { + bdrv_enable_copy_on_read(bs); + } else { + error_setg(errp, "Can't use copy-on-read on read-only device"); + return -EINVAL; + } } if (filename != NULL) { diff --git a/blockdev.c b/blockdev.c index afdeb34..ef00c6d 100644 --- a/blockdev.c +++ b/blockdev.c @@ -511,10 +511,6 @@ static DriveInfo *blockdev_init(QDict *bs_opts, bdrv_flags |= ro ? 0 : BDRV_O_RDWR; - if (ro && copy_on_read) { - error_report("warning: disabling copy_on_read on read-only drive"); - } - QINCREF(bs_opts); ret = bdrv_open(dinfo->bdrv, file, bs_opts, bdrv_flags, drv, &error); @@ -602,6 +598,18 @@ QemuOptsList qemu_legacy_drive_opts = { .type = QEMU_OPT_STRING, .help = "pci address (virtio only)", }, + + /* Options that are passed on, but have special semantics with -drive */ + { + .name = "read-only", + .type = QEMU_OPT_BOOL, + .help = "open drive file as read-only", + },{ + .name = "copy-on-read", + .type = QEMU_OPT_BOOL, + .help = "copy read data from backing file into image file", + }, + { /* end of list */ } }, }; @@ -617,6 +625,7 @@ DriveInfo *drive_init(QemuOpts *all_opts, BlockInterfaceType block_default_type) int cyls, heads, secs, translation; int max_devs, bus_id, unit_id, index; const char *devaddr; + bool read_only, copy_on_read; Error *local_err = NULL; /* Change legacy command line options into QMP ones */ @@ -699,6 +708,20 @@ DriveInfo *drive_init(QemuOpts *all_opts, BlockInterfaceType block_default_type) } } + /* copy-on-read is disabled with a warning for read-only devices */ + read_only = qemu_opt_get_bool(legacy_opts, "read-only", false); + copy_on_read = qemu_opt_get_bool(legacy_opts, "copy-on-read", false); + + if (read_only && copy_on_read) { + error_report("warning: disabling copy-on-read on read-only drive"); + copy_on_read = false; + } + + qdict_put(bs_opts, "read-only", + qstring_from_str(read_only ? "on" : "off")); + qdict_put(bs_opts, "copy-on-read", + qstring_from_str(copy_on_read ? "on" :"off")); + /* Controller type */ value = qemu_opt_get(legacy_opts, "if"); if (value) { -- 1.8.1.4