From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 148700796129795.35318366093747; Mon, 13 Feb 2017 09:46:01 -0800 (PST) Received: from localhost ([::1]:58483 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKhK-0006z4-Gp for importer@patchew.org; Mon, 13 Feb 2017 12:45:58 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58835) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKLV-0002i8-MV for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:28 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKLS-0005lG-CV for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:25 -0500 Received: from mx1.redhat.com ([209.132.183.28]:59054) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKLM-0005in-6Q; Mon, 13 Feb 2017 12:23:16 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 53ED480E4A; Mon, 13 Feb 2017 17:23:16 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3H031842; Mon, 13 Feb 2017 12:23:14 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:23 +0100 Message-Id: <1487006583-24350-2-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Mon, 13 Feb 2017 17:23:16 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 01/41] block: Attach bs->file only during .bdrv_open() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The way that attaching bs->file worked was a bit unusual in that it was the only child that would be attached to a node which is not opened yet. Because of this, the block layer couldn't know yet which permissions the driver would eventually need. This patch moves the point where bs->file is attached to the beginning of the individual .bdrv_open() implementations, so drivers already know what they are going to do with the child. This is also more consistent with how driver-specific children work. bdrv_open() still needs its own BdrvChild to perform image probing, but instead of directly assigning this BdrvChild to the BDS, it becomes a temporary one and the node name is passed as an option to the drivers, so that they can simply use bdrv_open_child() to create another reference for their own use. Signed-off-by: Kevin Wolf --- block.c | 34 +++++++++++++++++++++++----------- block/bochs.c | 6 ++++++ block/cloop.c | 6 ++++++ block/crypto.c | 6 ++++++ block/dmg.c | 6 ++++++ block/parallels.c | 6 ++++++ block/qcow.c | 6 ++++++ block/qcow2.c | 18 +++++++++++++++--- block/qed.c | 18 +++++++++++++++--- block/raw-format.c | 6 ++++++ block/replication.c | 6 ++++++ block/vdi.c | 6 ++++++ block/vhdx.c | 6 ++++++ block/vmdk.c | 6 ++++++ block/vpc.c | 6 ++++++ tests/qemu-iotests/051.out | 4 ++-- tests/qemu-iotests/051.pc.out | 4 ++-- 17 files changed, 129 insertions(+), 21 deletions(-) diff --git a/block.c b/block.c index 743c349..0618f4b 100644 --- a/block.c +++ b/block.c @@ -1103,13 +1103,6 @@ static int bdrv_open_common(BlockDriverState *bs, Bd= rvChild *file, assert(!drv->bdrv_needs_filename || filename !=3D NULL); ret =3D drv->bdrv_file_open(bs, options, open_flags, &local_err); } else { - if (file =3D=3D NULL) { - error_setg(errp, "Can't use '%s' as a block driver for the " - "protocol level", drv->format_name); - ret =3D -EINVAL; - goto free_and_fail; - } - bs->file =3D file; ret =3D drv->bdrv_open(bs, options, open_flags, &local_err); } =20 @@ -1145,7 +1138,6 @@ static int bdrv_open_common(BlockDriverState *bs, Bdr= vChild *file, return 0; =20 free_and_fail: - bs->file =3D NULL; g_free(bs->opaque); bs->opaque =3D NULL; bs->drv =3D NULL; @@ -1368,7 +1360,18 @@ void bdrv_unref_child(BlockDriverState *parent, Bdrv= Child *child) } =20 if (child->bs->inherits_from =3D=3D parent) { - child->bs->inherits_from =3D NULL; + BdrvChild *c; + + /* Remove inherits_from only when the last reference between paren= t and + * child->bs goes away. */ + QLIST_FOREACH(c, &parent->children, next) { + if (c !=3D child && c->bs =3D=3D child->bs) { + break; + } + } + if (c =3D=3D NULL) { + child->bs->inherits_from =3D NULL; + } } =20 bdrv_root_unref_child(child); @@ -1789,13 +1792,19 @@ static BlockDriverState *bdrv_open_inherit(const ch= ar *filename, qdict_del(options, "backing"); } =20 - /* Open image file without format layer */ + /* Open image file without format layer. This BdrvChild is only used f= or + * probing, the block drivers will do their own bdrv_open_child() for = the + * same BDS, which is why we put the node name back into options. */ if ((flags & BDRV_O_PROTOCOL) =3D=3D 0) { file =3D bdrv_open_child(filename, options, "file", bs, &child_file, true, &local_err); if (local_err) { goto fail; } + if (file !=3D NULL) { + qdict_put(options, "file", + qstring_from_str(bdrv_get_node_name(file->bs))); + } } =20 /* Image format probing */ @@ -1835,7 +1844,7 @@ static BlockDriverState *bdrv_open_inherit(const char= *filename, goto fail; } =20 - if (file && (bs->file !=3D file)) { + if (file) { bdrv_unref_child(bs, file); file =3D NULL; } @@ -1901,6 +1910,9 @@ fail: if (file !=3D NULL) { bdrv_unref_child(bs, file); } + if (bs->file !=3D NULL) { + bdrv_unref_child(bs, bs->file); + } QDECREF(snapshot_options); QDECREF(bs->explicit_options); QDECREF(bs->options); diff --git a/block/bochs.c b/block/bochs.c index 8c9652e..7dd2ac4 100644 --- a/block/bochs.c +++ b/block/bochs.c @@ -104,6 +104,12 @@ static int bochs_open(BlockDriverState *bs, QDict *opt= ions, int flags, struct bochs_header bochs; int ret; =20 + bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_file, + false, errp); + if (!bs->file) { + return -EINVAL; + } + bs->read_only =3D true; /* no write support yet */ =20 ret =3D bdrv_pread(bs->file, 0, &bochs, sizeof(bochs)); diff --git a/block/cloop.c b/block/cloop.c index 7b75f7e..877c9b0 100644 --- a/block/cloop.c +++ b/block/cloop.c @@ -66,6 +66,12 @@ static int cloop_open(BlockDriverState *bs, QDict *optio= ns, int flags, uint32_t offsets_size, max_compressed_block_size =3D 1, i; int ret; =20 + bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_file, + false, errp); + if (!bs->file) { + return -EINVAL; + } + bs->read_only =3D true; =20 /* read header */ diff --git a/block/crypto.c b/block/crypto.c index 7aa7eb5..200fd0b 100644 --- a/block/crypto.c +++ b/block/crypto.c @@ -300,6 +300,12 @@ static int block_crypto_open_generic(QCryptoBlockForma= t format, QCryptoBlockOpenOptions *open_opts =3D NULL; unsigned int cflags =3D 0; =20 + bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_file, + false, errp); + if (!bs->file) { + return -EINVAL; + } + opts =3D qemu_opts_create(opts_spec, NULL, 0, &error_abort); qemu_opts_absorb_qdict(opts, options, &local_err); if (local_err) { diff --git a/block/dmg.c b/block/dmg.c index 58a3ae8..8e387cd 100644 --- a/block/dmg.c +++ b/block/dmg.c @@ -413,6 +413,12 @@ static int dmg_open(BlockDriverState *bs, QDict *optio= ns, int flags, int64_t offset; int ret; =20 + bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_file, + false, errp); + if (!bs->file) { + return -EINVAL; + } + block_module_load_one("dmg-bz2"); bs->read_only =3D true; =20 diff --git a/block/parallels.c b/block/parallels.c index 2ccefa7..d3970e1 100644 --- a/block/parallels.c +++ b/block/parallels.c @@ -581,6 +581,12 @@ static int parallels_open(BlockDriverState *bs, QDict = *options, int flags, Error *local_err =3D NULL; char *buf; =20 + bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_file, + false, errp); + if (!bs->file) { + return -EINVAL; + } + ret =3D bdrv_pread(bs->file, 0, &ph, sizeof(ph)); if (ret < 0) { goto fail; diff --git a/block/qcow.c b/block/qcow.c index fb738fc..a6dfe1a 100644 --- a/block/qcow.c +++ b/block/qcow.c @@ -106,6 +106,12 @@ static int qcow_open(BlockDriverState *bs, QDict *opti= ons, int flags, QCowHeader header; Error *local_err =3D NULL; =20 + bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_file, + false, errp); + if (!bs->file) { + return -EINVAL; + } + ret =3D bdrv_pread(bs->file, 0, &header, sizeof(header)); if (ret < 0) { goto fail; diff --git a/block/qcow2.c b/block/qcow2.c index 3e274bd..4684554 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -814,8 +814,8 @@ static int qcow2_update_options(BlockDriverState *bs, Q= Dict *options, return ret; } =20 -static int qcow2_open(BlockDriverState *bs, QDict *options, int flags, - Error **errp) +static int qcow2_do_open(BlockDriverState *bs, QDict *options, int flags, + Error **errp) { BDRVQcow2State *s =3D bs->opaque; unsigned int len, i; @@ -1205,6 +1205,18 @@ static int qcow2_open(BlockDriverState *bs, QDict *o= ptions, int flags, return ret; } =20 +static int qcow2_open(BlockDriverState *bs, QDict *options, int flags, + Error **errp) +{ + bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_file, + false, errp); + if (!bs->file) { + return -EINVAL; + } + + return qcow2_do_open(bs, options, flags, errp); +} + static void qcow2_refresh_limits(BlockDriverState *bs, Error **errp) { BDRVQcow2State *s =3D bs->opaque; @@ -1785,7 +1797,7 @@ static void qcow2_invalidate_cache(BlockDriverState *= bs, Error **errp) options =3D qdict_clone_shallow(bs->options); =20 flags &=3D ~BDRV_O_INACTIVE; - ret =3D qcow2_open(bs, options, flags, &local_err); + ret =3D qcow2_do_open(bs, options, flags, &local_err); QDECREF(options); if (local_err) { error_propagate(errp, local_err); diff --git a/block/qed.c b/block/qed.c index 1a7ef0a..1ea5114 100644 --- a/block/qed.c +++ b/block/qed.c @@ -391,8 +391,8 @@ static void bdrv_qed_drain(BlockDriverState *bs) } } =20 -static int bdrv_qed_open(BlockDriverState *bs, QDict *options, int flags, - Error **errp) +static int bdrv_qed_do_open(BlockDriverState *bs, QDict *options, int flag= s, + Error **errp) { BDRVQEDState *s =3D bs->opaque; QEDHeader le_header; @@ -526,6 +526,18 @@ out: return ret; } =20 +static int bdrv_qed_open(BlockDriverState *bs, QDict *options, int flags, + Error **errp) +{ + bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_file, + false, errp); + if (!bs->file) { + return -EINVAL; + } + + return bdrv_qed_do_open(bs, options, flags, errp); +} + static void bdrv_qed_refresh_limits(BlockDriverState *bs, Error **errp) { BDRVQEDState *s =3D bs->opaque; @@ -1603,7 +1615,7 @@ static void bdrv_qed_invalidate_cache(BlockDriverStat= e *bs, Error **errp) bdrv_qed_close(bs); =20 memset(s, 0, sizeof(BDRVQEDState)); - ret =3D bdrv_qed_open(bs, NULL, bs->open_flags, &local_err); + ret =3D bdrv_qed_do_open(bs, NULL, bs->open_flags, &local_err); if (local_err) { error_propagate(errp, local_err); error_prepend(errp, "Could not reopen qed layer: "); diff --git a/block/raw-format.c b/block/raw-format.c index 8404a82..30caaa5 100644 --- a/block/raw-format.c +++ b/block/raw-format.c @@ -384,6 +384,12 @@ static int raw_open(BlockDriverState *bs, QDict *optio= ns, int flags, BDRVRawState *s =3D bs->opaque; int ret; =20 + bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_file, + false, errp); + if (!bs->file) { + return -EINVAL; + } + bs->sg =3D bs->file->bs->sg; bs->supported_write_flags =3D BDRV_REQ_FUA & bs->file->bs->supported_write_flags; diff --git a/block/replication.c b/block/replication.c index 729dd12..eff85c7 100644 --- a/block/replication.c +++ b/block/replication.c @@ -86,6 +86,12 @@ static int replication_open(BlockDriverState *bs, QDict = *options, const char *mode; const char *top_id; =20 + bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_file, + false, errp); + if (!bs->file) { + return -EINVAL; + } + ret =3D -EINVAL; opts =3D qemu_opts_create(&replication_runtime_opts, NULL, 0, &error_a= bort); qemu_opts_absorb_qdict(opts, options, &local_err); diff --git a/block/vdi.c b/block/vdi.c index 0aeb940..18b4773 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -363,6 +363,12 @@ static int vdi_open(BlockDriverState *bs, QDict *optio= ns, int flags, int ret; Error *local_err =3D NULL; =20 + bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_file, + false, errp); + if (!bs->file) { + return -EINVAL; + } + logout("\n"); =20 ret =3D bdrv_read(bs->file, 0, (uint8_t *)&header, 1); diff --git a/block/vhdx.c b/block/vhdx.c index 68db9e0..4dc2743 100644 --- a/block/vhdx.c +++ b/block/vhdx.c @@ -898,6 +898,12 @@ static int vhdx_open(BlockDriverState *bs, QDict *opti= ons, int flags, uint64_t signature; Error *local_err =3D NULL; =20 + bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_file, + false, errp); + if (!bs->file) { + return -EINVAL; + } + s->bat =3D NULL; s->first_visible_write =3D true; =20 diff --git a/block/vmdk.c b/block/vmdk.c index 393c84d..9d68ec5 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -943,6 +943,12 @@ static int vmdk_open(BlockDriverState *bs, QDict *opti= ons, int flags, uint32_t magic; Error *local_err =3D NULL; =20 + bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_file, + false, errp); + if (!bs->file) { + return -EINVAL; + } + buf =3D vmdk_read_desc(bs->file, 0, errp); if (!buf) { return -EINVAL; diff --git a/block/vpc.c b/block/vpc.c index ed6353d..d0df2a1 100644 --- a/block/vpc.c +++ b/block/vpc.c @@ -220,6 +220,12 @@ static int vpc_open(BlockDriverState *bs, QDict *optio= ns, int flags, int disk_type =3D VHD_DYNAMIC; int ret; =20 + bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_file, + false, errp); + if (!bs->file) { + return -EINVAL; + } + opts =3D qemu_opts_create(&vpc_runtime_opts, NULL, 0, &error_abort); qemu_opts_absorb_qdict(opts, options, &local_err); if (local_err) { diff --git a/tests/qemu-iotests/051.out b/tests/qemu-iotests/051.out index 42bf416..7524c62 100644 --- a/tests/qemu-iotests/051.out +++ b/tests/qemu-iotests/051.out @@ -225,7 +225,7 @@ Testing: -drive driver=3Dnbd QEMU_PROG: -drive driver=3Dnbd: NBD server address missing =20 Testing: -drive driver=3Draw -QEMU_PROG: -drive driver=3Draw: Can't use 'raw' as a block driver for the = protocol level +QEMU_PROG: -drive driver=3Draw: A block device must be specified for "file" =20 Testing: -drive file.driver=3Dfile QEMU_PROG: -drive file.driver=3Dfile: The 'file' block driver requires a f= ile name @@ -234,7 +234,7 @@ Testing: -drive file.driver=3Dnbd QEMU_PROG: -drive file.driver=3Dnbd: NBD server address missing =20 Testing: -drive file.driver=3Draw -QEMU_PROG: -drive file.driver=3Draw: Can't use 'raw' as a block driver for= the protocol level +QEMU_PROG: -drive file.driver=3Draw: A block device must be specified for = "file" =20 Testing: -drive foo=3Dbar QEMU_PROG: -drive foo=3Dbar: Must specify either driver or file diff --git a/tests/qemu-iotests/051.pc.out b/tests/qemu-iotests/051.pc.out index 603bb76..f1669c1 100644 --- a/tests/qemu-iotests/051.pc.out +++ b/tests/qemu-iotests/051.pc.out @@ -319,7 +319,7 @@ Testing: -drive driver=3Dnbd QEMU_PROG: -drive driver=3Dnbd: NBD server address missing =20 Testing: -drive driver=3Draw -QEMU_PROG: -drive driver=3Draw: Can't use 'raw' as a block driver for the = protocol level +QEMU_PROG: -drive driver=3Draw: A block device must be specified for "file" =20 Testing: -drive file.driver=3Dfile QEMU_PROG: -drive file.driver=3Dfile: The 'file' block driver requires a f= ile name @@ -328,7 +328,7 @@ Testing: -drive file.driver=3Dnbd QEMU_PROG: -drive file.driver=3Dnbd: NBD server address missing =20 Testing: -drive file.driver=3Draw -QEMU_PROG: -drive file.driver=3Draw: Can't use 'raw' as a block driver for= the protocol level +QEMU_PROG: -drive file.driver=3Draw: A block device must be specified for = "file" =20 Testing: -drive foo=3Dbar QEMU_PROG: -drive foo=3Dbar: Must specify either driver or file --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487007410458851.2540589813685; Mon, 13 Feb 2017 09:36:50 -0800 (PST) Received: from localhost ([::1]:58422 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKYQ-0006b1-B6 for importer@patchew.org; Mon, 13 Feb 2017 12:36:46 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58798) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKLT-0002gG-PF for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKLR-0005l4-LY for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:23 -0500 Received: from mx1.redhat.com ([209.132.183.28]:47932) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKLO-0005jg-2w; Mon, 13 Feb 2017 12:23:18 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2791B824; Mon, 13 Feb 2017 17:23:18 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3I031842; Mon, 13 Feb 2017 12:23:16 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:24 +0100 Message-Id: <1487006583-24350-3-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Mon, 13 Feb 2017 17:23:18 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 02/41] block: Add op blocker permission constants X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This patch defines the permission categories that will be used by the new op blocker system. Signed-off-by: Kevin Wolf --- include/block/block_int.h | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/include/block/block_int.h b/include/block/block_int.h index 2d92d7e..6a37b06 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -414,6 +414,40 @@ struct BdrvChildRole { extern const BdrvChildRole child_file; extern const BdrvChildRole child_format; =20 +enum { + /** + * A user that has the "permission" of consistent reads is guaranteed = that + * their view of the contents of the block device is complete and + * self-consistent, repesenting the contents of a disk at a specific p= oint. + * + * For most block devices (including their backing files) this is true= , but + * the property cannot be maintained in a few situations like for + * intermediate nodes of a commit block job. + */ + BLK_PERM_CONSISTENT_READ =3D 0x01, + + /** This permission is required to change the visible disk contents. */ + BLK_PERM_WRITE =3D 0x02, + + /** + * This permission (which is weaker than BLK_PERM_WRITE) is both enoug= h and + * required for writes to the block node when the caller promises that + * this visible disk contents doesn't change. + */ + BLK_PERM_WRITE_UNCHANGED =3D 0x04, + + /** This permission is required to change the size of a block node. */ + BLK_PERM_RESIZE =3D 0x08, + + /** + * This permission is required to change the node that this BdrvChild + * points to. + */ + BLK_PERM_GRAPH_MOD =3D 0x10, + + BLK_PERM_ALL =3D 0x1f, +}; + struct BdrvChild { BlockDriverState *bs; char *name; --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 14870079974861002.1272124795462; Mon, 13 Feb 2017 09:46:37 -0800 (PST) Received: from localhost ([::1]:58485 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKhu-0007R9-7A for importer@patchew.org; Mon, 13 Feb 2017 12:46:34 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58880) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKLX-0002jR-0J for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:28 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKLV-0005mm-Pw for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:27 -0500 Received: from mx1.redhat.com ([209.132.183.28]:40086) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKLQ-0005ka-TO; Mon, 13 Feb 2017 12:23:21 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id F253AC05678C; Mon, 13 Feb 2017 17:23:20 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3J031842; Mon, 13 Feb 2017 12:23:18 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:25 +0100 Message-Id: <1487006583-24350-4-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Mon, 13 Feb 2017 17:23:21 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 03/41] block: Add Error argument to bdrv_attach_child() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" It will have to return an error soon, so prepare the callers for it. Signed-off-by: Kevin Wolf --- block.c | 13 ++++++++++--- block/quorum.c | 8 +++++++- include/block/block.h | 3 ++- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/block.c b/block.c index 0618f4b..9895aaf 100644 --- a/block.c +++ b/block.c @@ -1323,7 +1323,8 @@ BdrvChild *bdrv_root_attach_child(BlockDriverState *c= hild_bs, BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs, BlockDriverState *child_bs, const char *child_name, - const BdrvChildRole *child_role) + const BdrvChildRole *child_role, + Error **errp) { BdrvChild *child =3D bdrv_root_attach_child(child_bs, child_name, chil= d_role, parent_bs); @@ -1424,7 +1425,9 @@ void bdrv_set_backing_hd(BlockDriverState *bs, BlockD= riverState *backing_hd) bs->backing =3D NULL; goto out; } - bs->backing =3D bdrv_attach_child(bs, backing_hd, "backing", &child_ba= cking); + /* FIXME Error handling */ + bs->backing =3D bdrv_attach_child(bs, backing_hd, "backing", &child_ba= cking, + &error_abort); bs->open_flags &=3D ~BDRV_O_NO_BACKING; pstrcpy(bs->backing_file, sizeof(bs->backing_file), backing_hd->filena= me); pstrcpy(bs->backing_format, sizeof(bs->backing_format), @@ -1594,7 +1597,11 @@ BdrvChild *bdrv_open_child(const char *filename, goto done; } =20 - c =3D bdrv_attach_child(parent, bs, bdref_key, child_role); + c =3D bdrv_attach_child(parent, bs, bdref_key, child_role, errp); + if (!c) { + bdrv_unref(bs); + goto done; + } =20 done: qdict_del(options, bdref_key); diff --git a/block/quorum.c b/block/quorum.c index 86e2072..45bf010 100644 --- a/block/quorum.c +++ b/block/quorum.c @@ -1032,10 +1032,16 @@ static void quorum_add_child(BlockDriverState *bs, = BlockDriverState *child_bs, =20 /* We can safely add the child now */ bdrv_ref(child_bs); - child =3D bdrv_attach_child(bs, child_bs, indexstr, &child_format); + + child =3D bdrv_attach_child(bs, child_bs, indexstr, &child_format, err= p); + if (child =3D=3D NULL) { + bdrv_unref(child_bs); + goto out; + } s->children =3D g_renew(BdrvChild *, s->children, s->num_children + 1); s->children[s->num_children++] =3D child; =20 +out: bdrv_drained_end(bs); } =20 diff --git a/include/block/block.h b/include/block/block.h index 4e81f20..93812df 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -482,7 +482,8 @@ void bdrv_unref_child(BlockDriverState *parent, BdrvChi= ld *child); BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs, BlockDriverState *child_bs, const char *child_name, - const BdrvChildRole *child_role); + const BdrvChildRole *child_role, + Error **errp); =20 bool bdrv_op_is_blocked(BlockDriverState *bs, BlockOpType op, Error **errp= ); void bdrv_op_block(BlockDriverState *bs, BlockOpType op, Error *reason); --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487008243580431.96607192911074; Mon, 13 Feb 2017 09:50:43 -0800 (PST) Received: from localhost ([::1]:58507 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKlt-0002r8-6j for importer@patchew.org; Mon, 13 Feb 2017 12:50:41 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58938) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKLZ-0002mb-H0 for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:31 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKLY-0005nh-2k for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:29 -0500 Received: from mx1.redhat.com ([209.132.183.28]:38738) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKLT-0005lD-4p; Mon, 13 Feb 2017 12:23:23 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C467363E0F; Mon, 13 Feb 2017 17:23:22 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3K031842; Mon, 13 Feb 2017 12:23:21 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:26 +0100 Message-Id: <1487006583-24350-5-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Mon, 13 Feb 2017 17:23:22 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 04/41] block: Let callers request permissions when attaching a child node X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" When attaching a node as a child to a new parent, the required and shared permissions for this parent are checked against all other parents of the node now, and an error is returned if there is a conflict. This allows error returns to a function that previously always succeeded, and the same is true for quite a few callers and their callers. Converting all of them within the same patch would be too much, so for now everyone tells that they don't need any permissions and allow everyone else to do anything. This way we can use &error_abort initially and convert caller by caller to pass actual permission requirements and implement error handling. All these places are marked with FIXME comments and it will be the job of the next patches to clean them up again. Signed-off-by: Kevin Wolf --- block.c | 66 +++++++++++++++++++++++++++++++++++++++++--= ---- block/block-backend.c | 8 ++++-- include/block/block_int.h | 15 ++++++++++- 3 files changed, 78 insertions(+), 11 deletions(-) diff --git a/block.c b/block.c index 9895aaf..5977492 100644 --- a/block.c +++ b/block.c @@ -1281,6 +1281,38 @@ static int bdrv_fill_options(QDict **options, const = char *filename, return 0; } =20 +static int bdrv_check_update_perm(BlockDriverState *bs, uint64_t new_used_= perm, + uint64_t new_shared_perm, + BdrvChild *ignore_child, Error **errp) +{ + BdrvChild *c; + + /* There is no reason why anyone couldn't tolerate write_unchanged */ + assert(new_shared_perm & BLK_PERM_WRITE_UNCHANGED); + + QLIST_FOREACH(c, &bs->parents, next_parent) { + if (c =3D=3D ignore_child) { + continue; + } + + if ((new_used_perm & c->shared_perm) !=3D new_used_perm || + (c->perm & new_shared_perm) !=3D c->perm) + { + const char *user =3D NULL; + if (c->role->get_name) { + user =3D c->role->get_name(c); + if (user && !*user) { + user =3D NULL; + } + } + error_setg(errp, "Conflicts with %s", user ?: "another operati= on"); + return -EPERM; + } + } + + return 0; +} + static void bdrv_replace_child(BdrvChild *child, BlockDriverState *new_bs) { BlockDriverState *old_bs =3D child->bs; @@ -1305,14 +1337,25 @@ static void bdrv_replace_child(BdrvChild *child, Bl= ockDriverState *new_bs) BdrvChild *bdrv_root_attach_child(BlockDriverState *child_bs, const char *child_name, const BdrvChildRole *child_role, - void *opaque) + uint64_t perm, uint64_t shared_perm, + void *opaque, Error **errp) { - BdrvChild *child =3D g_new(BdrvChild, 1); + BdrvChild *child; + int ret; + + ret =3D bdrv_check_update_perm(child_bs, perm, shared_perm, NULL, errp= ); + if (ret < 0) { + return NULL; + } + + child =3D g_new(BdrvChild, 1); *child =3D (BdrvChild) { - .bs =3D NULL, - .name =3D g_strdup(child_name), - .role =3D child_role, - .opaque =3D opaque, + .bs =3D NULL, + .name =3D g_strdup(child_name), + .role =3D child_role, + .perm =3D perm, + .shared_perm =3D shared_perm, + .opaque =3D opaque, }; =20 bdrv_replace_child(child, child_bs); @@ -1326,8 +1369,15 @@ BdrvChild *bdrv_attach_child(BlockDriverState *paren= t_bs, const BdrvChildRole *child_role, Error **errp) { - BdrvChild *child =3D bdrv_root_attach_child(child_bs, child_name, chil= d_role, - parent_bs); + BdrvChild *child; + + /* FIXME Use real permissions */ + child =3D bdrv_root_attach_child(child_bs, child_name, child_role, + 0, BLK_PERM_ALL, parent_bs, errp); + if (child =3D=3D NULL) { + return NULL; + } + QLIST_INSERT_HEAD(&parent_bs->children, child, next); return child; } diff --git a/block/block-backend.c b/block/block-backend.c index efbf398..d080f01 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -163,7 +163,9 @@ BlockBackend *blk_new_open(const char *filename, const = char *reference, return NULL; } =20 - blk->root =3D bdrv_root_attach_child(bs, "root", &child_root, blk); + /* FIXME Use real permissions */ + blk->root =3D bdrv_root_attach_child(bs, "root", &child_root, + 0, BLK_PERM_ALL, blk, &error_abort); =20 return blk; } @@ -498,7 +500,9 @@ void blk_remove_bs(BlockBackend *blk) void blk_insert_bs(BlockBackend *blk, BlockDriverState *bs) { bdrv_ref(bs); - blk->root =3D bdrv_root_attach_child(bs, "root", &child_root, blk); + /* FIXME Use real permissions */ + blk->root =3D bdrv_root_attach_child(bs, "root", &child_root, + 0, BLK_PERM_ALL, blk, &error_abort); =20 notifier_list_notify(&blk->insert_bs_notifiers, blk); if (blk->public.throttle_state) { diff --git a/include/block/block_int.h b/include/block/block_int.h index 6a37b06..f36b064 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -453,6 +453,18 @@ struct BdrvChild { char *name; const BdrvChildRole *role; void *opaque; + + /** + * Granted permissions for operating on this BdrvChild (BLK_PERM_* bit= mask) + */ + uint64_t perm; + + /** + * Permissions that can still be granted to other users of @bs while t= his + * BdrvChild is still attached to it. (BLK_PERM_* bitmask) + */ + uint64_t shared_perm; + QLIST_ENTRY(BdrvChild) next; QLIST_ENTRY(BdrvChild) next_parent; }; @@ -816,7 +828,8 @@ void hmp_drive_add_node(Monitor *mon, const char *optst= r); BdrvChild *bdrv_root_attach_child(BlockDriverState *child_bs, const char *child_name, const BdrvChildRole *child_role, - void *opaque); + uint64_t perm, uint64_t shared_perm, + void *opaque, Error **errp); void bdrv_root_unref_child(BdrvChild *child); =20 const char *bdrv_get_parent_name(const BlockDriverState *bs); --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487008272726122.54862837310111; Mon, 13 Feb 2017 09:51:12 -0800 (PST) Received: from localhost ([::1]:58512 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKmN-0003Kt-1a for importer@patchew.org; Mon, 13 Feb 2017 12:51:11 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58952) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKLa-0002nG-3v for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:31 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKLY-0005o2-NG for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:30 -0500 Received: from mx1.redhat.com ([209.132.183.28]:57364) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKLV-0005mB-Ev; Mon, 13 Feb 2017 12:23:25 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8D034811A7; Mon, 13 Feb 2017 17:23:25 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3L031842; Mon, 13 Feb 2017 12:23:23 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:27 +0100 Message-Id: <1487006583-24350-6-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Mon, 13 Feb 2017 17:23:25 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 05/41] tests: Use opened block node for block job tests X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" blk_insert_bs() and block job related functions will soon require an opened block node (permission calculations will involve the block driver), so let our tests be consistent with the real users in this respect. Signed-off-by: Kevin Wolf --- tests/test-blockjob-txn.c | 6 +++++- tests/test-blockjob.c | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/test-blockjob-txn.c b/tests/test-blockjob-txn.c index b132e39..f6dfd08 100644 --- a/tests/test-blockjob-txn.c +++ b/tests/test-blockjob-txn.c @@ -96,7 +96,10 @@ static BlockJob *test_block_job_start(unsigned int itera= tions, char job_id[24]; =20 data =3D g_new0(TestBlockJobCBData, 1); - bs =3D bdrv_new(); + + bs =3D bdrv_open("null-co://", NULL, NULL, 0, &error_abort); + g_assert_nonnull(bs); + snprintf(job_id, sizeof(job_id), "job%u", counter++); s =3D block_job_create(job_id, &test_block_job_driver, bs, 0, BLOCK_JOB_DEFAULT, test_block_job_cb, @@ -242,6 +245,7 @@ static void test_pair_jobs_fail_cancel_race(void) int main(int argc, char **argv) { qemu_init_main_loop(&error_abort); + bdrv_init(); =20 g_test_init(&argc, &argv, NULL); g_test_add_func("/single/success", test_single_job_success); diff --git a/tests/test-blockjob.c b/tests/test-blockjob.c index 60b78a3..068c9e4 100644 --- a/tests/test-blockjob.c +++ b/tests/test-blockjob.c @@ -54,7 +54,10 @@ static BlockJob *do_test_id(BlockBackend *blk, const cha= r *id, static BlockBackend *create_blk(const char *name) { BlockBackend *blk =3D blk_new(); - BlockDriverState *bs =3D bdrv_new(); + BlockDriverState *bs; + + bs =3D bdrv_open("null-co://", NULL, NULL, 0, &error_abort); + g_assert_nonnull(bs); =20 blk_insert_bs(blk, bs); bdrv_unref(bs); @@ -140,6 +143,7 @@ static void test_job_ids(void) int main(int argc, char **argv) { qemu_init_main_loop(&error_abort); + bdrv_init(); =20 g_test_init(&argc, &argv, NULL); g_test_add_func("/blockjob/ids", test_job_ids); --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487008760697687.4100563047704; Mon, 13 Feb 2017 09:59:20 -0800 (PST) Received: from localhost ([::1]:58559 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKuF-0002xE-Cw for importer@patchew.org; Mon, 13 Feb 2017 12:59:19 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59024) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKLe-0002s4-4e for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:36 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKLa-0005qQ-UY for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:34 -0500 Received: from mx1.redhat.com ([209.132.183.28]:50108) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKLX-0005nC-5k; Mon, 13 Feb 2017 12:23:27 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6843C3B702; Mon, 13 Feb 2017 17:23:27 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3M031842; Mon, 13 Feb 2017 12:23:25 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:28 +0100 Message-Id: <1487006583-24350-7-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Mon, 13 Feb 2017 17:23:27 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 06/41] block: Involve block drivers in permission granting X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" In many cases, the required permissions of one node on its children depends on what its parents require from it. For example, the raw format or most filter drivers only need to request consistent reads if that's something that one of their parents wants. In order to achieve this, this patch introduces two new BlockDriver callbacks. The first one lets drivers first check (recursively) whether the requested permissions can be set; the second one actually sets the new permission bitmask. Also add helper functions that drivers can use in their implementation of the callbacks to update their permissions on a specific child. Signed-off-by: Kevin Wolf --- block.c | 125 ++++++++++++++++++++++++++++++++++++++++++= ++++ include/block/block_int.h | 46 +++++++++++++++++ 2 files changed, 171 insertions(+) diff --git a/block.c b/block.c index 5977492..c27cdce 100644 --- a/block.c +++ b/block.c @@ -1281,11 +1281,103 @@ static int bdrv_fill_options(QDict **options, cons= t char *filename, return 0; } =20 +static int bdrv_check_perm(BlockDriverState *bs, uint64_t cumulative_perms, + uint64_t cumulative_shared_perms, Error **errp) +{ + BlockDriver *drv =3D bs->drv; + BdrvChild *c; + int ret; + + if (!drv) { + error_setg(errp, "Block node is not opened"); + return -EINVAL; + } + + /* Write permissions never work with read-only images */ + if ((cumulative_perms & (BLK_PERM_WRITE | BLK_PERM_WRITE_UNCHANGED)) && + bdrv_is_read_only(bs)) + { + error_setg(errp, "Block node is read-only"); + return -EPERM; + } + + /* Check this node */ + if (drv->bdrv_check_perm) { + return drv->bdrv_check_perm(bs, cumulative_perms, + cumulative_shared_perms, errp); + } + + /* Drivers may not have .bdrv_child_perm() */ + if (!drv->bdrv_child_perm) { + return 0; + } + + /* Check all children */ + QLIST_FOREACH(c, &bs->children, next) { + uint64_t cur_perm, cur_shared; + drv->bdrv_child_perm(bs, c, c->role, + cumulative_perms, cumulative_shared_perms, + &cur_perm, &cur_shared); + ret =3D bdrv_child_check_perm(c, cur_perm, cur_shared, errp); + if (ret < 0) { + return ret; + } + } + + return 0; +} + +static void bdrv_set_perm(BlockDriverState *bs, uint64_t cumulative_perms, + uint64_t cumulative_shared_perms) +{ + BlockDriver *drv =3D bs->drv; + BdrvChild *c; + + if (!drv) { + return; + } + + /* Update this node */ + if (drv->bdrv_set_perm) { + drv->bdrv_set_perm(bs, cumulative_perms, cumulative_shared_perms); + } + + /* Drivers may not have .bdrv_child_perm() */ + if (!drv->bdrv_child_perm) { + return; + } + + /* Update all children */ + QLIST_FOREACH(c, &bs->children, next) { + uint64_t cur_perm, cur_shared; + drv->bdrv_child_perm(bs, c, c->role, + cumulative_perms, cumulative_shared_perms, + &cur_perm, &cur_shared); + bdrv_child_set_perm(c, cur_perm, cur_shared); + } +} + +static void bdrv_update_perm(BlockDriverState *bs) +{ + BdrvChild *c; + uint64_t cumulative_perms =3D 0; + uint64_t cumulative_shared_perms =3D BLK_PERM_ALL; + + QLIST_FOREACH(c, &bs->parents, next_parent) { + cumulative_perms |=3D c->perm; + cumulative_shared_perms &=3D c->shared_perm; + } + + bdrv_set_perm(bs, cumulative_perms, cumulative_shared_perms); +} + static int bdrv_check_update_perm(BlockDriverState *bs, uint64_t new_used_= perm, uint64_t new_shared_perm, BdrvChild *ignore_child, Error **errp) { BdrvChild *c; + uint64_t cumulative_perms =3D new_used_perm; + uint64_t cumulative_shared_perms =3D new_shared_perm; =20 /* There is no reason why anyone couldn't tolerate write_unchanged */ assert(new_shared_perm & BLK_PERM_WRITE_UNCHANGED); @@ -1308,8 +1400,39 @@ static int bdrv_check_update_perm(BlockDriverState *= bs, uint64_t new_used_perm, error_setg(errp, "Conflicts with %s", user ?: "another operati= on"); return -EPERM; } + + cumulative_perms |=3D c->perm; + cumulative_shared_perms &=3D c->shared_perm; } =20 + return bdrv_check_perm(bs, cumulative_perms, cumulative_shared_perms, = errp); +} + +int bdrv_child_check_perm(BdrvChild *c, uint64_t perm, uint64_t shared, + Error **errp) +{ + return bdrv_check_update_perm(c->bs, perm, shared, c, errp); +} + +void bdrv_child_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared) +{ + c->perm =3D perm; + c->shared_perm =3D shared; + bdrv_update_perm(c->bs); +} + +int bdrv_child_try_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared, + Error **errp) +{ + int ret; + + ret =3D bdrv_child_check_perm(c, perm, shared, errp); + if (ret < 0) { + return ret; + } + + bdrv_child_set_perm(c, perm, shared); + return 0; } =20 @@ -1322,6 +1445,7 @@ static void bdrv_replace_child(BdrvChild *child, Bloc= kDriverState *new_bs) child->role->drained_end(child); } QLIST_REMOVE(child, next_parent); + bdrv_update_perm(old_bs); } =20 child->bs =3D new_bs; @@ -1331,6 +1455,7 @@ static void bdrv_replace_child(BdrvChild *child, Bloc= kDriverState *new_bs) if (new_bs->quiesce_counter && child->role->drained_begin) { child->role->drained_begin(child); } + bdrv_update_perm(new_bs); } } =20 diff --git a/include/block/block_int.h b/include/block/block_int.h index f36b064..8578e17 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -320,6 +320,45 @@ struct BlockDriver { void (*bdrv_del_child)(BlockDriverState *parent, BdrvChild *child, Error **errp); =20 + /** + * Checks whether the requested set of cumulative permissions in @perm + * can be granted for accessing @bs and whether no other users are usi= ng + * permissions other than those given in @shared (both arguments take + * BLK_PERM_* bitmasks). + * + * If both conditions are met, 0 is returned. Otherwise, -errno is ret= urned + * and errp is set to an error describing the conflict. + */ + int (*bdrv_check_perm)(BlockDriverState *bs, uint64_t perm, + uint64_t shared, Error **errp); + + /** + * Called to inform the driver that the set of cumulative set of used + * permissions for @bs has changed to @perm, and the set of sharable + * permission to @shared. The driver can use this to propagate changes= to + * its children (i.e. request permissions only if a parent actually ne= eds + * them). + * + * If permissions are added to @perm or dropped from @shared, callers = must + * use bdrv_check_perm() first to ensure that this operation is valid. + * Dropping from @perm or adding to @shared is always allowed without a + * previous check. + */ + void (*bdrv_set_perm)(BlockDriverState *bs, uint64_t perm, uint64_t sh= ared); + + /** + * Returns in @nperm and @nshared the permissions that the driver for = @bs + * needs on its child @c, based on the cumulative permissions requeste= d by + * the parents in @parent_perm and @parent_shared. + * + * If @c is NULL, return the permissions for attaching a new child for= the + * given @role. + */ + void (*bdrv_child_perm)(BlockDriverState* bs, BdrvChild *c, + const BdrvChildRole *role, + uint64_t parent_perm, uint64_t parent_shared, + uint64_t *nperm, uint64_t *nshared); + QLIST_ENTRY(BlockDriver) list; }; =20 @@ -832,6 +871,13 @@ BdrvChild *bdrv_root_attach_child(BlockDriverState *ch= ild_bs, void *opaque, Error **errp); void bdrv_root_unref_child(BdrvChild *child); =20 +int bdrv_child_check_perm(BdrvChild *c, uint64_t perm, uint64_t shared, + Error **errp); +void bdrv_child_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared); +int bdrv_child_try_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared, + Error **errp); + + const char *bdrv_get_parent_name(const BlockDriverState *bs); void blk_dev_change_media_cb(BlockBackend *blk, bool load); bool blk_dev_has_removable_media(BlockBackend *blk); --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487008508925601.6138493506533; Mon, 13 Feb 2017 09:55:08 -0800 (PST) Received: from localhost ([::1]:58533 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKqA-0007Hf-9r for importer@patchew.org; Mon, 13 Feb 2017 12:55:06 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59023) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKLe-0002s3-4w for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:35 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKLb-0005ql-QY for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:34 -0500 Received: from mx1.redhat.com ([209.132.183.28]:35158) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKLZ-0005nz-0d; Mon, 13 Feb 2017 12:23:29 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 376538046B; Mon, 13 Feb 2017 17:23:29 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3N031842; Mon, 13 Feb 2017 12:23:27 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:29 +0100 Message-Id: <1487006583-24350-8-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Mon, 13 Feb 2017 17:23:29 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 07/41] block: Default .bdrv_child_perm() for filter drivers X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Most filters need permissions related to read and write for their children, but only if the node has a parent that wants to use the same operation on the filter. The same is true for resize. This adds a default implementation that simply forwards all necessary permissions to all children of the node and leaves the other permissions unchanged. Signed-off-by: Kevin Wolf --- block.c | 24 ++++++++++++++++++++++++ include/block/block_int.h | 8 ++++++++ 2 files changed, 32 insertions(+) diff --git a/block.c b/block.c index c27cdce..290768d 100644 --- a/block.c +++ b/block.c @@ -1436,6 +1436,30 @@ int bdrv_child_try_set_perm(BdrvChild *c, uint64_t p= erm, uint64_t shared, return 0; } =20 +#define DEFAULT_PERM_PASSTHROUGH (BLK_PERM_CONSISTENT_READ \ + | BLK_PERM_WRITE \ + | BLK_PERM_WRITE_UNCHANGED \ + | BLK_PERM_RESIZE) +#define DEFAULT_PERM_UNCHANGED (BLK_PERM_ALL & ~DEFAULT_PERM_PASSTHROUGH) + +void bdrv_filter_default_perms(BlockDriverState *bs, BdrvChild *c, + const BdrvChildRole *role, + uint64_t perm, uint64_t shared, + uint64_t *nperm, uint64_t *nshared) +{ + if (c =3D=3D NULL) { + *nperm =3D 0; + *nshared =3D BLK_PERM_ALL; + return; + } + + *nperm =3D (perm & DEFAULT_PERM_PASSTHROUGH) | + (c->perm & DEFAULT_PERM_UNCHANGED); + *nshared =3D (shared & DEFAULT_PERM_PASSTHROUGH) | + (c->shared_perm & DEFAULT_PERM_UNCHANGED); +} + + static void bdrv_replace_child(BdrvChild *child, BlockDriverState *new_bs) { BlockDriverState *old_bs =3D child->bs; diff --git a/include/block/block_int.h b/include/block/block_int.h index 8578e17..2d74f92 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -877,6 +877,14 @@ void bdrv_child_set_perm(BdrvChild *c, uint64_t perm, = uint64_t shared); int bdrv_child_try_set_perm(BdrvChild *c, uint64_t perm, uint64_t shared, Error **errp); =20 +/* Default implementation for BlockDriver.bdrv_child_perm() that can be us= ed by + * block filters: Forward CONSISTENT_READ, WRITE, WRITE_UNCHANGED and RESI= ZE to + * all children */ +void bdrv_filter_default_perms(BlockDriverState *bs, BdrvChild *c, + const BdrvChildRole *role, + uint64_t perm, uint64_t shared, + uint64_t *nperm, uint64_t *nshared); + =20 const char *bdrv_get_parent_name(const BlockDriverState *bs); void blk_dev_change_media_cb(BlockBackend *blk, bool load); --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487008542161298.4428422079378; Mon, 13 Feb 2017 09:55:42 -0800 (PST) Received: from localhost ([::1]:58536 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKqg-0007ju-Rw for importer@patchew.org; Mon, 13 Feb 2017 12:55:38 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59098) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKLh-0002v8-Be for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:38 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKLf-0005u8-Sv for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:37 -0500 Received: from mx1.redhat.com ([209.132.183.28]:50124) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKLa-0005q6-R2; Mon, 13 Feb 2017 12:23:31 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0F4723B702; Mon, 13 Feb 2017 17:23:31 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3O031842; Mon, 13 Feb 2017 12:23:29 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:30 +0100 Message-Id: <1487006583-24350-9-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Mon, 13 Feb 2017 17:23:31 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 08/41] block: Request child permissions in filter drivers X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" All callers will have to request permissions for all of their child nodes. Block drivers that act as simply filters can use the default implementation of .bdrv_child_perm(). Signed-off-by: Kevin Wolf --- block/blkdebug.c | 2 ++ block/blkreplay.c | 1 + block/blkverify.c | 1 + block/quorum.c | 2 ++ block/raw-format.c | 1 + block/replication.c | 1 + 6 files changed, 8 insertions(+) diff --git a/block/blkdebug.c b/block/blkdebug.c index acccf85..39301d8 100644 --- a/block/blkdebug.c +++ b/block/blkdebug.c @@ -741,6 +741,8 @@ static BlockDriver bdrv_blkdebug =3D { .bdrv_file_open =3D blkdebug_open, .bdrv_close =3D blkdebug_close, .bdrv_reopen_prepare =3D blkdebug_reopen_prepare, + .bdrv_child_perm =3D bdrv_filter_default_perms, + .bdrv_getlength =3D blkdebug_getlength, .bdrv_truncate =3D blkdebug_truncate, .bdrv_refresh_filename =3D blkdebug_refresh_filename, diff --git a/block/blkreplay.c b/block/blkreplay.c index a741654..c4e07f0 100755 --- a/block/blkreplay.c +++ b/block/blkreplay.c @@ -137,6 +137,7 @@ static BlockDriver bdrv_blkreplay =3D { =20 .bdrv_file_open =3D blkreplay_open, .bdrv_close =3D blkreplay_close, + .bdrv_child_perm =3D bdrv_filter_default_perms, .bdrv_getlength =3D blkreplay_getlength, =20 .bdrv_co_preadv =3D blkreplay_co_preadv, diff --git a/block/blkverify.c b/block/blkverify.c index 43a940c..9a1e21c 100644 --- a/block/blkverify.c +++ b/block/blkverify.c @@ -320,6 +320,7 @@ static BlockDriver bdrv_blkverify =3D { .bdrv_parse_filename =3D blkverify_parse_filename, .bdrv_file_open =3D blkverify_open, .bdrv_close =3D blkverify_close, + .bdrv_child_perm =3D bdrv_filter_default_perms, .bdrv_getlength =3D blkverify_getlength, .bdrv_refresh_filename =3D blkverify_refresh_filename, =20 diff --git a/block/quorum.c b/block/quorum.c index 45bf010..b6d8215 100644 --- a/block/quorum.c +++ b/block/quorum.c @@ -1132,6 +1132,8 @@ static BlockDriver bdrv_quorum =3D { .bdrv_add_child =3D quorum_add_child, .bdrv_del_child =3D quorum_del_child, =20 + .bdrv_child_perm =3D bdrv_filter_default_perms, + .is_filter =3D true, .bdrv_recurse_is_first_non_filter =3D quorum_recurse_is_first_non_fi= lter, }; diff --git a/block/raw-format.c b/block/raw-format.c index 30caaa5..bbcfcbf 100644 --- a/block/raw-format.c +++ b/block/raw-format.c @@ -467,6 +467,7 @@ BlockDriver bdrv_raw =3D { .bdrv_reopen_abort =3D &raw_reopen_abort, .bdrv_open =3D &raw_open, .bdrv_close =3D &raw_close, + .bdrv_child_perm =3D bdrv_filter_default_perms, .bdrv_create =3D &raw_create, .bdrv_co_preadv =3D &raw_co_preadv, .bdrv_co_pwritev =3D &raw_co_pwritev, diff --git a/block/replication.c b/block/replication.c index eff85c7..91465cb 100644 --- a/block/replication.c +++ b/block/replication.c @@ -660,6 +660,7 @@ BlockDriver bdrv_replication =3D { =20 .bdrv_open =3D replication_open, .bdrv_close =3D replication_close, + .bdrv_child_perm =3D bdrv_filter_default_perms, =20 .bdrv_getlength =3D replication_getlength, .bdrv_co_readv =3D replication_co_readv, --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487009045571116.33914488973323; Mon, 13 Feb 2017 10:04:05 -0800 (PST) Received: from localhost ([::1]:58589 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKyp-0007aj-2p for importer@patchew.org; Mon, 13 Feb 2017 13:04:03 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59092) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKLh-0002ux-4j for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:38 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKLf-0005u1-Pr for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:37 -0500 Received: from mx1.redhat.com ([209.132.183.28]:40144) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKLc-0005qv-MW; Mon, 13 Feb 2017 12:23:32 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D4F7AC056800; Mon, 13 Feb 2017 17:23:32 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3P031842; Mon, 13 Feb 2017 12:23:31 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:31 +0100 Message-Id: <1487006583-24350-10-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Mon, 13 Feb 2017 17:23:32 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 09/41] block: Default .bdrv_child_perm() for format drivers X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Almost all format drivers have the same characteristics as far as permissions are concerned: They have one or more children for storing their own data and, more importantly, metadata (can be written to and grow even without external write requests, must be protected against other writers and present consistent data) and optionally a backing file (this is just data, so like for a filter, it only depends on what the parent nodes need). This provides a default implementation that can be shared by most of our format drivers. Signed-off-by: Kevin Wolf --- block.c | 37 +++++++++++++++++++++++++++++++++++++ include/block/block_int.h | 8 ++++++++ 2 files changed, 45 insertions(+) diff --git a/block.c b/block.c index 290768d..8e99bb5 100644 --- a/block.c +++ b/block.c @@ -1459,6 +1459,43 @@ void bdrv_filter_default_perms(BlockDriverState *bs,= BdrvChild *c, (c->shared_perm & DEFAULT_PERM_UNCHANGED); } =20 +void bdrv_format_default_perms(BlockDriverState *bs, BdrvChild *c, + const BdrvChildRole *role, + uint64_t perm, uint64_t shared, + uint64_t *nperm, uint64_t *nshared) +{ + bool backing =3D (role =3D=3D &child_backing); + assert(role =3D=3D &child_backing || role =3D=3D &child_file); + + if (!backing) { + /* Apart from the modifications below, the same permissions are + * forwarded and left alone as for filters */ + bdrv_filter_default_perms(bs, c, role, perm, shared, &perm, &share= d); + + /* Format drivers may touch metadata even if the guest doesn't wri= te */ + if (!bdrv_is_read_only(bs)) { + perm |=3D BLK_PERM_WRITE | BLK_PERM_RESIZE; + } + + /* bs->file always needs to be consistent because of the metadata.= We + * can never allow other users to resize or write to it. */ + perm |=3D BLK_PERM_CONSISTENT_READ; + shared &=3D ~(BLK_PERM_WRITE | BLK_PERM_RESIZE); + } else { + /* We want consistent read from backing files if the parent needs = it. + * No other operations are performed on backing files. */ + perm &=3D BLK_PERM_CONSISTENT_READ; + + /* If the parent can deal with changing data, we're okay with a + * writable backing file. */ + shared &=3D BLK_PERM_WRITE; + shared |=3D BLK_PERM_CONSISTENT_READ | BLK_PERM_GRAPH_MOD | + BLK_PERM_WRITE_UNCHANGED; + } + + *nperm =3D perm; + *nshared =3D shared; +} =20 static void bdrv_replace_child(BdrvChild *child, BlockDriverState *new_bs) { diff --git a/include/block/block_int.h b/include/block/block_int.h index 2d74f92..46f51a6 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -885,6 +885,14 @@ void bdrv_filter_default_perms(BlockDriverState *bs, B= drvChild *c, uint64_t perm, uint64_t shared, uint64_t *nperm, uint64_t *nshared); =20 +/* Default implementation for BlockDriver.bdrv_child_perm() that can be us= ed by + * (non-raw) image formats: Like above for bs->backing, but for bs->file it + * requires WRITE | RESIZE for read-write images, always requires + * CONSISTENT_READ and doesn't share WRITE. */ +void bdrv_format_default_perms(BlockDriverState *bs, BdrvChild *c, + const BdrvChildRole *role, + uint64_t perm, uint64_t shared, + uint64_t *nperm, uint64_t *nshared); =20 const char *bdrv_get_parent_name(const BlockDriverState *bs); void blk_dev_change_media_cb(BlockBackend *blk, bool load); --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487007260160749.8235320342308; Mon, 13 Feb 2017 09:34:20 -0800 (PST) Received: from localhost ([::1]:58407 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKW2-0004bN-LN for importer@patchew.org; Mon, 13 Feb 2017 12:34:18 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59135) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKLj-0002xZ-GY for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:41 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKLh-0005v2-Vq for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:39 -0500 Received: from mx1.redhat.com ([209.132.183.28]:48114) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKLe-0005rr-G6; Mon, 13 Feb 2017 12:23:34 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A89F73A7683; Mon, 13 Feb 2017 17:23:34 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3Q031842; Mon, 13 Feb 2017 12:23:33 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:32 +0100 Message-Id: <1487006583-24350-11-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Mon, 13 Feb 2017 17:23:34 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 10/41] block: Request child permissions in format drivers X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This makes use of the .bdrv_child_perm() implementation for formats that we just added. All format drivers expose the permissions they actually need nows, so that they can be set accordingly and updated when parents are attached or detached. The only format not included here is raw, which was already converted with the other filter drivers. Signed-off-by: Kevin Wolf --- block/bochs.c | 1 + block/cloop.c | 1 + block/crypto.c | 1 + block/dmg.c | 1 + block/parallels.c | 1 + block/qcow.c | 1 + block/qcow2.c | 1 + block/qed.c | 1 + block/vdi.c | 1 + block/vhdx.c | 1 + block/vmdk.c | 1 + block/vpc.c | 1 + 12 files changed, 12 insertions(+) diff --git a/block/bochs.c b/block/bochs.c index 7dd2ac4..516da56 100644 --- a/block/bochs.c +++ b/block/bochs.c @@ -293,6 +293,7 @@ static BlockDriver bdrv_bochs =3D { .instance_size =3D sizeof(BDRVBochsState), .bdrv_probe =3D bochs_probe, .bdrv_open =3D bochs_open, + .bdrv_child_perm =3D bdrv_format_default_perms, .bdrv_refresh_limits =3D bochs_refresh_limits, .bdrv_co_preadv =3D bochs_co_preadv, .bdrv_close =3D bochs_close, diff --git a/block/cloop.c b/block/cloop.c index 877c9b0..a6c7b9d 100644 --- a/block/cloop.c +++ b/block/cloop.c @@ -290,6 +290,7 @@ static BlockDriver bdrv_cloop =3D { .instance_size =3D sizeof(BDRVCloopState), .bdrv_probe =3D cloop_probe, .bdrv_open =3D cloop_open, + .bdrv_child_perm =3D bdrv_format_default_perms, .bdrv_refresh_limits =3D cloop_refresh_limits, .bdrv_co_preadv =3D cloop_co_preadv, .bdrv_close =3D cloop_close, diff --git a/block/crypto.c b/block/crypto.c index 200fd0b..ca46883 100644 --- a/block/crypto.c +++ b/block/crypto.c @@ -628,6 +628,7 @@ BlockDriver bdrv_crypto_luks =3D { .bdrv_probe =3D block_crypto_probe_luks, .bdrv_open =3D block_crypto_open_luks, .bdrv_close =3D block_crypto_close, + .bdrv_child_perm =3D bdrv_format_default_perms, .bdrv_create =3D block_crypto_create_luks, .bdrv_truncate =3D block_crypto_truncate, .create_opts =3D &block_crypto_create_opts_luks, diff --git a/block/dmg.c b/block/dmg.c index 8e387cd..a7d25fc 100644 --- a/block/dmg.c +++ b/block/dmg.c @@ -697,6 +697,7 @@ static BlockDriver bdrv_dmg =3D { .bdrv_probe =3D dmg_probe, .bdrv_open =3D dmg_open, .bdrv_refresh_limits =3D dmg_refresh_limits, + .bdrv_child_perm =3D bdrv_format_default_perms, .bdrv_co_preadv =3D dmg_co_preadv, .bdrv_close =3D dmg_close, }; diff --git a/block/parallels.c b/block/parallels.c index d3970e1..b79e7df 100644 --- a/block/parallels.c +++ b/block/parallels.c @@ -762,6 +762,7 @@ static BlockDriver bdrv_parallels =3D { .bdrv_probe =3D parallels_probe, .bdrv_open =3D parallels_open, .bdrv_close =3D parallels_close, + .bdrv_child_perm =3D bdrv_format_default_perms, .bdrv_co_get_block_status =3D parallels_co_get_block_status, .bdrv_has_zero_init =3D bdrv_has_zero_init_1, .bdrv_co_flush_to_os =3D parallels_co_flush_to_os, diff --git a/block/qcow.c b/block/qcow.c index a6dfe1a..3a95d4f 100644 --- a/block/qcow.c +++ b/block/qcow.c @@ -1052,6 +1052,7 @@ static BlockDriver bdrv_qcow =3D { .bdrv_probe =3D qcow_probe, .bdrv_open =3D qcow_open, .bdrv_close =3D qcow_close, + .bdrv_child_perm =3D bdrv_format_default_perms, .bdrv_reopen_prepare =3D qcow_reopen_prepare, .bdrv_create =3D qcow_create, .bdrv_has_zero_init =3D bdrv_has_zero_init_1, diff --git a/block/qcow2.c b/block/qcow2.c index 4684554..dac3fb8 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -3399,6 +3399,7 @@ BlockDriver bdrv_qcow2 =3D { .bdrv_reopen_commit =3D qcow2_reopen_commit, .bdrv_reopen_abort =3D qcow2_reopen_abort, .bdrv_join_options =3D qcow2_join_options, + .bdrv_child_perm =3D bdrv_format_default_perms, .bdrv_create =3D qcow2_create, .bdrv_has_zero_init =3D bdrv_has_zero_init_1, .bdrv_co_get_block_status =3D qcow2_co_get_block_status, diff --git a/block/qed.c b/block/qed.c index 1ea5114..eda9402 100644 --- a/block/qed.c +++ b/block/qed.c @@ -1678,6 +1678,7 @@ static BlockDriver bdrv_qed =3D { .bdrv_open =3D bdrv_qed_open, .bdrv_close =3D bdrv_qed_close, .bdrv_reopen_prepare =3D bdrv_qed_reopen_prepare, + .bdrv_child_perm =3D bdrv_format_default_perms, .bdrv_create =3D bdrv_qed_create, .bdrv_has_zero_init =3D bdrv_has_zero_init_1, .bdrv_co_get_block_status =3D bdrv_qed_co_get_block_status, diff --git a/block/vdi.c b/block/vdi.c index 18b4773..fd6e26d 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -891,6 +891,7 @@ static BlockDriver bdrv_vdi =3D { .bdrv_open =3D vdi_open, .bdrv_close =3D vdi_close, .bdrv_reopen_prepare =3D vdi_reopen_prepare, + .bdrv_child_perm =3D bdrv_format_default_perms, .bdrv_create =3D vdi_create, .bdrv_has_zero_init =3D bdrv_has_zero_init_1, .bdrv_co_get_block_status =3D vdi_co_get_block_status, diff --git a/block/vhdx.c b/block/vhdx.c index 4dc2743..8c5ade2 100644 --- a/block/vhdx.c +++ b/block/vhdx.c @@ -1983,6 +1983,7 @@ static BlockDriver bdrv_vhdx =3D { .bdrv_open =3D vhdx_open, .bdrv_close =3D vhdx_close, .bdrv_reopen_prepare =3D vhdx_reopen_prepare, + .bdrv_child_perm =3D bdrv_format_default_perms, .bdrv_co_readv =3D vhdx_co_readv, .bdrv_co_writev =3D vhdx_co_writev, .bdrv_create =3D vhdx_create, diff --git a/block/vmdk.c b/block/vmdk.c index 9d68ec5..f5e2fb5 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -2359,6 +2359,7 @@ static BlockDriver bdrv_vmdk =3D { .bdrv_open =3D vmdk_open, .bdrv_check =3D vmdk_check, .bdrv_reopen_prepare =3D vmdk_reopen_prepare, + .bdrv_child_perm =3D bdrv_format_default_perms, .bdrv_co_preadv =3D vmdk_co_preadv, .bdrv_co_pwritev =3D vmdk_co_pwritev, .bdrv_co_pwritev_compressed =3D vmdk_co_pwritev_compressed, diff --git a/block/vpc.c b/block/vpc.c index d0df2a1..b9c9832 100644 --- a/block/vpc.c +++ b/block/vpc.c @@ -1067,6 +1067,7 @@ static BlockDriver bdrv_vpc =3D { .bdrv_open =3D vpc_open, .bdrv_close =3D vpc_close, .bdrv_reopen_prepare =3D vpc_reopen_prepare, + .bdrv_child_perm =3D bdrv_format_default_perms, .bdrv_create =3D vpc_create, =20 .bdrv_co_preadv =3D vpc_co_preadv, --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487007724938392.30408830918213; Mon, 13 Feb 2017 09:42:04 -0800 (PST) Received: from localhost ([::1]:58457 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKdX-0002wi-JT for importer@patchew.org; Mon, 13 Feb 2017 12:42:03 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59141) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKLj-0002y3-Tk for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:43 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKLi-0005va-TG for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:39 -0500 Received: from mx1.redhat.com ([209.132.183.28]:35212) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKLg-0005ty-8r; Mon, 13 Feb 2017 12:23:36 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 78AB780471; Mon, 13 Feb 2017 17:23:36 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3R031842; Mon, 13 Feb 2017 12:23:34 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:33 +0100 Message-Id: <1487006583-24350-12-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Mon, 13 Feb 2017 17:23:36 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 11/41] vvfat: Implement .bdrv_child_perm() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" vvfat is the last remaining driver that can have children, but doesn't implement .bdrv_child_perm() yet. The default handlers aren't suitable here, so let's implement a very simple driver-specific one that protects the internal child from being used by other users as good as our permissions permit. Signed-off-by: Kevin Wolf --- block/vvfat.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/block/vvfat.c b/block/vvfat.c index c6bf67e..7246432 100644 --- a/block/vvfat.c +++ b/block/vvfat.c @@ -3052,6 +3052,18 @@ err: return ret; } =20 +static void vvfat_child_perm(BlockDriverState *bs, BdrvChild *c, + const BdrvChildRole *role, + uint64_t perm, uint64_t shared, + uint64_t *nperm, uint64_t *nshared) +{ + assert(role =3D=3D &child_vvfat_qcow); + + /* This is a private node, nobody should try to attach to it */ + *nperm =3D BLK_PERM_WRITE; + *nshared =3D 0; +} + static void vvfat_close(BlockDriverState *bs) { BDRVVVFATState *s =3D bs->opaque; @@ -3077,6 +3089,7 @@ static BlockDriver bdrv_vvfat =3D { .bdrv_file_open =3D vvfat_open, .bdrv_refresh_limits =3D vvfat_refresh_limits, .bdrv_close =3D vvfat_close, + .bdrv_child_perm =3D vvfat_child_perm, =20 .bdrv_co_preadv =3D vvfat_co_preadv, .bdrv_co_pwritev =3D vvfat_co_pwritev, --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487007979831387.9674368479806; Mon, 13 Feb 2017 09:46:19 -0800 (PST) Received: from localhost ([::1]:58484 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKhe-0007ET-Ew for importer@patchew.org; Mon, 13 Feb 2017 12:46:18 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59181) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKLn-00031O-3g for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:44 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKLl-0005x1-5r for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:43 -0500 Received: from mx1.redhat.com ([209.132.183.28]:35226) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKLi-0005us-91; Mon, 13 Feb 2017 12:23:38 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 489E180472; Mon, 13 Feb 2017 17:23:38 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3S031842; Mon, 13 Feb 2017 12:23:36 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:34 +0100 Message-Id: <1487006583-24350-13-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Mon, 13 Feb 2017 17:23:38 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 12/41] block: Require .bdrv_child_perm() with child nodes X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" All block drivers that can have child nodes implement .bdrv_child_perm() now. Make this officially a requirement by asserting that only drivers without children can omit .bdrv_child_perm(). Signed-off-by: Kevin Wolf --- block.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/block.c b/block.c index 8e99bb5..682548a 100644 --- a/block.c +++ b/block.c @@ -1307,8 +1307,9 @@ static int bdrv_check_perm(BlockDriverState *bs, uint= 64_t cumulative_perms, cumulative_shared_perms, errp); } =20 - /* Drivers may not have .bdrv_child_perm() */ + /* Drivers that never have children can omit .bdrv_child_perm() */ if (!drv->bdrv_child_perm) { + assert(QLIST_EMPTY(&bs->children)); return 0; } =20 @@ -1342,8 +1343,9 @@ static void bdrv_set_perm(BlockDriverState *bs, uint6= 4_t cumulative_perms, drv->bdrv_set_perm(bs, cumulative_perms, cumulative_shared_perms); } =20 - /* Drivers may not have .bdrv_child_perm() */ + /* Drivers that never have children can omit .bdrv_child_perm() */ if (!drv->bdrv_child_perm) { + assert(QLIST_EMPTY(&bs->children)); return; } =20 --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487008806973863.2898312269016; Mon, 13 Feb 2017 10:00:06 -0800 (PST) Received: from localhost ([::1]:58561 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKuy-0003m4-MX for importer@patchew.org; Mon, 13 Feb 2017 13:00:04 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59228) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKLp-00034V-PI for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:47 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKLo-00060X-MZ for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:45 -0500 Received: from mx1.redhat.com ([209.132.183.28]:57470) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKLj-0005vm-UQ; Mon, 13 Feb 2017 12:23:40 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 24D6580F8F; Mon, 13 Feb 2017 17:23:40 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3T031842; Mon, 13 Feb 2017 12:23:38 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:35 +0100 Message-Id: <1487006583-24350-14-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Mon, 13 Feb 2017 17:23:40 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 13/41] block: Request real permissions in bdrv_attach_child() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Now that all block drivers with children tell us what permissions they need from each of their children, bdrv_attach_child() can use this information and make the right requirements while trying to attach new children. Signed-off-by: Kevin Wolf --- block.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/block.c b/block.c index 682548a..fd06549 100644 --- a/block.c +++ b/block.c @@ -1558,10 +1558,21 @@ BdrvChild *bdrv_attach_child(BlockDriverState *pare= nt_bs, Error **errp) { BdrvChild *child; + uint64_t perm, shared_perm; + + /* XXX This check is a workaround for bdrv_open_inherit(), which attac= hes + * bs->file before bs is opened for format probing. The 'else' branch + * really shouldn't exist. */ + if (parent_bs->drv) { + parent_bs->drv->bdrv_child_perm(parent_bs, NULL, child_role, + 0, BLK_PERM_ALL, &perm, &shared_pe= rm); + } else { + perm =3D 0; + shared_perm =3D BLK_PERM_ALL; + } =20 - /* FIXME Use real permissions */ child =3D bdrv_root_attach_child(child_bs, child_name, child_role, - 0, BLK_PERM_ALL, parent_bs, errp); + perm, shared_perm, parent_bs, errp); if (child =3D=3D NULL) { return NULL; } @@ -2041,6 +2052,8 @@ static BlockDriverState *bdrv_open_inherit(const char= *filename, * probing, the block drivers will do their own bdrv_open_child() for = the * same BDS, which is why we put the node name back into options. */ if ((flags & BDRV_O_PROTOCOL) =3D=3D 0) { + /* FIXME Really shouldn't try to open a child for a still closed b= s, + * see bdrv_attach_child() */ file =3D bdrv_open_child(filename, options, "file", bs, &child_file, true, &local_err); if (local_err) { --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487009318662611.7487058484126; Mon, 13 Feb 2017 10:08:38 -0800 (PST) Received: from localhost ([::1]:58614 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdL3D-0003N9-P0 for importer@patchew.org; Mon, 13 Feb 2017 13:08:35 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59227) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKLp-00034U-Os for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKLo-00060Q-JI for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:45 -0500 Received: from mx1.redhat.com ([209.132.183.28]:50158) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKLl-0005wu-Nc; Mon, 13 Feb 2017 12:23:41 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E4F5B3B703; Mon, 13 Feb 2017 17:23:41 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3U031842; Mon, 13 Feb 2017 12:23:40 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:36 +0100 Message-Id: <1487006583-24350-15-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Mon, 13 Feb 2017 17:23:41 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 14/41] block: Add permissions to BlockBackend X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The BlockBackend can now store the permissions that its user requires. This is necessary because nodes can be ejected from or inserted into a BlockBackend and all of these operations must make sure that the user still gets what it requested initially. Signed-off-by: Kevin Wolf --- block/block-backend.c | 27 +++++++++++++++++++++++++++ include/sysemu/block-backend.h | 2 ++ 2 files changed, 29 insertions(+) diff --git a/block/block-backend.c b/block/block-backend.c index d080f01..8f0348d 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -59,6 +59,9 @@ struct BlockBackend { bool iostatus_enabled; BlockDeviceIoStatus iostatus; =20 + uint64_t perm; + uint64_t shared_perm; + bool allow_write_beyond_eof; =20 NotifierList remove_bs_notifiers, insert_bs_notifiers; @@ -126,6 +129,8 @@ BlockBackend *blk_new(void) =20 blk =3D g_new0(BlockBackend, 1); blk->refcnt =3D 1; + blk->perm =3D 0; + blk->shared_perm =3D BLK_PERM_ALL; blk_set_enable_write_cache(blk, true); =20 qemu_co_queue_init(&blk->public.throttled_reqs[0]); @@ -511,6 +516,27 @@ void blk_insert_bs(BlockBackend *blk, BlockDriverState= *bs) } } =20 +/* + * Sets the permission bitmasks that the user of the BlockBackend needs. + */ +int blk_set_perm(BlockBackend *blk, uint64_t perm, uint64_t shared_perm, + Error **errp) +{ + int ret; + + if (blk->root) { + ret =3D bdrv_child_try_set_perm(blk->root, perm, shared_perm, errp= ); + if (ret < 0) { + return ret; + } + } + + blk->perm =3D perm; + blk->shared_perm =3D shared_perm; + + return 0; +} + static int blk_do_attach_dev(BlockBackend *blk, void *dev) { if (blk->dev) { @@ -557,6 +583,7 @@ void blk_detach_dev(BlockBackend *blk, void *dev) blk->dev_ops =3D NULL; blk->dev_opaque =3D NULL; blk->guest_block_size =3D 512; + blk_set_perm(blk, 0, BLK_PERM_ALL, &error_abort); blk_unref(blk); } =20 diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h index 6444e41..4a5783a 100644 --- a/include/sysemu/block-backend.h +++ b/include/sysemu/block-backend.h @@ -99,6 +99,8 @@ void blk_remove_bs(BlockBackend *blk); void blk_insert_bs(BlockBackend *blk, BlockDriverState *bs); bool bdrv_has_blk(BlockDriverState *bs); bool bdrv_is_root_node(BlockDriverState *bs); +int blk_set_perm(BlockBackend *blk, uint64_t perm, uint64_t shared_perm, + Error **errp); =20 void blk_set_allow_write_beyond_eof(BlockBackend *blk, bool allow); void blk_iostatus_enable(BlockBackend *blk); --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487009088289259.39817798168644; Mon, 13 Feb 2017 10:04:48 -0800 (PST) Received: from localhost ([::1]:58590 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKzU-00087F-Lj for importer@patchew.org; Mon, 13 Feb 2017 13:04:44 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59300) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKLt-0003AD-UC for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:52 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKLs-00065O-1L for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:49 -0500 Received: from mx1.redhat.com ([209.132.183.28]:50168) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKLn-0005y3-Ga; Mon, 13 Feb 2017 12:23:43 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B6E6D3B713; Mon, 13 Feb 2017 17:23:43 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3V031842; Mon, 13 Feb 2017 12:23:42 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:37 +0100 Message-Id: <1487006583-24350-16-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Mon, 13 Feb 2017 17:23:43 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 15/41] block: Add permissions to blk_new() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" We want every user to be specific about the permissions it needs, so we'll pass the initial permissions as parameters to blk_new(). A user only needs to call blk_set_perm() if it wants to change the permissions after the fact. The permissions are stored in the BlockBackend and applied whenever a BlockDriverState should be attached in blk_insert_bs(). This does not include actually choosing the right set of permissions yet. Instead, the usual FIXME comment is added to each place and will be addressed in individual patches. Signed-off-by: Kevin Wolf --- block/backup.c | 3 ++- block/block-backend.c | 12 ++++++------ block/commit.c | 12 ++++++++---- block/mirror.c | 3 ++- blockdev.c | 2 +- blockjob.c | 3 ++- hmp.c | 3 ++- hw/block/fdc.c | 3 ++- hw/core/qdev-properties-system.c | 3 ++- hw/ide/qdev.c | 3 ++- hw/scsi/scsi-disk.c | 3 ++- include/sysemu/block-backend.h | 2 +- migration/block.c | 3 ++- nbd/server.c | 3 ++- tests/test-blockjob.c | 3 ++- tests/test-throttle.c | 7 ++++--- 16 files changed, 42 insertions(+), 26 deletions(-) diff --git a/block/backup.c b/block/backup.c index ea38733..bb76c69 100644 --- a/block/backup.c +++ b/block/backup.c @@ -624,7 +624,8 @@ BlockJob *backup_job_create(const char *job_id, BlockDr= iverState *bs, goto error; } =20 - job->target =3D blk_new(); + /* FIXME Use real permissions */ + job->target =3D blk_new(0, BLK_PERM_ALL); blk_insert_bs(job->target, target); =20 job->on_source_error =3D on_source_error; diff --git a/block/block-backend.c b/block/block-backend.c index 8f0348d..a219f0b 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -123,14 +123,14 @@ static const BdrvChildRole child_root =3D { * Store an error through @errp on failure, unless it's null. * Return the new BlockBackend on success, null on failure. */ -BlockBackend *blk_new(void) +BlockBackend *blk_new(uint64_t perm, uint64_t shared_perm) { BlockBackend *blk; =20 blk =3D g_new0(BlockBackend, 1); blk->refcnt =3D 1; - blk->perm =3D 0; - blk->shared_perm =3D BLK_PERM_ALL; + blk->perm =3D perm; + blk->shared_perm =3D shared_perm; blk_set_enable_write_cache(blk, true); =20 qemu_co_queue_init(&blk->public.throttled_reqs[0]); @@ -161,7 +161,7 @@ BlockBackend *blk_new_open(const char *filename, const = char *reference, BlockBackend *blk; BlockDriverState *bs; =20 - blk =3D blk_new(); + blk =3D blk_new(0, BLK_PERM_ALL); bs =3D bdrv_open(filename, reference, options, flags, errp); if (!bs) { blk_unref(blk); @@ -505,9 +505,9 @@ void blk_remove_bs(BlockBackend *blk) void blk_insert_bs(BlockBackend *blk, BlockDriverState *bs) { bdrv_ref(bs); - /* FIXME Use real permissions */ blk->root =3D bdrv_root_attach_child(bs, "root", &child_root, - 0, BLK_PERM_ALL, blk, &error_abort); + blk->perm, blk->shared_perm, blk, + &error_abort); =20 notifier_list_notify(&blk->insert_bs_notifiers, blk); if (blk->public.throttle_state) { diff --git a/block/commit.c b/block/commit.c index c284e85..1897e98 100644 --- a/block/commit.c +++ b/block/commit.c @@ -275,10 +275,12 @@ void commit_start(const char *job_id, BlockDriverStat= e *bs, block_job_add_bdrv(&s->common, overlay_bs); } =20 - s->base =3D blk_new(); + /* FIXME Use real permissions */ + s->base =3D blk_new(0, BLK_PERM_ALL); blk_insert_bs(s->base, base); =20 - s->top =3D blk_new(); + /* FIXME Use real permissions */ + s->top =3D blk_new(0, BLK_PERM_ALL); blk_insert_bs(s->top, top); =20 s->active =3D bs; @@ -328,10 +330,12 @@ int bdrv_commit(BlockDriverState *bs) } } =20 - src =3D blk_new(); + /* FIXME Use real permissions */ + src =3D blk_new(0, BLK_PERM_ALL); blk_insert_bs(src, bs); =20 - backing =3D blk_new(); + /* FIXME Use real permissions */ + backing =3D blk_new(0, BLK_PERM_ALL); blk_insert_bs(backing, bs->backing->bs); =20 length =3D blk_getlength(src); diff --git a/block/mirror.c b/block/mirror.c index 301ba92..810933e 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -985,7 +985,8 @@ static void mirror_start_job(const char *job_id, BlockD= riverState *bs, return; } =20 - s->target =3D blk_new(); + /* FIXME Use real permissions */ + s->target =3D blk_new(0, BLK_PERM_ALL); blk_insert_bs(s->target, target); =20 s->replaces =3D g_strdup(replaces); diff --git a/blockdev.c b/blockdev.c index db82ac9..2e195f1 100644 --- a/blockdev.c +++ b/blockdev.c @@ -554,7 +554,7 @@ static BlockBackend *blockdev_init(const char *file, QD= ict *bs_opts, if ((!file || !*file) && !qdict_size(bs_opts)) { BlockBackendRootState *blk_rs; =20 - blk =3D blk_new(); + blk =3D blk_new(0, BLK_PERM_ALL); blk_rs =3D blk_get_root_state(blk); blk_rs->open_flags =3D bdrv_flags; blk_rs->read_only =3D read_only; diff --git a/blockjob.c b/blockjob.c index abee11b..508e0e5 100644 --- a/blockjob.c +++ b/blockjob.c @@ -159,7 +159,8 @@ void *block_job_create(const char *job_id, const BlockJ= obDriver *driver, } } =20 - blk =3D blk_new(); + /* FIXME Use real permissions */ + blk =3D blk_new(0, BLK_PERM_ALL); blk_insert_bs(blk, bs); =20 job =3D g_malloc0(driver->instance_size); diff --git a/hmp.c b/hmp.c index 2bc4f06..15fd3f7 100644 --- a/hmp.c +++ b/hmp.c @@ -2044,7 +2044,8 @@ void hmp_qemu_io(Monitor *mon, const QDict *qdict) if (!blk) { BlockDriverState *bs =3D bdrv_lookup_bs(NULL, device, &err); if (bs) { - blk =3D local_blk =3D blk_new(); + /* FIXME Use real permissions */ + blk =3D local_blk =3D blk_new(0, BLK_PERM_ALL); blk_insert_bs(blk, bs); } else { goto fail; diff --git a/hw/block/fdc.c b/hw/block/fdc.c index 17d29e7..74f3634 100644 --- a/hw/block/fdc.c +++ b/hw/block/fdc.c @@ -533,7 +533,8 @@ static int floppy_drive_init(DeviceState *qdev) =20 if (!dev->conf.blk) { /* Anonymous BlockBackend for an empty drive */ - dev->conf.blk =3D blk_new(); + /* FIXME Use real permissions */ + dev->conf.blk =3D blk_new(0, BLK_PERM_ALL); ret =3D blk_attach_dev(dev->conf.blk, qdev); assert(ret =3D=3D 0); } diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-sys= tem.c index 94f4d8b..cca4775 100644 --- a/hw/core/qdev-properties-system.c +++ b/hw/core/qdev-properties-system.c @@ -78,7 +78,8 @@ static void parse_drive(DeviceState *dev, const char *str= , void **ptr, if (!blk) { BlockDriverState *bs =3D bdrv_lookup_bs(NULL, str, NULL); if (bs) { - blk =3D blk_new(); + /* FIXME Use real permissions */ + blk =3D blk_new(0, BLK_PERM_ALL); blk_insert_bs(blk, bs); blk_created =3D true; } diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c index dbaa75c..bb3c377 100644 --- a/hw/ide/qdev.c +++ b/hw/ide/qdev.c @@ -170,7 +170,8 @@ static int ide_dev_initfn(IDEDevice *dev, IDEDriveKind = kind) return -1; } else { /* Anonymous BlockBackend for an empty drive */ - dev->conf.blk =3D blk_new(); + /* FIXME Use real permissions */ + dev->conf.blk =3D blk_new(0, BLK_PERM_ALL); } } =20 diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c index cc06fe5..61c44a9 100644 --- a/hw/scsi/scsi-disk.c +++ b/hw/scsi/scsi-disk.c @@ -2365,7 +2365,8 @@ static void scsi_cd_realize(SCSIDevice *dev, Error **= errp) SCSIDiskState *s =3D DO_UPCAST(SCSIDiskState, qdev, dev); =20 if (!dev->conf.blk) { - dev->conf.blk =3D blk_new(); + /* FIXME Use real permissions */ + dev->conf.blk =3D blk_new(0, BLK_PERM_ALL); } =20 s->qdev.blocksize =3D 2048; diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h index 4a5783a..1bda6d7 100644 --- a/include/sysemu/block-backend.h +++ b/include/sysemu/block-backend.h @@ -78,7 +78,7 @@ typedef struct BlockBackendPublic { QLIST_ENTRY(BlockBackendPublic) round_robin; } BlockBackendPublic; =20 -BlockBackend *blk_new(void); +BlockBackend *blk_new(uint64_t perm, uint64_t shared_perm); BlockBackend *blk_new_open(const char *filename, const char *reference, QDict *options, int flags, Error **errp); int blk_get_refcnt(BlockBackend *blk); diff --git a/migration/block.c b/migration/block.c index ebc10e6..6b7ffd4 100644 --- a/migration/block.c +++ b/migration/block.c @@ -415,7 +415,8 @@ static void init_blk_migration(QEMUFile *f) } =20 bmds =3D g_new0(BlkMigDevState, 1); - bmds->blk =3D blk_new(); + /* FIXME Use real permissions */ + bmds->blk =3D blk_new(0, BLK_PERM_ALL); bmds->blk_name =3D g_strdup(bdrv_get_device_name(bs)); bmds->bulk_completed =3D 0; bmds->total_sectors =3D sectors; diff --git a/nbd/server.c b/nbd/server.c index efe5cb8..871111c 100644 --- a/nbd/server.c +++ b/nbd/server.c @@ -890,7 +890,8 @@ NBDExport *nbd_export_new(BlockDriverState *bs, off_t d= ev_offset, off_t size, BlockBackend *blk; NBDExport *exp =3D g_malloc0(sizeof(NBDExport)); =20 - blk =3D blk_new(); + /* FIXME Use real permissions */ + blk =3D blk_new(0, BLK_PERM_ALL); blk_insert_bs(blk, bs); blk_set_enable_write_cache(blk, !writethrough); =20 diff --git a/tests/test-blockjob.c b/tests/test-blockjob.c index 068c9e4..1dd1cfa 100644 --- a/tests/test-blockjob.c +++ b/tests/test-blockjob.c @@ -53,7 +53,8 @@ static BlockJob *do_test_id(BlockBackend *blk, const char= *id, * BlockDriverState inserted. */ static BlockBackend *create_blk(const char *name) { - BlockBackend *blk =3D blk_new(); + /* FIXME Use real permissions */ + BlockBackend *blk =3D blk_new(0, BLK_PERM_ALL); BlockDriverState *bs; =20 bs =3D bdrv_open("null-co://", NULL, NULL, 0, &error_abort); diff --git a/tests/test-throttle.c b/tests/test-throttle.c index 363b59a..5846433 100644 --- a/tests/test-throttle.c +++ b/tests/test-throttle.c @@ -593,9 +593,10 @@ static void test_groups(void) BlockBackend *blk1, *blk2, *blk3; BlockBackendPublic *blkp1, *blkp2, *blkp3; =20 - blk1 =3D blk_new(); - blk2 =3D blk_new(); - blk3 =3D blk_new(); + /* FIXME Use real permissions */ + blk1 =3D blk_new(0, BLK_PERM_ALL); + blk2 =3D blk_new(0, BLK_PERM_ALL); + blk3 =3D blk_new(0, BLK_PERM_ALL); =20 blkp1 =3D blk_get_public(blk1); blkp2 =3D blk_get_public(blk2); --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487007557021101.41865349412558; Mon, 13 Feb 2017 09:39:17 -0800 (PST) Received: from localhost ([::1]:58433 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKap-0000gC-HE for importer@patchew.org; Mon, 13 Feb 2017 12:39:15 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59333) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKLw-0003E7-Kw for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:54 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKLu-00068D-5i for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:52 -0500 Received: from mx1.redhat.com ([209.132.183.28]:52942) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKLp-00060m-DB; Mon, 13 Feb 2017 12:23:45 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8E1E1C04B332; Mon, 13 Feb 2017 17:23:45 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3W031842; Mon, 13 Feb 2017 12:23:44 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:38 +0100 Message-Id: <1487006583-24350-17-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 13 Feb 2017 17:23:45 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 16/41] block: Add error parameter to blk_insert_bs() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Mow that blk_insert_bs() requests the BlockBackend permissions for the node it attaches to, it can fail. Instead of aborting, pass the errors to the callers. Signed-off-by: Kevin Wolf --- block/backup.c | 5 ++++- block/block-backend.c | 12 ++++++++---- block/commit.c | 38 ++++++++++++++++++++++++++++++------= -- block/mirror.c | 15 ++++++++++++--- blockdev.c | 6 +++++- blockjob.c | 7 ++++++- hmp.c | 6 +++++- hw/core/qdev-properties-system.c | 7 ++++++- include/sysemu/block-backend.h | 2 +- migration/block.c | 2 +- nbd/server.c | 6 +++++- tests/test-blockjob.c | 2 +- 12 files changed, 84 insertions(+), 24 deletions(-) diff --git a/block/backup.c b/block/backup.c index bb76c69..42e8e99 100644 --- a/block/backup.c +++ b/block/backup.c @@ -626,7 +626,10 @@ BlockJob *backup_job_create(const char *job_id, BlockD= riverState *bs, =20 /* FIXME Use real permissions */ job->target =3D blk_new(0, BLK_PERM_ALL); - blk_insert_bs(job->target, target); + ret =3D blk_insert_bs(job->target, target, errp); + if (ret < 0) { + goto error; + } =20 job->on_source_error =3D on_source_error; job->on_target_error =3D on_target_error; diff --git a/block/block-backend.c b/block/block-backend.c index a219f0b..1f80854 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -502,18 +502,22 @@ void blk_remove_bs(BlockBackend *blk) /* * Associates a new BlockDriverState with @blk. */ -void blk_insert_bs(BlockBackend *blk, BlockDriverState *bs) +int blk_insert_bs(BlockBackend *blk, BlockDriverState *bs, Error **errp) { - bdrv_ref(bs); blk->root =3D bdrv_root_attach_child(bs, "root", &child_root, - blk->perm, blk->shared_perm, blk, - &error_abort); + blk->perm, blk->shared_perm, blk, e= rrp); + if (blk->root =3D=3D NULL) { + return -EPERM; + } + bdrv_ref(bs); =20 notifier_list_notify(&blk->insert_bs_notifiers, blk); if (blk->public.throttle_state) { throttle_timers_attach_aio_context( &blk->public.throttle_timers, bdrv_get_aio_context(bs)); } + + return 0; } =20 /* diff --git a/block/commit.c b/block/commit.c index 1897e98..2ad8138 100644 --- a/block/commit.c +++ b/block/commit.c @@ -220,6 +220,7 @@ void commit_start(const char *job_id, BlockDriverState = *bs, BlockDriverState *iter; BlockDriverState *overlay_bs; Error *local_err =3D NULL; + int ret; =20 assert(top !=3D bs); if (top =3D=3D base) { @@ -256,8 +257,7 @@ void commit_start(const char *job_id, BlockDriverState = *bs, bdrv_reopen_multiple(bdrv_get_aio_context(bs), reopen_queue, &loca= l_err); if (local_err !=3D NULL) { error_propagate(errp, local_err); - block_job_unref(&s->common); - return; + goto fail; } } =20 @@ -277,11 +277,17 @@ void commit_start(const char *job_id, BlockDriverStat= e *bs, =20 /* FIXME Use real permissions */ s->base =3D blk_new(0, BLK_PERM_ALL); - blk_insert_bs(s->base, base); + ret =3D blk_insert_bs(s->base, base, errp); + if (ret < 0) { + goto fail; + } =20 /* FIXME Use real permissions */ s->top =3D blk_new(0, BLK_PERM_ALL); - blk_insert_bs(s->top, top); + ret =3D blk_insert_bs(s->top, top, errp); + if (ret < 0) { + goto fail; + } =20 s->active =3D bs; =20 @@ -294,6 +300,16 @@ void commit_start(const char *job_id, BlockDriverState= *bs, =20 trace_commit_start(bs, base, top, s); block_job_start(&s->common); + return; + +fail: + if (s->base) { + blk_unref(s->base); + } + if (s->top) { + blk_unref(s->top); + } + block_job_unref(&s->common); } =20 =20 @@ -332,11 +348,17 @@ int bdrv_commit(BlockDriverState *bs) =20 /* FIXME Use real permissions */ src =3D blk_new(0, BLK_PERM_ALL); - blk_insert_bs(src, bs); - - /* FIXME Use real permissions */ backing =3D blk_new(0, BLK_PERM_ALL); - blk_insert_bs(backing, bs->backing->bs); + + ret =3D blk_insert_bs(src, bs, NULL); + if (ret < 0) { + goto ro_cleanup; + } + + ret =3D blk_insert_bs(backing, bs->backing->bs, NULL); + if (ret < 0) { + goto ro_cleanup; + } =20 length =3D blk_getlength(src); if (length < 0) { diff --git a/block/mirror.c b/block/mirror.c index 810933e..630e5ef 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -517,9 +517,12 @@ static void mirror_exit(BlockJob *job, void *opaque) bdrv_replace_in_backing_chain(to_replace, target_bs); bdrv_drained_end(target_bs); =20 - /* We just changed the BDS the job BB refers to */ + /* We just changed the BDS the job BB refers to, so switch the BB = back + * so the cleanup does the right thing. We don't need any permissi= ons + * any more now. */ blk_remove_bs(job->blk); - blk_insert_bs(job->blk, src); + blk_set_perm(job->blk, 0, BLK_PERM_ALL, &error_abort); + blk_insert_bs(job->blk, src, &error_abort); } if (s->to_replace) { bdrv_op_unblock_all(s->to_replace, s->replace_blocker); @@ -963,6 +966,7 @@ static void mirror_start_job(const char *job_id, BlockD= riverState *bs, bool auto_complete) { MirrorBlockJob *s; + int ret; =20 if (granularity =3D=3D 0) { granularity =3D bdrv_get_default_bitmap_granularity(target); @@ -987,7 +991,12 @@ static void mirror_start_job(const char *job_id, Block= DriverState *bs, =20 /* FIXME Use real permissions */ s->target =3D blk_new(0, BLK_PERM_ALL); - blk_insert_bs(s->target, target); + ret =3D blk_insert_bs(s->target, target, errp); + if (ret < 0) { + blk_unref(s->target); + block_job_unref(&s->common); + return; + } =20 s->replaces =3D g_strdup(replaces); s->on_source_error =3D on_source_error; diff --git a/blockdev.c b/blockdev.c index 2e195f1..c590e67 100644 --- a/blockdev.c +++ b/blockdev.c @@ -2432,6 +2432,7 @@ static void qmp_blockdev_insert_anon_medium(BlockBack= end *blk, BlockDriverState *bs, Error **= errp) { bool has_device; + int ret; =20 /* For BBs without a device, we can exchange the BDS tree at will */ has_device =3D blk_get_attached_dev(blk); @@ -2451,7 +2452,10 @@ static void qmp_blockdev_insert_anon_medium(BlockBac= kend *blk, return; } =20 - blk_insert_bs(blk, bs); + ret =3D blk_insert_bs(blk, bs, errp); + if (ret < 0) { + return; + } =20 if (!blk_dev_has_tray(blk)) { /* For tray-less devices, blockdev-close-tray is a no-op (or may n= ot be diff --git a/blockjob.c b/blockjob.c index 508e0e5..72b7d4c 100644 --- a/blockjob.c +++ b/blockjob.c @@ -128,6 +128,7 @@ void *block_job_create(const char *job_id, const BlockJ= obDriver *driver, { BlockBackend *blk; BlockJob *job; + int ret; =20 if (bs->job) { error_setg(errp, QERR_DEVICE_IN_USE, bdrv_get_device_name(bs)); @@ -161,7 +162,11 @@ void *block_job_create(const char *job_id, const Block= JobDriver *driver, =20 /* FIXME Use real permissions */ blk =3D blk_new(0, BLK_PERM_ALL); - blk_insert_bs(blk, bs); + ret =3D blk_insert_bs(blk, bs, errp); + if (ret < 0) { + blk_unref(blk); + return NULL; + } =20 job =3D g_malloc0(driver->instance_size); error_setg(&job->blocker, "block device is in use by block job: %s", diff --git a/hmp.c b/hmp.c index 15fd3f7..801fddb 100644 --- a/hmp.c +++ b/hmp.c @@ -2039,6 +2039,7 @@ void hmp_qemu_io(Monitor *mon, const QDict *qdict) const char* device =3D qdict_get_str(qdict, "device"); const char* command =3D qdict_get_str(qdict, "command"); Error *err =3D NULL; + int ret; =20 blk =3D blk_by_name(device); if (!blk) { @@ -2046,7 +2047,10 @@ void hmp_qemu_io(Monitor *mon, const QDict *qdict) if (bs) { /* FIXME Use real permissions */ blk =3D local_blk =3D blk_new(0, BLK_PERM_ALL); - blk_insert_bs(blk, bs); + ret =3D blk_insert_bs(blk, bs, &err); + if (ret < 0) { + goto fail; + } } else { goto fail; } diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-sys= tem.c index cca4775..66ba367 100644 --- a/hw/core/qdev-properties-system.c +++ b/hw/core/qdev-properties-system.c @@ -73,6 +73,7 @@ static void parse_drive(DeviceState *dev, const char *str= , void **ptr, { BlockBackend *blk; bool blk_created =3D false; + int ret; =20 blk =3D blk_by_name(str); if (!blk) { @@ -80,8 +81,12 @@ static void parse_drive(DeviceState *dev, const char *st= r, void **ptr, if (bs) { /* FIXME Use real permissions */ blk =3D blk_new(0, BLK_PERM_ALL); - blk_insert_bs(blk, bs); blk_created =3D true; + + ret =3D blk_insert_bs(blk, bs, errp); + if (ret < 0) { + goto fail; + } } } if (!blk) { diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h index 1bda6d7..6f21508 100644 --- a/include/sysemu/block-backend.h +++ b/include/sysemu/block-backend.h @@ -96,7 +96,7 @@ BlockBackend *blk_by_public(BlockBackendPublic *public); =20 BlockDriverState *blk_bs(BlockBackend *blk); void blk_remove_bs(BlockBackend *blk); -void blk_insert_bs(BlockBackend *blk, BlockDriverState *bs); +int blk_insert_bs(BlockBackend *blk, BlockDriverState *bs, Error **errp); bool bdrv_has_blk(BlockDriverState *bs); bool bdrv_is_root_node(BlockDriverState *bs); int blk_set_perm(BlockBackend *blk, uint64_t perm, uint64_t shared_perm, diff --git a/migration/block.c b/migration/block.c index 6b7ffd4..d259936 100644 --- a/migration/block.c +++ b/migration/block.c @@ -446,7 +446,7 @@ static void init_blk_migration(QEMUFile *f) BlockDriverState *bs =3D bmds_bs[i].bs; =20 if (bmds) { - blk_insert_bs(bmds->blk, bs); + blk_insert_bs(bmds->blk, bs, &error_abort); =20 alloc_aio_bitmap(bmds); error_setg(&bmds->blocker, "block device is in use by migratio= n"); diff --git a/nbd/server.c b/nbd/server.c index 871111c..deb4358 100644 --- a/nbd/server.c +++ b/nbd/server.c @@ -889,10 +889,14 @@ NBDExport *nbd_export_new(BlockDriverState *bs, off_t= dev_offset, off_t size, { BlockBackend *blk; NBDExport *exp =3D g_malloc0(sizeof(NBDExport)); + int ret; =20 /* FIXME Use real permissions */ blk =3D blk_new(0, BLK_PERM_ALL); - blk_insert_bs(blk, bs); + ret =3D blk_insert_bs(blk, bs, errp); + if (ret < 0) { + goto fail; + } blk_set_enable_write_cache(blk, !writethrough); =20 exp->refcount =3D 1; diff --git a/tests/test-blockjob.c b/tests/test-blockjob.c index 1dd1cfa..143ce96 100644 --- a/tests/test-blockjob.c +++ b/tests/test-blockjob.c @@ -60,7 +60,7 @@ static BlockBackend *create_blk(const char *name) bs =3D bdrv_open("null-co://", NULL, NULL, 0, &error_abort); g_assert_nonnull(bs); =20 - blk_insert_bs(blk, bs); + blk_insert_bs(blk, bs, &error_abort); bdrv_unref(bs); =20 if (name) { --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487009587411750.5987755727027; Mon, 13 Feb 2017 10:13:07 -0800 (PST) Received: from localhost ([::1]:58645 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdL7Z-0007zm-36 for importer@patchew.org; Mon, 13 Feb 2017 13:13:05 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59331) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKLw-0003E6-Kh for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:53 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKLt-000680-Vu for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:52 -0500 Received: from mx1.redhat.com ([209.132.183.28]:54140) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKLr-00062h-AT; Mon, 13 Feb 2017 12:23:47 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7C4B561BAF; Mon, 13 Feb 2017 17:23:47 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3X031842; Mon, 13 Feb 2017 12:23:45 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:39 +0100 Message-Id: <1487006583-24350-18-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 13 Feb 2017 17:23:47 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 17/41] block: Request real permissions in blk_new_open() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" We can figure out the necessary permissions from the flags that the caller passed. Signed-off-by: Kevin Wolf --- block/block-backend.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/block/block-backend.c b/block/block-backend.c index 1f80854..e10a278 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -160,6 +160,7 @@ BlockBackend *blk_new_open(const char *filename, const = char *reference, { BlockBackend *blk; BlockDriverState *bs; + uint64_t perm; =20 blk =3D blk_new(0, BLK_PERM_ALL); bs =3D bdrv_open(filename, reference, options, flags, errp); @@ -168,9 +169,20 @@ BlockBackend *blk_new_open(const char *filename, const= char *reference, return NULL; } =20 - /* FIXME Use real permissions */ + /* blk_new_open() is mainly used in .bdrv_create implementations and t= he + * tools where sharing isn't a concern because the BDS stays private, = so we + * just request permission according to the flags. + * + * The exceptions are xen_disk and blockdev_init(); in these cases, the + * caller of blk_new_open() doesn't make use of the permissions, but t= hey + * shouldn't hurt either. We can still share everything here because t= he + * guest devices will add their own blockers if they can't share. */ + perm =3D BLK_PERM_CONSISTENT_READ; + if (flags & BDRV_O_RDWR) { + perm |=3D BLK_PERM_WRITE; + } blk->root =3D bdrv_root_attach_child(bs, "root", &child_root, - 0, BLK_PERM_ALL, blk, &error_abort); + perm, BLK_PERM_ALL, blk, &error_abo= rt); =20 return blk; } --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487009371204835.9195087023504; Mon, 13 Feb 2017 10:09:31 -0800 (PST) Received: from localhost ([::1]:58618 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdL44-00043u-A6 for importer@patchew.org; Mon, 13 Feb 2017 13:09:28 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59396) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKM0-0003IK-D7 for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:58 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKLy-0006AF-LR for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:56 -0500 Received: from mx1.redhat.com ([209.132.183.28]:51102) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKLt-000663-7f; Mon, 13 Feb 2017 12:23:49 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4AE737E9E3; Mon, 13 Feb 2017 17:23:49 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3Y031842; Mon, 13 Feb 2017 12:23:47 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:40 +0100 Message-Id: <1487006583-24350-19-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Mon, 13 Feb 2017 17:23:49 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 18/41] block: Allow error return in BlockDevOps.change_media_cb() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Some devices allow a media change between read-only and read-write media. They need to adapt the permissions in their .change_media_cb() implementation, which can fail. So add an Error parameter to the function. Signed-off-by: Kevin Wolf --- block/block-backend.c | 12 +++++++++--- blockdev.c | 19 +++++++++++++++---- hw/block/fdc.c | 2 +- hw/ide/core.c | 2 +- hw/scsi/scsi-disk.c | 2 +- hw/sd/sd.c | 2 +- include/block/block_int.h | 2 +- include/sysemu/block-backend.h | 2 +- 8 files changed, 30 insertions(+), 13 deletions(-) diff --git a/block/block-backend.c b/block/block-backend.c index e10a278..0c23add 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -671,15 +671,21 @@ void blk_set_dev_ops(BlockBackend *blk, const BlockDe= vOps *ops, * Else, notify of media eject. * Also send DEVICE_TRAY_MOVED events as appropriate. */ -void blk_dev_change_media_cb(BlockBackend *blk, bool load) +void blk_dev_change_media_cb(BlockBackend *blk, bool load, Error **errp) { if (blk->dev_ops && blk->dev_ops->change_media_cb) { bool tray_was_open, tray_is_open; + Error *local_err =3D NULL; =20 assert(!blk->legacy_dev); =20 tray_was_open =3D blk_dev_is_tray_open(blk); - blk->dev_ops->change_media_cb(blk->dev_opaque, load); + blk->dev_ops->change_media_cb(blk->dev_opaque, load, &local_err); + if (local_err) { + assert(load =3D=3D true); + error_propagate(errp, local_err); + return; + } tray_is_open =3D blk_dev_is_tray_open(blk); =20 if (tray_was_open !=3D tray_is_open) { @@ -693,7 +699,7 @@ void blk_dev_change_media_cb(BlockBackend *blk, bool lo= ad) =20 static void blk_root_change_media(BdrvChild *child, bool load) { - blk_dev_change_media_cb(child->opaque, load); + blk_dev_change_media_cb(child->opaque, load, NULL); } =20 /* diff --git a/blockdev.c b/blockdev.c index c590e67..8c30084 100644 --- a/blockdev.c +++ b/blockdev.c @@ -2307,7 +2307,7 @@ static int do_open_tray(const char *blk_name, const c= har *qdev_id, } =20 if (!locked || force) { - blk_dev_change_media_cb(blk, false); + blk_dev_change_media_cb(blk, false, &error_abort); } =20 if (locked && !force) { @@ -2345,6 +2345,7 @@ void qmp_blockdev_close_tray(bool has_device, const c= har *device, Error **errp) { BlockBackend *blk; + Error *local_err =3D NULL; =20 device =3D has_device ? device : NULL; id =3D has_id ? id : NULL; @@ -2368,7 +2369,11 @@ void qmp_blockdev_close_tray(bool has_device, const = char *device, return; } =20 - blk_dev_change_media_cb(blk, true); + blk_dev_change_media_cb(blk, true, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } } =20 void qmp_x_blockdev_remove_medium(bool has_device, const char *device, @@ -2421,7 +2426,7 @@ void qmp_x_blockdev_remove_medium(bool has_device, co= nst char *device, * called at all); therefore, the medium needs to be ejected here. * Do it after blk_remove_bs() so blk_is_inserted(blk) returns the= @load * value passed here (i.e. false). */ - blk_dev_change_media_cb(blk, false); + blk_dev_change_media_cb(blk, false, &error_abort); } =20 out: @@ -2431,6 +2436,7 @@ out: static void qmp_blockdev_insert_anon_medium(BlockBackend *blk, BlockDriverState *bs, Error **= errp) { + Error *local_err =3D NULL; bool has_device; int ret; =20 @@ -2463,7 +2469,12 @@ static void qmp_blockdev_insert_anon_medium(BlockBac= kend *blk, * slot here. * Do it after blk_insert_bs() so blk_is_inserted(blk) returns the= @load * value passed here (i.e. true). */ - blk_dev_change_media_cb(blk, true); + blk_dev_change_media_cb(blk, true, &local_err); + if (local_err) { + error_propagate(errp, local_err); + blk_remove_bs(blk); + return; + } } } =20 diff --git a/hw/block/fdc.c b/hw/block/fdc.c index 74f3634..5f6c496 100644 --- a/hw/block/fdc.c +++ b/hw/block/fdc.c @@ -469,7 +469,7 @@ static void fd_revalidate(FDrive *drv) } } =20 -static void fd_change_cb(void *opaque, bool load) +static void fd_change_cb(void *opaque, bool load, Error **errp) { FDrive *drive =3D opaque; =20 diff --git a/hw/ide/core.c b/hw/ide/core.c index 43709e5..f88b1e5 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -1120,7 +1120,7 @@ static void ide_cfata_metadata_write(IDEState *s) } =20 /* called when the inserted state of the media has changed */ -static void ide_cd_change_cb(void *opaque, bool load) +static void ide_cd_change_cb(void *opaque, bool load, Error **errp) { IDEState *s =3D opaque; uint64_t nb_sectors; diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c index 61c44a9..f3f20da 100644 --- a/hw/scsi/scsi-disk.c +++ b/hw/scsi/scsi-disk.c @@ -2225,7 +2225,7 @@ static void scsi_disk_resize_cb(void *opaque) } } =20 -static void scsi_cd_change_media_cb(void *opaque, bool load) +static void scsi_cd_change_media_cb(void *opaque, bool load, Error **errp) { SCSIDiskState *s =3D opaque; =20 diff --git a/hw/sd/sd.c b/hw/sd/sd.c index 8e88e83..8e31491 100644 --- a/hw/sd/sd.c +++ b/hw/sd/sd.c @@ -458,7 +458,7 @@ static bool sd_get_readonly(SDState *sd) return sd->wp_switch; } =20 -static void sd_cardchange(void *opaque, bool load) +static void sd_cardchange(void *opaque, bool load, Error **errp) { SDState *sd =3D opaque; DeviceState *dev =3D DEVICE(sd); diff --git a/include/block/block_int.h b/include/block/block_int.h index 46f51a6..7558f99 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -895,7 +895,7 @@ void bdrv_format_default_perms(BlockDriverState *bs, Bd= rvChild *c, uint64_t *nperm, uint64_t *nshared); =20 const char *bdrv_get_parent_name(const BlockDriverState *bs); -void blk_dev_change_media_cb(BlockBackend *blk, bool load); +void blk_dev_change_media_cb(BlockBackend *blk, bool load, Error **errp); bool blk_dev_has_removable_media(BlockBackend *blk); bool blk_dev_has_tray(BlockBackend *blk); void blk_dev_eject_request(BlockBackend *blk, bool force); diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h index 6f21508..65bd081 100644 --- a/include/sysemu/block-backend.h +++ b/include/sysemu/block-backend.h @@ -34,7 +34,7 @@ typedef struct BlockDevOps { * changes. Sure would be useful if it did. * Device models with removable media must implement this callback. */ - void (*change_media_cb)(void *opaque, bool load); + void (*change_media_cb)(void *opaque, bool load, Error **errp); /* * Runs when an eject request is issued from the monitor, the tray * is closed, and the medium is locked. --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487009938104308.8946622575339; Mon, 13 Feb 2017 10:18:58 -0800 (PST) Received: from localhost ([::1]:58698 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdLDD-0004dP-K3 for importer@patchew.org; Mon, 13 Feb 2017 13:18:55 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59440) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKM3-0003Mw-96 for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:02 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKM0-0006Ay-Lm for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:23:59 -0500 Received: from mx1.redhat.com ([209.132.183.28]:35328) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKLu-00068K-Vj; Mon, 13 Feb 2017 12:23:51 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 263A78046E; Mon, 13 Feb 2017 17:23:51 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3Z031842; Mon, 13 Feb 2017 12:23:49 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:41 +0100 Message-Id: <1487006583-24350-20-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Mon, 13 Feb 2017 17:23:51 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 19/41] hw/block: Request permissions X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This makes all device emulations with a qdev drive property request permissions on their BlockBackend. We don't block anything yet. Signed-off-by: Kevin Wolf --- hw/block/block.c | 19 ++++++++++++++++++- hw/block/fdc.c | 25 +++++++++++++++++++++++-- hw/block/m25p80.c | 8 ++++++++ hw/block/nand.c | 7 +++++++ hw/block/nvme.c | 8 +++++++- hw/block/onenand.c | 7 +++++++ hw/block/pflash_cfi01.c | 18 ++++++++++++------ hw/block/pflash_cfi02.c | 19 +++++++++++++------ hw/block/virtio-blk.c | 8 +++++++- hw/core/qdev-properties-system.c | 1 - hw/ide/qdev.c | 7 +++++-- hw/nvram/spapr_nvram.c | 8 ++++++++ hw/scsi/scsi-disk.c | 8 ++++++-- hw/sd/sd.c | 6 ++++++ hw/usb/dev-storage.c | 6 +++++- include/hw/block/block.h | 3 ++- tests/qemu-iotests/051.pc.out | 6 +++--- 17 files changed, 137 insertions(+), 27 deletions(-) diff --git a/hw/block/block.c b/hw/block/block.c index 8dc9d84..c3d3901 100644 --- a/hw/block/block.c +++ b/hw/block/block.c @@ -51,11 +51,28 @@ void blkconf_blocksizes(BlockConf *conf) } } =20 -void blkconf_apply_backend_options(BlockConf *conf) +void blkconf_apply_backend_options(BlockConf *conf, bool readonly, + Error **errp) { BlockBackend *blk =3D conf->blk; BlockdevOnError rerror, werror; + uint64_t perm; bool wce; + int ret; + + perm =3D BLK_PERM_CONSISTENT_READ; + if (!readonly) { + perm |=3D BLK_PERM_WRITE; + } + + /* TODO Remove BLK_PERM_WRITE unless explicitly configured so */ + ret =3D blk_set_perm(blk, perm, + BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE_UNCHANGED= | + BLK_PERM_GRAPH_MOD | BLK_PERM_RESIZE | BLK_PERM_WRI= TE, + errp); + if (ret < 0) { + return; + } =20 switch (conf->wce) { case ON_OFF_AUTO_ON: wce =3D true; break; diff --git a/hw/block/fdc.c b/hw/block/fdc.c index 5f6c496..b3fa4c7 100644 --- a/hw/block/fdc.c +++ b/hw/block/fdc.c @@ -186,6 +186,7 @@ typedef enum FDiskFlags { struct FDrive { FDCtrl *fdctrl; BlockBackend *blk; + BlockConf *conf; /* Drive status */ FloppyDriveType drive; /* CMOS drive type */ uint8_t perpendicular; /* 2.88 MB access mode */ @@ -472,6 +473,19 @@ static void fd_revalidate(FDrive *drv) static void fd_change_cb(void *opaque, bool load, Error **errp) { FDrive *drive =3D opaque; + Error *local_err =3D NULL; + + if (!load) { + blk_set_perm(drive->blk, 0, BLK_PERM_ALL, &error_abort); + } else { + blkconf_apply_backend_options(drive->conf, + blk_is_read_only(drive->blk), + &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + } =20 drive->media_changed =3D 1; drive->media_validated =3D false; @@ -508,6 +522,7 @@ static int floppy_drive_init(DeviceState *qdev) FloppyDrive *dev =3D FLOPPY_DRIVE(qdev); FloppyBus *bus =3D FLOPPY_BUS(qdev->parent_bus); FDrive *drive; + Error *local_err =3D NULL; int ret; =20 if (dev->unit =3D=3D -1) { @@ -533,7 +548,6 @@ static int floppy_drive_init(DeviceState *qdev) =20 if (!dev->conf.blk) { /* Anonymous BlockBackend for an empty drive */ - /* FIXME Use real permissions */ dev->conf.blk =3D blk_new(0, BLK_PERM_ALL); ret =3D blk_attach_dev(dev->conf.blk, qdev); assert(ret =3D=3D 0); @@ -552,7 +566,13 @@ static int floppy_drive_init(DeviceState *qdev) * blkconf_apply_backend_options(). */ dev->conf.rerror =3D BLOCKDEV_ON_ERROR_AUTO; dev->conf.werror =3D BLOCKDEV_ON_ERROR_AUTO; - blkconf_apply_backend_options(&dev->conf); + + blkconf_apply_backend_options(&dev->conf, blk_is_read_only(dev->conf.b= lk), + &local_err); + if (local_err) { + error_report_err(local_err); + return -1; + } =20 /* 'enospc' is the default for -drive, 'report' is what blk_new() give= s us * for empty drives. */ @@ -566,6 +586,7 @@ static int floppy_drive_init(DeviceState *qdev) return -1; } =20 + drive->conf =3D &dev->conf; drive->blk =3D dev->conf.blk; drive->fdctrl =3D bus->fdc; =20 diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c index 2d6eb46..190573c 100644 --- a/hw/block/m25p80.c +++ b/hw/block/m25p80.c @@ -1215,6 +1215,7 @@ static void m25p80_realize(SSISlave *ss, Error **errp) { Flash *s =3D M25P80(ss); M25P80Class *mc =3D M25P80_GET_CLASS(s); + int ret; =20 s->pi =3D mc->pi; =20 @@ -1222,6 +1223,13 @@ static void m25p80_realize(SSISlave *ss, Error **err= p) s->dirty_page =3D -1; =20 if (s->blk) { + uint64_t perm =3D BLK_PERM_CONSISTENT_READ | + (blk_is_read_only(s->blk) ? 0 : BLK_PERM_WRITE); + ret =3D blk_set_perm(s->blk, perm, BLK_PERM_ALL, errp); + if (ret < 0) { + return; + } + DB_PRINT_L(0, "Binding to IF_MTD drive\n"); s->storage =3D blk_blockalign(s->blk, s->size); =20 diff --git a/hw/block/nand.c b/hw/block/nand.c index c69e675..0d33ac2 100644 --- a/hw/block/nand.c +++ b/hw/block/nand.c @@ -373,6 +373,8 @@ static void nand_realize(DeviceState *dev, Error **errp) { int pagesize; NANDFlashState *s =3D NAND(dev); + int ret; + =20 s->buswidth =3D nand_flash_ids[s->chip_id].width >> 3; s->size =3D nand_flash_ids[s->chip_id].size << 20; @@ -407,6 +409,11 @@ static void nand_realize(DeviceState *dev, Error **err= p) error_setg(errp, "Can't use a read-only drive"); return; } + ret =3D blk_set_perm(s->blk, BLK_PERM_CONSISTENT_READ | BLK_PERM_W= RITE, + BLK_PERM_ALL, errp); + if (ret < 0) { + return; + } if (blk_getlength(s->blk) >=3D (s->pages << s->page_shift) + (s->pages << s->oob_shift)) { pagesize =3D 0; diff --git a/hw/block/nvme.c b/hw/block/nvme.c index ae91a18..4d423af 100644 --- a/hw/block/nvme.c +++ b/hw/block/nvme.c @@ -835,6 +835,7 @@ static int nvme_init(PCIDevice *pci_dev) int i; int64_t bs_size; uint8_t *pci_conf; + Error *local_err =3D NULL; =20 if (!n->conf.blk) { return -1; @@ -850,7 +851,12 @@ static int nvme_init(PCIDevice *pci_dev) return -1; } blkconf_blocksizes(&n->conf); - blkconf_apply_backend_options(&n->conf); + blkconf_apply_backend_options(&n->conf, blk_is_read_only(n->conf.blk), + &local_err); + if (local_err) { + error_report_err(local_err); + return -1; + } =20 pci_conf =3D pci_dev->config; pci_conf[PCI_INTERRUPT_PIN] =3D 1; diff --git a/hw/block/onenand.c b/hw/block/onenand.c index 8d84227..ddf5492 100644 --- a/hw/block/onenand.c +++ b/hw/block/onenand.c @@ -778,6 +778,7 @@ static int onenand_initfn(SysBusDevice *sbd) OneNANDState *s =3D ONE_NAND(dev); uint32_t size =3D 1 << (24 + ((s->id.dev >> 4) & 7)); void *ram; + Error *local_err =3D NULL; =20 s->base =3D (hwaddr)-1; s->rdy =3D NULL; @@ -796,6 +797,12 @@ static int onenand_initfn(SysBusDevice *sbd) error_report("Can't use a read-only drive"); return -1; } + blk_set_perm(s->blk, BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE, + BLK_PERM_ALL, &local_err); + if (local_err) { + error_report_err(local_err); + return -1; + } s->blk_cur =3D s->blk; } s->otp =3D memset(g_malloc((64 + 2) << PAGE_SHIFT), diff --git a/hw/block/pflash_cfi01.c b/hw/block/pflash_cfi01.c index 71b98a3..594d4cf 100644 --- a/hw/block/pflash_cfi01.c +++ b/hw/block/pflash_cfi01.c @@ -758,6 +758,18 @@ static void pflash_cfi01_realize(DeviceState *dev, Err= or **errp) sysbus_init_mmio(SYS_BUS_DEVICE(dev), &pfl->mem); =20 if (pfl->blk) { + uint64_t perm; + pfl->ro =3D blk_is_read_only(pfl->blk); + perm =3D BLK_PERM_CONSISTENT_READ | (pfl->ro ? 0 : BLK_PERM_WRITE); + ret =3D blk_set_perm(pfl->blk, perm, BLK_PERM_ALL, errp); + if (ret < 0) { + return; + } + } else { + pfl->ro =3D 0; + } + + if (pfl->blk) { /* read the initial flash content */ ret =3D blk_pread(pfl->blk, 0, pfl->storage, total_len); =20 @@ -768,12 +780,6 @@ static void pflash_cfi01_realize(DeviceState *dev, Err= or **errp) } } =20 - if (pfl->blk) { - pfl->ro =3D blk_is_read_only(pfl->blk); - } else { - pfl->ro =3D 0; - } - /* Default to devices being used at their maximum device width. This w= as * assumed before the device_width support was added. */ diff --git a/hw/block/pflash_cfi02.c b/hw/block/pflash_cfi02.c index ef71322..e6c5c6c 100644 --- a/hw/block/pflash_cfi02.c +++ b/hw/block/pflash_cfi02.c @@ -632,6 +632,19 @@ static void pflash_cfi02_realize(DeviceState *dev, Err= or **errp) vmstate_register_ram(&pfl->orig_mem, DEVICE(pfl)); pfl->storage =3D memory_region_get_ram_ptr(&pfl->orig_mem); pfl->chip_len =3D chip_len; + + if (pfl->blk) { + uint64_t perm; + pfl->ro =3D blk_is_read_only(pfl->blk); + perm =3D BLK_PERM_CONSISTENT_READ | (pfl->ro ? 0 : BLK_PERM_WRITE); + ret =3D blk_set_perm(pfl->blk, perm, BLK_PERM_ALL, errp); + if (ret < 0) { + return; + } + } else { + pfl->ro =3D 0; + } + if (pfl->blk) { /* read the initial flash content */ ret =3D blk_pread(pfl->blk, 0, pfl->storage, chip_len); @@ -646,12 +659,6 @@ static void pflash_cfi02_realize(DeviceState *dev, Err= or **errp) pfl->rom_mode =3D 1; sysbus_init_mmio(SYS_BUS_DEVICE(dev), &pfl->mem); =20 - if (pfl->blk) { - pfl->ro =3D blk_is_read_only(pfl->blk); - } else { - pfl->ro =3D 0; - } - pfl->timer =3D timer_new_ns(QEMU_CLOCK_VIRTUAL, pflash_timer, pfl); pfl->wcycle =3D 0; pfl->cmd =3D 0; diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c index 702eda8..18fcaa0 100644 --- a/hw/block/virtio-blk.c +++ b/hw/block/virtio-blk.c @@ -905,7 +905,13 @@ static void virtio_blk_device_realize(DeviceState *dev= , Error **errp) } =20 blkconf_serial(&conf->conf, &conf->serial); - blkconf_apply_backend_options(&conf->conf); + blkconf_apply_backend_options(&conf->conf, + blk_is_read_only(conf->conf.blk), + &err); + if (err) { + error_propagate(errp, err); + return; + } s->original_wce =3D blk_enable_write_cache(conf->conf.blk); blkconf_geometry(&conf->conf, NULL, 65535, 255, 255, &err); if (err) { diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-sys= tem.c index 66ba367..c34be1c 100644 --- a/hw/core/qdev-properties-system.c +++ b/hw/core/qdev-properties-system.c @@ -79,7 +79,6 @@ static void parse_drive(DeviceState *dev, const char *str= , void **ptr, if (!blk) { BlockDriverState *bs =3D bdrv_lookup_bs(NULL, str, NULL); if (bs) { - /* FIXME Use real permissions */ blk =3D blk_new(0, BLK_PERM_ALL); blk_created =3D true; =20 diff --git a/hw/ide/qdev.c b/hw/ide/qdev.c index bb3c377..db36843 100644 --- a/hw/ide/qdev.c +++ b/hw/ide/qdev.c @@ -170,7 +170,6 @@ static int ide_dev_initfn(IDEDevice *dev, IDEDriveKind = kind) return -1; } else { /* Anonymous BlockBackend for an empty drive */ - /* FIXME Use real permissions */ dev->conf.blk =3D blk_new(0, BLK_PERM_ALL); } } @@ -197,7 +196,11 @@ static int ide_dev_initfn(IDEDevice *dev, IDEDriveKind= kind) return -1; } } - blkconf_apply_backend_options(&dev->conf); + blkconf_apply_backend_options(&dev->conf, kind =3D=3D IDE_CD, &err); + if (err) { + error_report_err(err); + return -1; + } =20 if (ide_init_drive(s, dev->conf.blk, kind, dev->version, dev->serial, dev->model, dev->wwn, diff --git a/hw/nvram/spapr_nvram.c b/hw/nvram/spapr_nvram.c index eb42ea3..a7cc203 100644 --- a/hw/nvram/spapr_nvram.c +++ b/hw/nvram/spapr_nvram.c @@ -141,9 +141,17 @@ static void rtas_nvram_store(PowerPCCPU *cpu, sPAPRMac= hineState *spapr, static void spapr_nvram_realize(VIOsPAPRDevice *dev, Error **errp) { sPAPRNVRAM *nvram =3D VIO_SPAPR_NVRAM(dev); + int ret; =20 if (nvram->blk) { nvram->size =3D blk_getlength(nvram->blk); + + ret =3D blk_set_perm(nvram->blk, + BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE, + BLK_PERM_ALL, errp); + if (ret < 0) { + return; + } } else { nvram->size =3D DEFAULT_NVRAM_SIZE; } diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c index f3f20da..5683af6 100644 --- a/hw/scsi/scsi-disk.c +++ b/hw/scsi/scsi-disk.c @@ -2313,7 +2313,12 @@ static void scsi_realize(SCSIDevice *dev, Error **er= rp) return; } } - blkconf_apply_backend_options(&dev->conf); + blkconf_apply_backend_options(&dev->conf, + blk_is_read_only(s->qdev.conf.blk), &err= ); + if (err) { + error_propagate(errp, err); + return; + } =20 if (s->qdev.conf.discard_granularity =3D=3D -1) { s->qdev.conf.discard_granularity =3D @@ -2365,7 +2370,6 @@ static void scsi_cd_realize(SCSIDevice *dev, Error **= errp) SCSIDiskState *s =3D DO_UPCAST(SCSIDiskState, qdev, dev); =20 if (!dev->conf.blk) { - /* FIXME Use real permissions */ dev->conf.blk =3D blk_new(0, BLK_PERM_ALL); } =20 diff --git a/hw/sd/sd.c b/hw/sd/sd.c index 8e31491..ba47bff 100644 --- a/hw/sd/sd.c +++ b/hw/sd/sd.c @@ -1887,6 +1887,7 @@ static void sd_instance_finalize(Object *obj) static void sd_realize(DeviceState *dev, Error **errp) { SDState *sd =3D SD_CARD(dev); + int ret; =20 if (sd->blk && blk_is_read_only(sd->blk)) { error_setg(errp, "Cannot use read-only drive as SD card"); @@ -1894,6 +1895,11 @@ static void sd_realize(DeviceState *dev, Error **err= p) } =20 if (sd->blk) { + ret =3D blk_set_perm(sd->blk, BLK_PERM_CONSISTENT_READ | BLK_PERM_= WRITE, + BLK_PERM_ALL, errp); + if (ret < 0) { + return; + } blk_set_dev_ops(sd->blk, &sd_block_ops, sd); } } diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c index c607f76..46def96 100644 --- a/hw/usb/dev-storage.c +++ b/hw/usb/dev-storage.c @@ -603,7 +603,11 @@ static void usb_msd_realize_storage(USBDevice *dev, Er= ror **errp) =20 blkconf_serial(&s->conf, &dev->serial); blkconf_blocksizes(&s->conf); - blkconf_apply_backend_options(&s->conf); + blkconf_apply_backend_options(&s->conf, blk_is_read_only(blk), &err); + if (err) { + error_propagate(errp, err); + return; + } =20 /* * Hack alert: this pretends to be a block device, but it's really diff --git a/include/hw/block/block.h b/include/hw/block/block.h index df9d207..3daccf1 100644 --- a/include/hw/block/block.h +++ b/include/hw/block/block.h @@ -73,7 +73,8 @@ void blkconf_geometry(BlockConf *conf, int *trans, unsigned cyls_max, unsigned heads_max, unsigned secs= _max, Error **errp); void blkconf_blocksizes(BlockConf *conf); -void blkconf_apply_backend_options(BlockConf *conf); +void blkconf_apply_backend_options(BlockConf *conf, bool readonly, + Error **errp); =20 /* Hard disk geometry */ =20 diff --git a/tests/qemu-iotests/051.pc.out b/tests/qemu-iotests/051.pc.out index f1669c1..eb4b3b5 100644 --- a/tests/qemu-iotests/051.pc.out +++ b/tests/qemu-iotests/051.pc.out @@ -176,7 +176,7 @@ QEMU X.Y.Z monitor - type 'help' for more information =20 Testing: -drive file=3DTEST_DIR/t.qcow2,if=3Dide,readonly=3Don QEMU X.Y.Z monitor - type 'help' for more information -(qemu) QEMU_PROG: Can't use a read-only drive +(qemu) QEMU_PROG: Block node is read-only QEMU_PROG: Initialization of device ide-hd failed: Device initialization f= ailed. =20 Testing: -drive file=3DTEST_DIR/t.qcow2,if=3Dscsi,readonly=3Don @@ -197,12 +197,12 @@ QEMU X.Y.Z monitor - type 'help' for more information =20 Testing: -drive file=3DTEST_DIR/t.qcow2,if=3Dnone,id=3Ddisk,readonly=3Don = -device ide-drive,drive=3Ddisk QEMU X.Y.Z monitor - type 'help' for more information -(qemu) QEMU_PROG: -device ide-drive,drive=3Ddisk: Can't use a read-only dr= ive +(qemu) QEMU_PROG: -device ide-drive,drive=3Ddisk: Block node is read-only QEMU_PROG: -device ide-drive,drive=3Ddisk: Device initialization failed. =20 Testing: -drive file=3DTEST_DIR/t.qcow2,if=3Dnone,id=3Ddisk,readonly=3Don = -device ide-hd,drive=3Ddisk QEMU X.Y.Z monitor - type 'help' for more information -(qemu) QEMU_PROG: -device ide-hd,drive=3Ddisk: Can't use a read-only drive +(qemu) QEMU_PROG: -device ide-hd,drive=3Ddisk: Block node is read-only QEMU_PROG: -device ide-hd,drive=3Ddisk: Device initialization failed. =20 Testing: -drive file=3DTEST_DIR/t.qcow2,if=3Dnone,id=3Ddisk,readonly=3Don = -device lsi53c895a -device scsi-disk,drive=3Ddisk --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487007845838891.4742775589782; Mon, 13 Feb 2017 09:44:05 -0800 (PST) Received: from localhost ([::1]:58466 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKfT-0005Fe-Ct for importer@patchew.org; Mon, 13 Feb 2017 12:44:03 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59474) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKM6-0003QQ-8I for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:04 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKM2-0006BS-Q5 for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:02 -0500 Received: from mx1.redhat.com ([209.132.183.28]:52978) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKLw-00069N-Qa; Mon, 13 Feb 2017 12:23:53 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 00021C04B94C; Mon, 13 Feb 2017 17:23:52 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3a031842; Mon, 13 Feb 2017 12:23:51 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:42 +0100 Message-Id: <1487006583-24350-21-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 13 Feb 2017 17:23:53 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 20/41] hw/block: Introduce share-rw qdev property X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" By default, don't allow another writer for block devices that are attached to a guest device. For the cases where this setup is intended (e.g. using a cluster filesystem on the disk), the new option can be used to allow it. This change affects only devices using DEFINE_BLOCK_PROPERTIES(). Devices directly using DEFINE_PROP_DRIVE() still accept writers unconditionally. Signed-off-by: Kevin Wolf --- hw/block/block.c | 14 ++++++------ include/hw/block/block.h | 4 +++- tests/qemu-iotests/172.out | 53 ++++++++++++++++++++++++++++++++++++++++++= ++++ 3 files changed, 64 insertions(+), 7 deletions(-) diff --git a/hw/block/block.c b/hw/block/block.c index c3d3901..3c218eb 100644 --- a/hw/block/block.c +++ b/hw/block/block.c @@ -56,7 +56,7 @@ void blkconf_apply_backend_options(BlockConf *conf, bool = readonly, { BlockBackend *blk =3D conf->blk; BlockdevOnError rerror, werror; - uint64_t perm; + uint64_t perm, shared_perm; bool wce; int ret; =20 @@ -65,11 +65,13 @@ void blkconf_apply_backend_options(BlockConf *conf, boo= l readonly, perm |=3D BLK_PERM_WRITE; } =20 - /* TODO Remove BLK_PERM_WRITE unless explicitly configured so */ - ret =3D blk_set_perm(blk, perm, - BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE_UNCHANGED= | - BLK_PERM_GRAPH_MOD | BLK_PERM_RESIZE | BLK_PERM_WRI= TE, - errp); + shared_perm =3D BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE_UNCHANGED | + BLK_PERM_GRAPH_MOD | BLK_PERM_RESIZE; + if (conf->share_rw) { + shared_perm |=3D BLK_PERM_WRITE; + } + + ret =3D blk_set_perm(blk, perm, shared_perm, errp); if (ret < 0) { return; } diff --git a/include/hw/block/block.h b/include/hw/block/block.h index 3daccf1..ff78f12 100644 --- a/include/hw/block/block.h +++ b/include/hw/block/block.h @@ -26,6 +26,7 @@ typedef struct BlockConf { /* geometry, not all devices use this */ uint32_t cyls, heads, secs; OnOffAuto wce; + bool share_rw; BlockdevOnError rerror; BlockdevOnError werror; } BlockConf; @@ -53,7 +54,8 @@ static inline unsigned int get_physical_block_exp(BlockCo= nf *conf) DEFINE_PROP_UINT32("opt_io_size", _state, _conf.opt_io_size, 0), \ DEFINE_PROP_UINT32("discard_granularity", _state, \ _conf.discard_granularity, -1), \ - DEFINE_PROP_ON_OFF_AUTO("write-cache", _state, _conf.wce, ON_OFF_AUTO_= AUTO) + DEFINE_PROP_ON_OFF_AUTO("write-cache", _state, _conf.wce, ON_OFF_AUTO_= AUTO), \ + DEFINE_PROP_BOOL("share-rw", _state, _conf.share_rw, false) =20 #define DEFINE_BLOCK_CHS_PROPERTIES(_state, _conf) \ DEFINE_PROP_UINT32("cyls", _state, _conf.cyls, 0), \ diff --git a/tests/qemu-iotests/172.out b/tests/qemu-iotests/172.out index 6b7edaf..54b5329 100644 --- a/tests/qemu-iotests/172.out +++ b/tests/qemu-iotests/172.out @@ -28,6 +28,7 @@ Testing: opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "288" =20 =20 @@ -57,6 +58,7 @@ Testing: -fda TEST_DIR/t.qcow2 opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 Testing: -fdb TEST_DIR/t.qcow2 @@ -83,6 +85,7 @@ Testing: -fdb TEST_DIR/t.qcow2 opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" dev: floppy, id "" unit =3D 0 (0x0) @@ -93,6 +96,7 @@ Testing: -fdb TEST_DIR/t.qcow2 opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "288" =20 Testing: -fda TEST_DIR/t.qcow2 -fdb TEST_DIR/t.qcow2 @@ -119,6 +123,7 @@ Testing: -fda TEST_DIR/t.qcow2 -fdb TEST_DIR/t.qcow2 opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" dev: floppy, id "" unit =3D 0 (0x0) @@ -129,6 +134,7 @@ Testing: -fda TEST_DIR/t.qcow2 -fdb TEST_DIR/t.qcow2 opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 =20 @@ -158,6 +164,7 @@ Testing: -drive if=3Dfloppy,file=3DTEST_DIR/t.qcow2 opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 Testing: -drive if=3Dfloppy,file=3DTEST_DIR/t.qcow2,index=3D1 @@ -184,6 +191,7 @@ Testing: -drive if=3Dfloppy,file=3DTEST_DIR/t.qcow2,ind= ex=3D1 opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" dev: floppy, id "" unit =3D 0 (0x0) @@ -194,6 +202,7 @@ Testing: -drive if=3Dfloppy,file=3DTEST_DIR/t.qcow2,ind= ex=3D1 opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "288" =20 Testing: -drive if=3Dfloppy,file=3DTEST_DIR/t.qcow2 -drive if=3Dfloppy,fil= e=3DTEST_DIR/t.qcow2,index=3D1 @@ -220,6 +229,7 @@ Testing: -drive if=3Dfloppy,file=3DTEST_DIR/t.qcow2 -dr= ive if=3Dfloppy,file=3DTEST_DIR/t opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" dev: floppy, id "" unit =3D 0 (0x0) @@ -230,6 +240,7 @@ Testing: -drive if=3Dfloppy,file=3DTEST_DIR/t.qcow2 -dr= ive if=3Dfloppy,file=3DTEST_DIR/t opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 =20 @@ -259,6 +270,7 @@ Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -glob= al isa-fdc.driveA=3Dnone0 opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -global isa-fdc.driveB= =3Dnone0 @@ -285,6 +297,7 @@ Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -glob= al isa-fdc.driveB=3Dnone0 opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -drive if=3Dnone,file=3D= TEST_DIR/t.qcow2 -global isa-fdc.driveA=3Dnone0 -global isa-fdc.driveB=3Dno= ne1 @@ -311,6 +324,7 @@ Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -driv= e if=3Dnone,file=3DTEST_DIR/t.qco opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" dev: floppy, id "" unit =3D 0 (0x0) @@ -321,6 +335,7 @@ Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -driv= e if=3Dnone,file=3DTEST_DIR/t.qco opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 =20 @@ -350,6 +365,7 @@ Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -devi= ce floppy,drive=3Dnone0 opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -device floppy,drive=3Dn= one0,unit=3D1 @@ -376,6 +392,7 @@ Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -devi= ce floppy,drive=3Dnone0,unit=3D1 opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -drive if=3Dnone,file=3D= TEST_DIR/t.qcow2 -device floppy,drive=3Dnone0 -device floppy,drive=3Dnone1,= unit=3D1 @@ -402,6 +419,7 @@ Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -driv= e if=3Dnone,file=3DTEST_DIR/t.qco opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" dev: floppy, id "" unit =3D 0 (0x0) @@ -412,6 +430,7 @@ Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -driv= e if=3Dnone,file=3DTEST_DIR/t.qco opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 =20 @@ -441,6 +460,7 @@ Testing: -fda TEST_DIR/t.qcow2 -drive if=3Dnone,file=3D= TEST_DIR/t.qcow2 -global isa- opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" dev: floppy, id "" unit =3D 0 (0x0) @@ -451,6 +471,7 @@ Testing: -fda TEST_DIR/t.qcow2 -drive if=3Dnone,file=3D= TEST_DIR/t.qcow2 -global isa- opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 Testing: -fdb TEST_DIR/t.qcow2 -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -g= lobal isa-fdc.driveA=3Dnone0 @@ -477,6 +498,7 @@ Testing: -fdb TEST_DIR/t.qcow2 -drive if=3Dnone,file=3D= TEST_DIR/t.qcow2 -global isa- opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" dev: floppy, id "" unit =3D 0 (0x0) @@ -487,6 +509,7 @@ Testing: -fdb TEST_DIR/t.qcow2 -drive if=3Dnone,file=3D= TEST_DIR/t.qcow2 -global isa- opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 Testing: -fda TEST_DIR/t.qcow2 -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -g= lobal isa-fdc.driveA=3Dnone0 @@ -513,6 +536,7 @@ Testing: -fda TEST_DIR/t.qcow2 -drive if=3Dnone,file=3D= TEST_DIR/t.qcow2 -global isa- opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 Testing: -fdb TEST_DIR/t.qcow2 -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -g= lobal isa-fdc.driveB=3Dnone0 @@ -539,6 +563,7 @@ Testing: -fdb TEST_DIR/t.qcow2 -drive if=3Dnone,file=3D= TEST_DIR/t.qcow2 -global isa- opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 =20 @@ -568,6 +593,7 @@ Testing: -fda TEST_DIR/t.qcow2 -drive if=3Dnone,file=3D= TEST_DIR/t.qcow2 -device flop opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" dev: floppy, id "" unit =3D 0 (0x0) @@ -578,6 +604,7 @@ Testing: -fda TEST_DIR/t.qcow2 -drive if=3Dnone,file=3D= TEST_DIR/t.qcow2 -device flop opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 Testing: -fda TEST_DIR/t.qcow2 -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -d= evice floppy,drive=3Dnone0,unit=3D1 @@ -604,6 +631,7 @@ Testing: -fda TEST_DIR/t.qcow2 -drive if=3Dnone,file=3D= TEST_DIR/t.qcow2 -device flop opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" dev: floppy, id "" unit =3D 0 (0x0) @@ -614,6 +642,7 @@ Testing: -fda TEST_DIR/t.qcow2 -drive if=3Dnone,file=3D= TEST_DIR/t.qcow2 -device flop opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 Testing: -fdb TEST_DIR/t.qcow2 -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -d= evice floppy,drive=3Dnone0 @@ -640,6 +669,7 @@ Testing: -fdb TEST_DIR/t.qcow2 -drive if=3Dnone,file=3D= TEST_DIR/t.qcow2 -device flop opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" dev: floppy, id "" unit =3D 1 (0x1) @@ -650,6 +680,7 @@ Testing: -fdb TEST_DIR/t.qcow2 -drive if=3Dnone,file=3D= TEST_DIR/t.qcow2 -device flop opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 Testing: -fdb TEST_DIR/t.qcow2 -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -d= evice floppy,drive=3Dnone0,unit=3D0 @@ -676,6 +707,7 @@ Testing: -fdb TEST_DIR/t.qcow2 -drive if=3Dnone,file=3D= TEST_DIR/t.qcow2 -device flop opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" dev: floppy, id "" unit =3D 1 (0x1) @@ -686,6 +718,7 @@ Testing: -fdb TEST_DIR/t.qcow2 -drive if=3Dnone,file=3D= TEST_DIR/t.qcow2 -device flop opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 Testing: -fda TEST_DIR/t.qcow2 -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -d= evice floppy,drive=3Dnone0,unit=3D0 @@ -723,6 +756,7 @@ Testing: -drive if=3Dfloppy,file=3DTEST_DIR/t.qcow2 -dr= ive if=3Dnone,file=3DTEST_DIR/t.q opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" dev: floppy, id "" unit =3D 0 (0x0) @@ -733,6 +767,7 @@ Testing: -drive if=3Dfloppy,file=3DTEST_DIR/t.qcow2 -dr= ive if=3Dnone,file=3DTEST_DIR/t.q opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 Testing: -drive if=3Dfloppy,file=3DTEST_DIR/t.qcow2 -drive if=3Dnone,file= =3DTEST_DIR/t.qcow2 -device floppy,drive=3Dnone0,unit=3D1 @@ -759,6 +794,7 @@ Testing: -drive if=3Dfloppy,file=3DTEST_DIR/t.qcow2 -dr= ive if=3Dnone,file=3DTEST_DIR/t.q opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" dev: floppy, id "" unit =3D 0 (0x0) @@ -769,6 +805,7 @@ Testing: -drive if=3Dfloppy,file=3DTEST_DIR/t.qcow2 -dr= ive if=3Dnone,file=3DTEST_DIR/t.q opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 Testing: -drive if=3Dfloppy,file=3DTEST_DIR/t.qcow2 -drive if=3Dnone,file= =3DTEST_DIR/t.qcow2 -device floppy,drive=3Dnone0,unit=3D0 @@ -802,6 +839,7 @@ Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -driv= e if=3Dnone,file=3DTEST_DIR/t.qco opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" dev: floppy, id "" unit =3D 0 (0x0) @@ -812,6 +850,7 @@ Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -driv= e if=3Dnone,file=3DTEST_DIR/t.qco opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -drive if=3Dnone,file=3D= TEST_DIR/t.qcow2 -global isa-fdc.driveA=3Dnone0 -device floppy,drive=3Dnone= 1,unit=3D1 @@ -838,6 +877,7 @@ Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -driv= e if=3Dnone,file=3DTEST_DIR/t.qco opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" dev: floppy, id "" unit =3D 0 (0x0) @@ -848,6 +888,7 @@ Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -driv= e if=3Dnone,file=3DTEST_DIR/t.qco opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -drive if=3Dnone,file=3D= TEST_DIR/t.qcow2 -global isa-fdc.driveB=3Dnone0 -device floppy,drive=3Dnone1 @@ -874,6 +915,7 @@ Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -driv= e if=3Dnone,file=3DTEST_DIR/t.qco opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" dev: floppy, id "" unit =3D 1 (0x1) @@ -884,6 +926,7 @@ Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -driv= e if=3Dnone,file=3DTEST_DIR/t.qco opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -drive if=3Dnone,file=3D= TEST_DIR/t.qcow2 -global isa-fdc.driveB=3Dnone0 -device floppy,drive=3Dnone= 1,unit=3D0 @@ -910,6 +953,7 @@ Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -driv= e if=3Dnone,file=3DTEST_DIR/t.qco opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" dev: floppy, id "" unit =3D 1 (0x1) @@ -920,6 +964,7 @@ Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -driv= e if=3Dnone,file=3DTEST_DIR/t.qco opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -drive if=3Dnone,file=3D= TEST_DIR/t.qcow2 -global isa-fdc.driveA=3Dnone0 -device floppy,drive=3Dnone= 1,unit=3D0 @@ -964,6 +1009,7 @@ Testing: -device floppy opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "288" =20 Testing: -device floppy,drive-type=3D120 @@ -990,6 +1036,7 @@ Testing: -device floppy,drive-type=3D120 opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "120" =20 Testing: -device floppy,drive-type=3D144 @@ -1016,6 +1063,7 @@ Testing: -device floppy,drive-type=3D144 opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 Testing: -device floppy,drive-type=3D288 @@ -1042,6 +1090,7 @@ Testing: -device floppy,drive-type=3D288 opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "288" =20 =20 @@ -1071,6 +1120,7 @@ Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -de= vice floppy,drive=3Dnone0,drive-t opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "120" =20 Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -device floppy,drive=3Dn= one0,drive-type=3D288 @@ -1097,6 +1147,7 @@ Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -de= vice floppy,drive=3Dnone0,drive-t opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "288" =20 =20 @@ -1126,6 +1177,7 @@ Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -de= vice floppy,drive=3Dnone0,logical opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -device floppy,drive=3Dn= one0,physical_block_size=3D512 @@ -1152,6 +1204,7 @@ Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -de= vice floppy,drive=3Dnone0,physica opt_io_size =3D 0 (0x0) discard_granularity =3D 4294967295 (0xffffffff) write-cache =3D "auto" + share-rw =3D false drive-type =3D "144" =20 Testing: -drive if=3Dnone,file=3DTEST_DIR/t.qcow2 -device floppy,drive=3Dn= one0,logical_block_size=3D4096 --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 14870082819241008.4876596017897; Mon, 13 Feb 2017 09:51:21 -0800 (PST) Received: from localhost ([::1]:58513 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKmW-0003Tp-Lm for importer@patchew.org; Mon, 13 Feb 2017 12:51:20 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59467) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKM6-0003Q4-0N for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:03 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKM3-0006Bq-AO for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:01 -0500 Received: from mx1.redhat.com ([209.132.183.28]:48250) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKLz-0006AO-QK; Mon, 13 Feb 2017 12:23:56 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 040963A7687; Mon, 13 Feb 2017 17:23:56 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3b031842; Mon, 13 Feb 2017 12:23:54 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:43 +0100 Message-Id: <1487006583-24350-22-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Mon, 13 Feb 2017 17:23:56 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 21/41] blockjob: Add permissions to block_job_create() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This functions creates a BlockBackend internally, so the block jobs need to tell it what they want to do with the BB. Signed-off-by: Kevin Wolf --- block/backup.c | 5 +++-- block/commit.c | 5 +++-- block/mirror.c | 5 +++-- block/stream.c | 5 +++-- blockjob.c | 6 +++--- include/block/blockjob_int.h | 4 +++- tests/test-blockjob-txn.c | 6 +++--- tests/test-blockjob.c | 5 +++-- 8 files changed, 24 insertions(+), 17 deletions(-) diff --git a/block/backup.c b/block/backup.c index 42e8e99..12ab25c 100644 --- a/block/backup.c +++ b/block/backup.c @@ -618,8 +618,9 @@ BlockJob *backup_job_create(const char *job_id, BlockDr= iverState *bs, goto error; } =20 - job =3D block_job_create(job_id, &backup_job_driver, bs, speed, - creation_flags, cb, opaque, errp); + /* FIXME Use real permissions */ + job =3D block_job_create(job_id, &backup_job_driver, bs, 0, BLK_PERM_A= LL, + speed, creation_flags, cb, opaque, errp); if (!job) { goto error; } diff --git a/block/commit.c b/block/commit.c index 2ad8138..60d29a9 100644 --- a/block/commit.c +++ b/block/commit.c @@ -235,8 +235,9 @@ void commit_start(const char *job_id, BlockDriverState = *bs, return; } =20 - s =3D block_job_create(job_id, &commit_job_driver, bs, speed, - BLOCK_JOB_DEFAULT, NULL, NULL, errp); + /* FIXME Use real permissions */ + s =3D block_job_create(job_id, &commit_job_driver, bs, 0, BLK_PERM_ALL, + speed, BLOCK_JOB_DEFAULT, NULL, NULL, errp); if (!s) { return; } diff --git a/block/mirror.c b/block/mirror.c index 630e5ef..22680d7 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -983,8 +983,9 @@ static void mirror_start_job(const char *job_id, BlockD= riverState *bs, buf_size =3D DEFAULT_MIRROR_BUF_SIZE; } =20 - s =3D block_job_create(job_id, driver, bs, speed, creation_flags, - cb, opaque, errp); + /* FIXME Use real permissions */ + s =3D block_job_create(job_id, driver, bs, 0, BLK_PERM_ALL, speed, + creation_flags, cb, opaque, errp); if (!s) { return; } diff --git a/block/stream.c b/block/stream.c index 1523ba7..7f49279 100644 --- a/block/stream.c +++ b/block/stream.c @@ -229,8 +229,9 @@ void stream_start(const char *job_id, BlockDriverState = *bs, BlockDriverState *iter; int orig_bs_flags; =20 - s =3D block_job_create(job_id, &stream_job_driver, bs, speed, - BLOCK_JOB_DEFAULT, NULL, NULL, errp); + /* FIXME Use real permissions */ + s =3D block_job_create(job_id, &stream_job_driver, bs, 0, BLK_PERM_ALL, + speed, BLOCK_JOB_DEFAULT, NULL, NULL, errp); if (!s) { return; } diff --git a/blockjob.c b/blockjob.c index 72b7d4c..27833c7 100644 --- a/blockjob.c +++ b/blockjob.c @@ -123,7 +123,8 @@ void block_job_add_bdrv(BlockJob *job, BlockDriverState= *bs) } =20 void *block_job_create(const char *job_id, const BlockJobDriver *driver, - BlockDriverState *bs, int64_t speed, int flags, + BlockDriverState *bs, uint64_t perm, + uint64_t shared_perm, int64_t speed, int flags, BlockCompletionFunc *cb, void *opaque, Error **errp) { BlockBackend *blk; @@ -160,8 +161,7 @@ void *block_job_create(const char *job_id, const BlockJ= obDriver *driver, } } =20 - /* FIXME Use real permissions */ - blk =3D blk_new(0, BLK_PERM_ALL); + blk =3D blk_new(perm, shared_perm); ret =3D blk_insert_bs(blk, bs, errp); if (ret < 0) { blk_unref(blk); diff --git a/include/block/blockjob_int.h b/include/block/blockjob_int.h index 8223822..3f86cc5 100644 --- a/include/block/blockjob_int.h +++ b/include/block/blockjob_int.h @@ -119,6 +119,7 @@ struct BlockJobDriver { * generated automatically. * @job_type: The class object for the newly-created job. * @bs: The block + * @perm, @shared_perm: Permissions to request for @bs * @speed: The maximum speed, in bytes per second, or 0 for unlimited. * @cb: Completion function for the job. * @opaque: Opaque pointer value passed to @cb. @@ -134,7 +135,8 @@ struct BlockJobDriver { * called from a wrapper that is specific to the job type. */ void *block_job_create(const char *job_id, const BlockJobDriver *driver, - BlockDriverState *bs, int64_t speed, int flags, + BlockDriverState *bs, uint64_t perm, + uint64_t shared_perm, int64_t speed, int flags, BlockCompletionFunc *cb, void *opaque, Error **errp= ); =20 /** diff --git a/tests/test-blockjob-txn.c b/tests/test-blockjob-txn.c index f6dfd08..4ccbda1 100644 --- a/tests/test-blockjob-txn.c +++ b/tests/test-blockjob-txn.c @@ -101,9 +101,9 @@ static BlockJob *test_block_job_start(unsigned int iter= ations, g_assert_nonnull(bs); =20 snprintf(job_id, sizeof(job_id), "job%u", counter++); - s =3D block_job_create(job_id, &test_block_job_driver, bs, 0, - BLOCK_JOB_DEFAULT, test_block_job_cb, - data, &error_abort); + s =3D block_job_create(job_id, &test_block_job_driver, bs, + 0, BLK_PERM_ALL, 0, BLOCK_JOB_DEFAULT, + test_block_job_cb, data, &error_abort); s->iterations =3D iterations; s->use_timer =3D use_timer; s->rc =3D rc; diff --git a/tests/test-blockjob.c b/tests/test-blockjob.c index 143ce96..1afe17b 100644 --- a/tests/test-blockjob.c +++ b/tests/test-blockjob.c @@ -30,8 +30,9 @@ static BlockJob *do_test_id(BlockBackend *blk, const char= *id, BlockJob *job; Error *errp =3D NULL; =20 - job =3D block_job_create(id, &test_block_job_driver, blk_bs(blk), 0, - BLOCK_JOB_DEFAULT, block_job_cb, NULL, &errp); + job =3D block_job_create(id, &test_block_job_driver, blk_bs(blk), + 0, BLK_PERM_ALL, 0, BLOCK_JOB_DEFAULT, block_jo= b_cb, + NULL, &errp); if (should_succeed) { g_assert_null(errp); g_assert_nonnull(job); --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487008550257448.71328682455214; Mon, 13 Feb 2017 09:55:50 -0800 (PST) Received: from localhost ([::1]:58541 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKqq-0007wf-Px for importer@patchew.org; Mon, 13 Feb 2017 12:55:48 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59501) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKM7-0003SH-Qh for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:05 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKM6-0006DL-3g for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:03 -0500 Received: from mx1.redhat.com ([209.132.183.28]:38946) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKM1-0006B4-K4; Mon, 13 Feb 2017 12:23:57 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CD32263E0A; Mon, 13 Feb 2017 17:23:57 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3c031842; Mon, 13 Feb 2017 12:23:56 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:44 +0100 Message-Id: <1487006583-24350-23-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Mon, 13 Feb 2017 17:23:57 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 22/41] block: Add BdrvChildRole.get_link_name() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" For meaningful error messages in the permission system, we want to allow the parent of a BdrvChild to generate some kind of human-readable identifier for the link represented by the BdrvChild. Signed-off-by: Kevin Wolf --- block.c | 8 ++++++++ block/block-backend.c | 20 ++++++++++++++++++++ include/block/block_int.h | 4 ++++ 3 files changed, 32 insertions(+) diff --git a/block.c b/block.c index fd06549..2116542 100644 --- a/block.c +++ b/block.c @@ -800,6 +800,13 @@ const BdrvChildRole child_format =3D { .drained_end =3D bdrv_child_cb_drained_end, }; =20 +static char *bdrv_backing_link_name(BdrvChild *c) +{ + BlockDriverState *parent =3D c->opaque; + return g_strdup_printf("backing file link from %s", + bdrv_get_device_or_node_name(parent)); +} + /* * Returns the options and flags that bs->backing should get, based on the * given options and flags for the parent BDS @@ -825,6 +832,7 @@ static void bdrv_backing_options(int *child_flags, QDic= t *child_options, } =20 static const BdrvChildRole child_backing =3D { + .get_link_name =3D bdrv_backing_link_name, .inherit_options =3D bdrv_backing_options, .drained_begin =3D bdrv_child_cb_drained_begin, .drained_end =3D bdrv_child_cb_drained_end, diff --git a/block/block-backend.c b/block/block-backend.c index 0c23add..a314284 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -80,6 +80,7 @@ static const AIOCBInfo block_backend_aiocb_info =3D { =20 static void drive_info_del(DriveInfo *dinfo); static BlockBackend *bdrv_first_blk(BlockDriverState *bs); +static char *blk_get_attached_dev_id(BlockBackend *blk); =20 /* All BlockBackends */ static QTAILQ_HEAD(, BlockBackend) block_backends =3D @@ -102,6 +103,24 @@ static void blk_root_drained_end(BdrvChild *child); static void blk_root_change_media(BdrvChild *child, bool load); static void blk_root_resize(BdrvChild *child); =20 +static char *blk_root_get_link_name(BdrvChild *child) +{ + BlockBackend *blk =3D child->opaque; + char *dev_id; + + if (blk->name) { + return g_strdup(blk->name); + } + + dev_id =3D blk_get_attached_dev_id(blk); + if (*dev_id) { + return dev_id; + } else { + g_free(dev_id); + return g_strdup("a block device"); + } +} + static const char *blk_root_get_name(BdrvChild *child) { return blk_name(child->opaque); @@ -113,6 +132,7 @@ static const BdrvChildRole child_root =3D { .change_media =3D blk_root_change_media, .resize =3D blk_root_resize, .get_name =3D blk_root_get_name, + .get_link_name =3D blk_root_get_link_name, =20 .drained_begin =3D blk_root_drained_begin, .drained_end =3D blk_root_drained_end, diff --git a/include/block/block_int.h b/include/block/block_int.h index 7558f99..a5557b1 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -438,6 +438,10 @@ struct BdrvChildRole { * name), or NULL if the parent can't provide a better name. */ const char* (*get_name)(BdrvChild *child); =20 + /* Returns a malloced name that describes the link from the parent to = the + * child. The caller is responsible for freeing the memory. */ + char* (*get_link_name)(BdrvChild *child); + /* * If this pair of functions is implemented, the parent doesn't issue = new * requests after returning from .drained_begin() until .drained_end()= is --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487009626838170.24255941403908; Mon, 13 Feb 2017 10:13:46 -0800 (PST) Received: from localhost ([::1]:58647 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdL8C-00008q-6z for importer@patchew.org; Mon, 13 Feb 2017 13:13:44 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59540) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKM9-0003UH-Fd for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:07 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKM8-0006E1-5P for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:05 -0500 Received: from mx1.redhat.com ([209.132.183.28]:51184) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKM3-0006Be-FT; Mon, 13 Feb 2017 12:23:59 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A85077E9D8; Mon, 13 Feb 2017 17:23:59 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3d031842; Mon, 13 Feb 2017 12:23:58 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:45 +0100 Message-Id: <1487006583-24350-24-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Mon, 13 Feb 2017 17:23:59 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 23/41] block: Include details on permission errors in message X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Instead of just telling that there was some conflict, we can be specific and tell which permissions were in conflict and which way the conflict is. Signed-off-by: Kevin Wolf --- block.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-------= ---- 1 file changed, 55 insertions(+), 11 deletions(-) diff --git a/block.c b/block.c index 2116542..d743f50 100644 --- a/block.c +++ b/block.c @@ -1381,6 +1381,43 @@ static void bdrv_update_perm(BlockDriverState *bs) bdrv_set_perm(bs, cumulative_perms, cumulative_shared_perms); } =20 +static char *bdrv_child_link_name(BdrvChild *c) +{ + if (c->role->get_link_name) { + return c->role->get_link_name(c); + } + + return g_strdup("another user"); +} + +static char *bdrv_perm_names(uint64_t perm) +{ + struct perm_name { + uint64_t perm; + const char *name; + } permissions[] =3D { + { BLK_PERM_CONSISTENT_READ, "consistent read" }, + { BLK_PERM_WRITE, "write" }, + { BLK_PERM_WRITE_UNCHANGED, "write unchanged" }, + { BLK_PERM_RESIZE, "resize" }, + { BLK_PERM_GRAPH_MOD, "change children" }, + { 0, NULL } + }; + + char *result =3D g_strdup(""); + struct perm_name *p; + + for (p =3D permissions; p->name; p++) { + if (perm & p->perm) { + char *old =3D result; + result =3D g_strdup_printf("%s%s%s", old, *old ? ", " : "", p-= >name); + g_free(old); + } + } + + return result; +} + static int bdrv_check_update_perm(BlockDriverState *bs, uint64_t new_used_= perm, uint64_t new_shared_perm, BdrvChild *ignore_child, Error **errp) @@ -1397,17 +1434,24 @@ static int bdrv_check_update_perm(BlockDriverState = *bs, uint64_t new_used_perm, continue; } =20 - if ((new_used_perm & c->shared_perm) !=3D new_used_perm || - (c->perm & new_shared_perm) !=3D c->perm) - { - const char *user =3D NULL; - if (c->role->get_name) { - user =3D c->role->get_name(c); - if (user && !*user) { - user =3D NULL; - } - } - error_setg(errp, "Conflicts with %s", user ?: "another operati= on"); + if ((new_used_perm & c->shared_perm) !=3D new_used_perm) { + char *link =3D bdrv_child_link_name(c); + char *perm_names =3D bdrv_perm_names(new_used_perm & ~c->share= d_perm); + error_setg(errp, "Conflicts with %s, which does not allow '%s'= " + "on %s", + link, perm_names, bdrv_get_node_name(c->bs)); + g_free(link); + g_free(perm_names); + return -EPERM; + } + + if ((c->perm & new_shared_perm) !=3D c->perm) { + char *link =3D bdrv_child_link_name(c); + char *perm_names =3D bdrv_perm_names(c->perm & ~new_shared_per= m); + error_setg(errp, "Conflicts with %s, which uses '%s' on %s", + link, perm_names, bdrv_get_node_name(c->bs)); + g_free(link); + g_free(perm_names); return -EPERM; } =20 --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487008117427822.882691925392; Mon, 13 Feb 2017 09:48:37 -0800 (PST) Received: from localhost ([::1]:58492 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKjr-0001G9-Qd for importer@patchew.org; Mon, 13 Feb 2017 12:48:35 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59552) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKMA-0003V6-0s for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:07 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKM8-0006EG-Ml for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:06 -0500 Received: from mx1.redhat.com ([209.132.183.28]:59366) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKM5-0006CW-Jj; Mon, 13 Feb 2017 12:24:01 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 786EE81236; Mon, 13 Feb 2017 17:24:01 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3e031842; Mon, 13 Feb 2017 12:23:59 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:46 +0100 Message-Id: <1487006583-24350-25-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Mon, 13 Feb 2017 17:24:01 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 24/41] block: Add BdrvChildRole.stay_at_node X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" When the parents' child links are updated in bdrv_append() or bdrv_replace_in_backing_chain(), this should affect all child links of BlockBackends or other nodes, but not on child links held for other purposes (like for setting permissions). This patch allows to control the behaviour per BdrvChildRole. Signed-off-by: Kevin Wolf --- block.c | 3 +++ include/block/block_int.h | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/block.c b/block.c index d743f50..842ac78 100644 --- a/block.c +++ b/block.c @@ -2713,6 +2713,9 @@ static void change_parent_backing_link(BlockDriverSta= te *from, BdrvChild *c, *next, *to_c; =20 QLIST_FOREACH_SAFE(c, &from->parents, next_parent, next) { + if (c->role->stay_at_node) { + continue; + } if (c->role =3D=3D &child_backing) { /* @from is generally not allowed to be a backing file, except= for * when @to is the overlay. In that case, @from may not be rep= laced diff --git a/include/block/block_int.h b/include/block/block_int.h index a5557b1..b24fc49 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -427,6 +427,10 @@ typedef struct BdrvAioNotifier { } BdrvAioNotifier; =20 struct BdrvChildRole { + /* If true, bdrv_replace_in_backing_chain() doesn't change the node th= is + * BdrvChild points to. */ + bool stay_at_node; + void (*inherit_options)(int *child_flags, QDict *child_options, int parent_flags, QDict *parent_options); =20 --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487008806183441.1722954137475; Mon, 13 Feb 2017 10:00:06 -0800 (PST) Received: from localhost ([::1]:58560 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKuy-0003ln-T8 for importer@patchew.org; Mon, 13 Feb 2017 13:00:04 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59589) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKMC-0003Y0-CO for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:10 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKMA-0006F6-Ph for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:08 -0500 Received: from mx1.redhat.com ([209.132.183.28]:59368) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKM7-0006Dc-C6; Mon, 13 Feb 2017 12:24:03 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5019F81236; Mon, 13 Feb 2017 17:24:03 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3f031842; Mon, 13 Feb 2017 12:24:01 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:47 +0100 Message-Id: <1487006583-24350-26-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Mon, 13 Feb 2017 17:24:03 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 25/41] blockjob: Add permissions to block_job_add_bdrv() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Block jobs don't actually do I/O through the the reference they create with block_job_add_bdrv(), but they might want to use the permisssion system to express what the block job does to intermediate nodes. This adds permissions to block_job_add_bdrv() to provide the means to request permissions. Signed-off-by: Kevin Wolf --- block/backup.c | 3 ++- block/commit.c | 7 +++++-- block/mirror.c | 7 +++++-- block/stream.c | 3 ++- blockjob.c | 27 +++++++++++++++++++++------ include/block/blockjob.h | 4 +++- 6 files changed, 38 insertions(+), 13 deletions(-) diff --git a/block/backup.c b/block/backup.c index 12ab25c..22171f4 100644 --- a/block/backup.c +++ b/block/backup.c @@ -657,7 +657,8 @@ BlockJob *backup_job_create(const char *job_id, BlockDr= iverState *bs, job->cluster_size =3D MAX(BACKUP_CLUSTER_SIZE_DEFAULT, bdi.cluster= _size); } =20 - block_job_add_bdrv(&job->common, target); + /* FIXME Use real permissions */ + block_job_add_bdrv(&job->common, target, 0, BLK_PERM_ALL, &error_abort= ); job->common.len =3D len; block_job_txn_add_job(txn, &job->common); =20 diff --git a/block/commit.c b/block/commit.c index 60d29a9..68fa2a4 100644 --- a/block/commit.c +++ b/block/commit.c @@ -267,13 +267,16 @@ void commit_start(const char *job_id, BlockDriverStat= e *bs, * disappear from the chain after this operation. */ assert(bdrv_chain_contains(top, base)); for (iter =3D top; iter !=3D backing_bs(base); iter =3D backing_bs(ite= r)) { - block_job_add_bdrv(&s->common, iter); + /* FIXME Use real permissions */ + block_job_add_bdrv(&s->common, iter, 0, BLK_PERM_ALL, &error_abort= ); } /* overlay_bs must be blocked because it needs to be modified to * update the backing image string, but if it's the root node then * don't block it again */ if (bs !=3D overlay_bs) { - block_job_add_bdrv(&s->common, overlay_bs); + /* FIXME Use real permissions */ + block_job_add_bdrv(&s->common, overlay_bs, 0, BLK_PERM_ALL, + &error_abort); } =20 /* FIXME Use real permissions */ diff --git a/block/mirror.c b/block/mirror.c index 22680d7..9532b18 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -1020,13 +1020,16 @@ static void mirror_start_job(const char *job_id, Bl= ockDriverState *bs, return; } =20 - block_job_add_bdrv(&s->common, target); + /* FIXME Use real permissions */ + block_job_add_bdrv(&s->common, target, 0, BLK_PERM_ALL, &error_abort); + /* In commit_active_start() all intermediate nodes disappear, so * any jobs in them must be blocked */ if (bdrv_chain_contains(bs, target)) { BlockDriverState *iter; for (iter =3D backing_bs(bs); iter !=3D target; iter =3D backing_b= s(iter)) { - block_job_add_bdrv(&s->common, iter); + /* FIXME Use real permissions */ + block_job_add_bdrv(&s->common, iter, 0, BLK_PERM_ALL, &error_a= bort); } } =20 diff --git a/block/stream.c b/block/stream.c index 7f49279..47f0ffb 100644 --- a/block/stream.c +++ b/block/stream.c @@ -248,7 +248,8 @@ void stream_start(const char *job_id, BlockDriverState = *bs, /* Block all intermediate nodes between bs and base, because they * will disappear from the chain after this operation */ for (iter =3D backing_bs(bs); iter && iter !=3D base; iter =3D backing= _bs(iter)) { - block_job_add_bdrv(&s->common, iter); + /* FIXME Use real permissions */ + block_job_add_bdrv(&s->common, iter, 0, BLK_PERM_ALL, &error_abort= ); } =20 s->base =3D base; diff --git a/blockjob.c b/blockjob.c index 27833c7..0bcc099 100644 --- a/blockjob.c +++ b/blockjob.c @@ -55,6 +55,10 @@ struct BlockJobTxn { =20 static QLIST_HEAD(, BlockJob) block_jobs =3D QLIST_HEAD_INITIALIZER(block_= jobs); =20 +static const BdrvChildRole child_job =3D { + .stay_at_node =3D true, +}; + BlockJob *block_job_next(BlockJob *job) { if (!job) { @@ -115,11 +119,22 @@ static void block_job_detach_aio_context(void *opaque) block_job_unref(job); } =20 -void block_job_add_bdrv(BlockJob *job, BlockDriverState *bs) +int block_job_add_bdrv(BlockJob *job, BlockDriverState *bs, + uint64_t perm, uint64_t shared_perm, Error **errp) { - job->nodes =3D g_slist_prepend(job->nodes, bs); + BdrvChild *c; + + c =3D bdrv_root_attach_child(bs, "job", &child_job, perm, shared_perm, + NULL, errp); + if (c =3D=3D NULL) { + return -EPERM; + } + + job->nodes =3D g_slist_prepend(job->nodes, c); bdrv_ref(bs); bdrv_op_block_all(bs, job->blocker); + + return 0; } =20 void *block_job_create(const char *job_id, const BlockJobDriver *driver, @@ -171,7 +186,7 @@ void *block_job_create(const char *job_id, const BlockJ= obDriver *driver, job =3D g_malloc0(driver->instance_size); error_setg(&job->blocker, "block device is in use by block job: %s", BlockJobType_lookup[driver->job_type]); - block_job_add_bdrv(job, bs); + block_job_add_bdrv(job, bs, 0, BLK_PERM_ALL, &error_abort); bdrv_op_unblock(bs, BLOCK_OP_TYPE_DATAPLANE, job->blocker); =20 job->driver =3D driver; @@ -238,9 +253,9 @@ void block_job_unref(BlockJob *job) BlockDriverState *bs =3D blk_bs(job->blk); bs->job =3D NULL; for (l =3D job->nodes; l; l =3D l->next) { - bs =3D l->data; - bdrv_op_unblock_all(bs, job->blocker); - bdrv_unref(bs); + BdrvChild *c =3D l->data; + bdrv_op_unblock_all(c->bs, job->blocker); + bdrv_root_unref_child(c); } g_slist_free(job->nodes); blk_remove_aio_context_notifier(job->blk, diff --git a/include/block/blockjob.h b/include/block/blockjob.h index 1acb256..b0b1134 100644 --- a/include/block/blockjob.h +++ b/include/block/blockjob.h @@ -170,12 +170,14 @@ BlockJob *block_job_get(const char *id); * block_job_add_bdrv: * @job: A block job * @bs: A BlockDriverState that is involved in @job + * @perm, @shared_perm: Permissions to request on the node * * Add @bs to the list of BlockDriverState that are involved in * @job. This means that all operations will be blocked on @bs while * @job exists. */ -void block_job_add_bdrv(BlockJob *job, BlockDriverState *bs); +int block_job_add_bdrv(BlockJob *job, BlockDriverState *bs, + uint64_t perm, uint64_t shared_perm, Error **errp); =20 /** * block_job_set_speed: --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487009903437710.6243269518852; Mon, 13 Feb 2017 10:18:23 -0800 (PST) Received: from localhost ([::1]:58697 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdLCf-000452-5D for importer@patchew.org; Mon, 13 Feb 2017 13:18:21 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59607) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKME-0003a5-5M for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:11 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKMC-0006Fa-FZ for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:10 -0500 Received: from mx1.redhat.com ([209.132.183.28]:50322) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKM9-0006E9-0A; Mon, 13 Feb 2017 12:24:05 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2BA833B703; Mon, 13 Feb 2017 17:24:05 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3g031842; Mon, 13 Feb 2017 12:24:03 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:48 +0100 Message-Id: <1487006583-24350-27-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Mon, 13 Feb 2017 17:24:05 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 26/41] block: Factor out bdrv_open_driver() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This is a function that doesn't do any option parsing, but just does some basic BlockDriverState setup and calls the .bdrv_open() function of the block driver. Signed-off-by: Kevin Wolf --- block.c | 112 +++++++++++++++++++++++++++++++++++++-----------------------= ---- 1 file changed, 65 insertions(+), 47 deletions(-) diff --git a/block.c b/block.c index 842ac78..9c80cba 100644 --- a/block.c +++ b/block.c @@ -934,6 +934,67 @@ out: g_free(gen_node_name); } =20 +static int bdrv_open_driver(BlockDriverState *bs, BlockDriver *drv, + const char *node_name, QDict *options, + int open_flags, Error **errp) +{ + Error *local_err =3D NULL; + int ret; + + bdrv_assign_node_name(bs, node_name, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return -EINVAL; + } + + bs->drv =3D drv; + bs->opaque =3D g_malloc0(drv->instance_size); + + if (drv->bdrv_file_open) { + assert(!drv->bdrv_needs_filename || bs->filename[0]); + ret =3D drv->bdrv_file_open(bs, options, open_flags, &local_err); + } else { + ret =3D drv->bdrv_open(bs, options, open_flags, &local_err); + } + + if (ret < 0) { + if (local_err) { + error_propagate(errp, local_err); + } else if (bs->filename[0]) { + error_setg_errno(errp, -ret, "Could not open '%s'", bs->filena= me); + } else { + error_setg_errno(errp, -ret, "Could not open image"); + } + goto free_and_fail; + } + + ret =3D refresh_total_sectors(bs, bs->total_sectors); + if (ret < 0) { + error_setg_errno(errp, -ret, "Could not refresh total sector count= "); + goto free_and_fail; + } + + bdrv_refresh_limits(bs, &local_err); + if (local_err) { + error_propagate(errp, local_err); + ret =3D -EINVAL; + goto free_and_fail; + } + + assert(bdrv_opt_mem_align(bs) !=3D 0); + assert(bdrv_min_mem_align(bs) !=3D 0); + assert(is_power_of_2(bs->bl.request_alignment)); + + return 0; + +free_and_fail: + /* FIXME Close bs first if already opened*/ + g_free(bs->opaque); + bs->opaque =3D NULL; + bs->drv =3D NULL; + return ret; +} + QemuOptsList bdrv_runtime_opts =3D { .name =3D "bdrv_common", .head =3D QTAILQ_HEAD_INITIALIZER(bdrv_runtime_opts.head), @@ -1028,14 +1089,6 @@ static int bdrv_open_common(BlockDriverState *bs, Bd= rvChild *file, trace_bdrv_open_common(bs, filename ?: "", bs->open_flags, drv->format_name); =20 - node_name =3D qemu_opt_get(opts, "node-name"); - bdrv_assign_node_name(bs, node_name, &local_err); - if (local_err) { - error_propagate(errp, local_err); - ret =3D -EINVAL; - goto fail_opts; - } - bs->read_only =3D !(bs->open_flags & BDRV_O_RDWR); =20 if (use_bdrv_whitelist && !bdrv_is_whitelisted(drv, bs->read_only)) { @@ -1101,54 +1154,19 @@ static int bdrv_open_common(BlockDriverState *bs, B= drvChild *file, } pstrcpy(bs->exact_filename, sizeof(bs->exact_filename), bs->filename); =20 - bs->drv =3D drv; - bs->opaque =3D g_malloc0(drv->instance_size); - /* Open the image, either directly or using a protocol */ open_flags =3D bdrv_open_flags(bs, bs->open_flags); - if (drv->bdrv_file_open) { - assert(file =3D=3D NULL); - assert(!drv->bdrv_needs_filename || filename !=3D NULL); - ret =3D drv->bdrv_file_open(bs, options, open_flags, &local_err); - } else { - ret =3D drv->bdrv_open(bs, options, open_flags, &local_err); - } - - if (ret < 0) { - if (local_err) { - error_propagate(errp, local_err); - } else if (bs->filename[0]) { - error_setg_errno(errp, -ret, "Could not open '%s'", bs->filena= me); - } else { - error_setg_errno(errp, -ret, "Could not open image"); - } - goto free_and_fail; - } + node_name =3D qemu_opt_get(opts, "node-name"); =20 - ret =3D refresh_total_sectors(bs, bs->total_sectors); + assert(!drv->bdrv_file_open || file =3D=3D NULL); + ret =3D bdrv_open_driver(bs, drv, node_name, options, open_flags, errp= ); if (ret < 0) { - error_setg_errno(errp, -ret, "Could not refresh total sector count= "); - goto free_and_fail; - } - - bdrv_refresh_limits(bs, &local_err); - if (local_err) { - error_propagate(errp, local_err); - ret =3D -EINVAL; - goto free_and_fail; + goto fail_opts; } =20 - assert(bdrv_opt_mem_align(bs) !=3D 0); - assert(bdrv_min_mem_align(bs) !=3D 0); - assert(is_power_of_2(bs->bl.request_alignment)); - qemu_opts_del(opts); return 0; =20 -free_and_fail: - g_free(bs->opaque); - bs->opaque =3D NULL; - bs->drv =3D NULL; fail_opts: qemu_opts_del(opts); return ret; --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487010190670709.9213629817707; Mon, 13 Feb 2017 10:23:10 -0800 (PST) Received: from localhost ([::1]:58728 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdLHH-0000cI-ET for importer@patchew.org; Mon, 13 Feb 2017 13:23:07 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59646) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKMG-0003e3-QT for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:14 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKMF-0006I9-F2 for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:12 -0500 Received: from mx1.redhat.com ([209.132.183.28]:39010) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKMA-0006Er-SU; Mon, 13 Feb 2017 12:24:06 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 11C9063E0A; Mon, 13 Feb 2017 17:24:07 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3h031842; Mon, 13 Feb 2017 12:24:05 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:49 +0100 Message-Id: <1487006583-24350-28-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Mon, 13 Feb 2017 17:24:07 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 27/41] block: Add bdrv_new_open_driver() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This function allows to create more or less normal BlockDriverStates even for BlockDrivers that aren't globally registered (e.g. helper filters for block jobs). Signed-off-by: Kevin Wolf --- block.c | 31 ++++++++++++++++++++++++++++++- include/block/block.h | 2 ++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/block.c b/block.c index 9c80cba..7d84d43 100644 --- a/block.c +++ b/block.c @@ -948,13 +948,16 @@ static int bdrv_open_driver(BlockDriverState *bs, Blo= ckDriver *drv, } =20 bs->drv =3D drv; + bs->read_only =3D !(bs->open_flags & BDRV_O_RDWR); bs->opaque =3D g_malloc0(drv->instance_size); =20 if (drv->bdrv_file_open) { assert(!drv->bdrv_needs_filename || bs->filename[0]); ret =3D drv->bdrv_file_open(bs, options, open_flags, &local_err); - } else { + } else if (drv->bdrv_open) { ret =3D drv->bdrv_open(bs, options, open_flags, &local_err); + } else { + ret =3D 0; } =20 if (ret < 0) { @@ -995,6 +998,32 @@ free_and_fail: return ret; } =20 +int bdrv_new_open_driver(BlockDriver *drv, BlockDriverState **result, + const char *node_name, int flags, Error **errp) +{ + BlockDriverState *bs; + int ret; + + bs =3D bdrv_new(); + bs->open_flags =3D flags; + bs->explicit_options =3D qdict_new(); + bs->options =3D qdict_new(); + bs->opaque =3D NULL; + + update_options_from_flags(bs->options, flags); + + ret =3D bdrv_open_driver(bs, drv, node_name, bs->options, flags, errp); + if (ret < 0) { + QDECREF(bs->explicit_options); + QDECREF(bs->options); + bdrv_unref(bs); + return ret; + } + + *result =3D bs; + return 0; +} + QemuOptsList bdrv_runtime_opts =3D { .name =3D "bdrv_common", .head =3D QTAILQ_HEAD_INITIALIZER(bdrv_runtime_opts.head), diff --git a/include/block/block.h b/include/block/block.h index 93812df..3238850 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -215,6 +215,8 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict = *parent_options, const char *bdref_key, Error **errp); BlockDriverState *bdrv_open(const char *filename, const char *reference, QDict *options, int flags, Error **errp); +int bdrv_new_open_driver(BlockDriver *drv, BlockDriverState **result, + const char *node_name, int flags, Error **errp); BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue *bs_queue, BlockDriverState *bs, QDict *options, int flags); --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 148700909522546.56089011867607; Mon, 13 Feb 2017 10:04:55 -0800 (PST) Received: from localhost ([::1]:58591 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKza-0008D1-RJ for importer@patchew.org; Mon, 13 Feb 2017 13:04:50 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59665) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKMH-0003f5-Ta for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:20 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKMG-0006IO-6V for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:13 -0500 Received: from mx1.redhat.com ([209.132.183.28]:59426) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKMC-0006FK-Gp; Mon, 13 Feb 2017 12:24:08 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B265481245; Mon, 13 Feb 2017 17:24:08 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3i031842; Mon, 13 Feb 2017 12:24:07 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:50 +0100 Message-Id: <1487006583-24350-29-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Mon, 13 Feb 2017 17:24:08 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 28/41] commit: Use real permissions in commit block job X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This is probably one of the most interesting conversions to the new op blocker system because a commit block job intentionally leaves some intermediate block nodes in the backing chain that aren't valid on their own any more; only the whole chain together results in a valid view. In order to provide the 'consistent read' permission to the parents of the 'top' node of the commit job, a new filter block driver is inserted above 'top' which doesn't require 'consistent read' on its backing chain. Subsequently, the commit job can block 'consistent read' on all intermediate nodes without causing a conflict. Signed-off-by: Kevin Wolf --- block/commit.c | 105 ++++++++++++++++++++++++++++++++++++++++++++++++-----= ---- 1 file changed, 89 insertions(+), 16 deletions(-) diff --git a/block/commit.c b/block/commit.c index 68fa2a4..49ffddb 100644 --- a/block/commit.c +++ b/block/commit.c @@ -36,6 +36,7 @@ typedef struct CommitBlockJob { BlockJob common; RateLimit limit; BlockDriverState *active; + BlockDriverState *commit_top_bs; BlockBackend *top; BlockBackend *base; BlockdevOnError on_error; @@ -83,12 +84,19 @@ static void commit_complete(BlockJob *job, void *opaque) BlockDriverState *active =3D s->active; BlockDriverState *top =3D blk_bs(s->top); BlockDriverState *base =3D blk_bs(s->base); - BlockDriverState *overlay_bs =3D bdrv_find_overlay(active, top); + BlockDriverState *overlay_bs =3D bdrv_find_overlay(active, s->commit_t= op_bs); int ret =3D data->ret; + bool remove_commit_top_bs =3D false; =20 if (!block_job_is_cancelled(&s->common) && ret =3D=3D 0) { /* success */ - ret =3D bdrv_drop_intermediate(active, top, base, s->backing_file_= str); + ret =3D bdrv_drop_intermediate(active, s->commit_top_bs, base, + s->backing_file_str); + } else if (overlay_bs) { + /* XXX Can (or should) we somehow keep 'consistent read' blocked e= ven + * after the failed/cancelled commit job is gone? If we already wr= ote + * something to base, the intermediate images aren't valid any mor= e. */ + remove_commit_top_bs =3D true; } =20 /* restore base open flags here if appropriate (e.g., change the base = back @@ -105,6 +113,13 @@ static void commit_complete(BlockJob *job, void *opaqu= e) blk_unref(s->base); block_job_completed(&s->common, ret); g_free(data); + + /* If bdrv_drop_intermediate() didn't already do that, remove the comm= it + * filter driver from the backing chain. Do this as the final step so = that + * the 'consistent read' permission can be granted. */ + if (remove_commit_top_bs) { + bdrv_set_backing_hd(overlay_bs, top); + } } =20 static void coroutine_fn commit_run(void *opaque) @@ -208,6 +223,34 @@ static const BlockJobDriver commit_job_driver =3D { .start =3D commit_run, }; =20 +static int coroutine_fn bdrv_commit_top_preadv(BlockDriverState *bs, + uint64_t offset, uint64_t bytes, QEMUIOVector *qiov, int flags) +{ + return bdrv_co_preadv(bs->backing, offset, bytes, qiov, flags); +} + +static void bdrv_commit_top_close(BlockDriverState *bs) +{ +} + +static void bdrv_commit_top_child_perm(BlockDriverState *bs, BdrvChild *c, + const BdrvChildRole *role, + uint64_t perm, uint64_t shared, + uint64_t *nperm, uint64_t *nshared) +{ + *nperm =3D 0; + *nshared =3D BLK_PERM_ALL; +} + +/* Dummy node that provides consistent read to its users without requiring= it + * from its backing file and that allows writes on the backing file chain.= */ +static BlockDriver bdrv_commit_top =3D { + .format_name =3D "commit_top", + .bdrv_co_preadv =3D bdrv_commit_top_preadv, + .bdrv_close =3D bdrv_commit_top_close, + .bdrv_child_perm =3D bdrv_commit_top_child_perm, +}; + void commit_start(const char *job_id, BlockDriverState *bs, BlockDriverState *base, BlockDriverState *top, int64_t s= peed, BlockdevOnError on_error, const char *backing_file_str, @@ -219,6 +262,7 @@ void commit_start(const char *job_id, BlockDriverState = *bs, int orig_base_flags; BlockDriverState *iter; BlockDriverState *overlay_bs; + BlockDriverState *commit_top_bs; Error *local_err =3D NULL; int ret; =20 @@ -235,7 +279,6 @@ void commit_start(const char *job_id, BlockDriverState = *bs, return; } =20 - /* FIXME Use real permissions */ s =3D block_job_create(job_id, &commit_job_driver, bs, 0, BLK_PERM_ALL, speed, BLOCK_JOB_DEFAULT, NULL, NULL, errp); if (!s) { @@ -262,33 +305,60 @@ void commit_start(const char *job_id, BlockDriverStat= e *bs, } } =20 + /* Insert commit_top block node above top, so we can block consistent = read + * on the backing chain below it */ + ret =3D bdrv_new_open_driver(&bdrv_commit_top, &commit_top_bs, NULL, + BDRV_O_RDWR, errp); + if (ret < 0) { + goto fail; + } + + bdrv_set_backing_hd(commit_top_bs, top); + bdrv_set_backing_hd(overlay_bs, commit_top_bs); + + s->commit_top_bs =3D commit_top_bs; + bdrv_unref(commit_top_bs); =20 /* Block all nodes between top and base, because they will * disappear from the chain after this operation. */ assert(bdrv_chain_contains(top, base)); - for (iter =3D top; iter !=3D backing_bs(base); iter =3D backing_bs(ite= r)) { - /* FIXME Use real permissions */ - block_job_add_bdrv(&s->common, iter, 0, BLK_PERM_ALL, &error_abort= ); + for (iter =3D top; iter !=3D base; iter =3D backing_bs(iter)) { + /* XXX BLK_PERM_WRITE needs to be allowed so we don't block oursel= ves + * at s->base. The other options would be a second filter driver a= bove + * s->base. */ + ret =3D block_job_add_bdrv(&s->common, iter, 0, + BLK_PERM_WRITE_UNCHANGED | BLK_PERM_WRITE, + errp); + if (ret < 0) { + goto fail; + } + } + + ret =3D block_job_add_bdrv(&s->common, base, 0, BLK_PERM_ALL, errp); + if (ret < 0) { + goto fail; } + /* overlay_bs must be blocked because it needs to be modified to - * update the backing image string, but if it's the root node then - * don't block it again */ - if (bs !=3D overlay_bs) { - /* FIXME Use real permissions */ - block_job_add_bdrv(&s->common, overlay_bs, 0, BLK_PERM_ALL, - &error_abort); + * update the backing image string. */ + ret =3D block_job_add_bdrv(&s->common, overlay_bs, BLK_PERM_GRAPH_MOD, + BLK_PERM_ALL, errp); + if (ret < 0) { + goto fail; } =20 - /* FIXME Use real permissions */ - s->base =3D blk_new(0, BLK_PERM_ALL); + s->base =3D blk_new(BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE, + BLK_PERM_CONSISTENT_READ + | BLK_PERM_GRAPH_MOD + | BLK_PERM_WRITE_UNCHANGED); ret =3D blk_insert_bs(s->base, base, errp); if (ret < 0) { goto fail; } =20 - /* FIXME Use real permissions */ + /* Required permissions are already taken with block_job_add_bdrv() */ s->top =3D blk_new(0, BLK_PERM_ALL); - ret =3D blk_insert_bs(s->top, top, errp); + blk_insert_bs(s->top, top, errp); if (ret < 0) { goto fail; } @@ -313,6 +383,9 @@ fail: if (s->top) { blk_unref(s->top); } + if (commit_top_bs) { + bdrv_set_backing_hd(overlay_bs, top); + } block_job_unref(&s->common); } =20 --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487010224377761.4978265562094; Mon, 13 Feb 2017 10:23:44 -0800 (PST) Received: from localhost ([::1]:58730 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdLHp-00015j-Rg for importer@patchew.org; Mon, 13 Feb 2017 13:23:41 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59675) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKMI-0003hD-N1 for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:16 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKMH-0006J5-AY for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:14 -0500 Received: from mx1.redhat.com ([209.132.183.28]:53114) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKME-0006Fm-BZ; Mon, 13 Feb 2017 12:24:10 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8954DC04B332; Mon, 13 Feb 2017 17:24:10 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3j031842; Mon, 13 Feb 2017 12:24:08 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:51 +0100 Message-Id: <1487006583-24350-30-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 13 Feb 2017 17:24:10 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 29/41] commit: Use real permissions for HMP 'commit' X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This is a little simpler than the commit block job because it's synchronous and only commits into the immediate backing file, but otherwise doing more or less the same. Signed-off-by: Kevin Wolf --- block/commit.c | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/block/commit.c b/block/commit.c index 49ffddb..581d161 100644 --- a/block/commit.c +++ b/block/commit.c @@ -396,11 +396,14 @@ fail: int bdrv_commit(BlockDriverState *bs) { BlockBackend *src, *backing; + BlockDriverState *backing_file_bs =3D NULL; + BlockDriverState *commit_top_bs =3D NULL; BlockDriver *drv =3D bs->drv; int64_t sector, total_sectors, length, backing_length; int n, ro, open_flags; int ret =3D 0; uint8_t *buf =3D NULL; + Error *local_err =3D NULL; =20 if (!drv) return -ENOMEDIUM; @@ -423,17 +426,31 @@ int bdrv_commit(BlockDriverState *bs) } } =20 - /* FIXME Use real permissions */ - src =3D blk_new(0, BLK_PERM_ALL); - backing =3D blk_new(0, BLK_PERM_ALL); + src =3D blk_new(BLK_PERM_CONSISTENT_READ, BLK_PERM_ALL); + backing =3D blk_new(BLK_PERM_WRITE, BLK_PERM_ALL); + + ret =3D blk_insert_bs(src, bs, &local_err); + if (ret < 0) { + error_report_err(local_err); + goto ro_cleanup; + } + + /* Insert commit_top block node above backing, so we can write to it */ + backing_file_bs =3D backing_bs(bs); =20 - ret =3D blk_insert_bs(src, bs, NULL); + ret =3D bdrv_new_open_driver(&bdrv_commit_top, &commit_top_bs, NULL, + BDRV_O_RDWR, &local_err); if (ret < 0) { + error_report_err(local_err); goto ro_cleanup; } =20 - ret =3D blk_insert_bs(backing, bs->backing->bs, NULL); + bdrv_set_backing_hd(commit_top_bs, backing_file_bs); + bdrv_set_backing_hd(bs, commit_top_bs); + + ret =3D blk_insert_bs(backing, backing_file_bs, &local_err); if (ret < 0) { + error_report_err(local_err); goto ro_cleanup; } =20 @@ -507,6 +524,10 @@ int bdrv_commit(BlockDriverState *bs) ro_cleanup: qemu_vfree(buf); =20 + if (backing_file_bs) { + bdrv_set_backing_hd(bs, backing_file_bs); + } + bdrv_unref(commit_top_bs); blk_unref(src); blk_unref(backing); =20 --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487010744737850.6188700166616; Mon, 13 Feb 2017 10:32:24 -0800 (PST) Received: from localhost ([::1]:58780 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdLQF-0000nq-5B for importer@patchew.org; Mon, 13 Feb 2017 13:32:23 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59757) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKMP-0003oj-HE for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:22 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKMO-0006NQ-6b for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:21 -0500 Received: from mx1.redhat.com ([209.132.183.28]:51260) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKMG-0006IH-Ap; Mon, 13 Feb 2017 12:24:12 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7BCAA7E9F5; Mon, 13 Feb 2017 17:24:12 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3k031842; Mon, 13 Feb 2017 12:24:10 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:52 +0100 Message-Id: <1487006583-24350-31-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Mon, 13 Feb 2017 17:24:12 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 30/41] backup: Use real permissions in backup block job X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The backup block job doesn't have very complicated requirements: It needs to read from the source and write to the target, but it's fine with either side being changed. The only restriction is that we can't resize the image because the job uses a cached value. qemu-iotests 055 needs to be changed because it used a target which was already attached to a virtio-blk device. The permission system correctly forbids this (virtio-blk can't accept another writer with its default share-rw=3Doff). Signed-off-by: Kevin Wolf --- block/backup.c | 15 ++++++++++----- tests/qemu-iotests/055 | 11 +++++++---- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/block/backup.c b/block/backup.c index 22171f4..47fadfb 100644 --- a/block/backup.c +++ b/block/backup.c @@ -618,15 +618,20 @@ BlockJob *backup_job_create(const char *job_id, Block= DriverState *bs, goto error; } =20 - /* FIXME Use real permissions */ - job =3D block_job_create(job_id, &backup_job_driver, bs, 0, BLK_PERM_A= LL, + /* job->common.len is fixed, so we can't allow resize */ + job =3D block_job_create(job_id, &backup_job_driver, bs, + BLK_PERM_CONSISTENT_READ, + BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE | + BLK_PERM_WRITE_UNCHANGED | BLK_PERM_GRAPH_MOD, speed, creation_flags, cb, opaque, errp); if (!job) { goto error; } =20 - /* FIXME Use real permissions */ - job->target =3D blk_new(0, BLK_PERM_ALL); + /* The target must match the source in size, so no resize here either = */ + job->target =3D blk_new(BLK_PERM_WRITE, + BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE | + BLK_PERM_WRITE_UNCHANGED | BLK_PERM_GRAPH_MOD); ret =3D blk_insert_bs(job->target, target, errp); if (ret < 0) { goto error; @@ -657,7 +662,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDr= iverState *bs, job->cluster_size =3D MAX(BACKUP_CLUSTER_SIZE_DEFAULT, bdi.cluster= _size); } =20 - /* FIXME Use real permissions */ + /* Required permissions are already taken with target's blk_new() */ block_job_add_bdrv(&job->common, target, 0, BLK_PERM_ALL, &error_abort= ); job->common.len =3D len; block_job_txn_add_job(txn, &job->common); diff --git a/tests/qemu-iotests/055 b/tests/qemu-iotests/055 index 1d3fd04..aafcd24 100755 --- a/tests/qemu-iotests/055 +++ b/tests/qemu-iotests/055 @@ -48,7 +48,8 @@ class TestSingleDrive(iotests.QMPTestCase): def setUp(self): qemu_img('create', '-f', iotests.imgfmt, blockdev_target_img, str(= image_len)) =20 - self.vm =3D iotests.VM().add_drive(test_img).add_drive(blockdev_ta= rget_img) + self.vm =3D iotests.VM().add_drive(test_img) + self.vm.add_drive(blockdev_target_img, interface=3D"none") if iotests.qemu_default_machine =3D=3D 'pc': self.vm.add_drive(None, 'media=3Dcdrom', 'ide') self.vm.launch() @@ -164,7 +165,8 @@ class TestSetSpeed(iotests.QMPTestCase): def setUp(self): qemu_img('create', '-f', iotests.imgfmt, blockdev_target_img, str(= image_len)) =20 - self.vm =3D iotests.VM().add_drive(test_img).add_drive(blockdev_ta= rget_img) + self.vm =3D iotests.VM().add_drive(test_img) + self.vm.add_drive(blockdev_target_img, interface=3D"none") self.vm.launch() =20 def tearDown(self): @@ -247,7 +249,8 @@ class TestSingleTransaction(iotests.QMPTestCase): def setUp(self): qemu_img('create', '-f', iotests.imgfmt, blockdev_target_img, str(= image_len)) =20 - self.vm =3D iotests.VM().add_drive(test_img).add_drive(blockdev_ta= rget_img) + self.vm =3D iotests.VM().add_drive(test_img) + self.vm.add_drive(blockdev_target_img, interface=3D"none") if iotests.qemu_default_machine =3D=3D 'pc': self.vm.add_drive(None, 'media=3Dcdrom', 'ide') self.vm.launch() @@ -460,7 +463,7 @@ class TestDriveCompression(iotests.QMPTestCase): =20 qemu_img('create', '-f', fmt, blockdev_target_img, str(TestDriveCompression.image_len), *args) - self.vm.add_drive(blockdev_target_img, format=3Dfmt) + self.vm.add_drive(blockdev_target_img, format=3Dfmt, interface=3D"= none") =20 self.vm.launch() =20 --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487010482101292.8697811097586; Mon, 13 Feb 2017 10:28:02 -0800 (PST) Received: from localhost ([::1]:58758 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdLM0-0005Wq-OU for importer@patchew.org; Mon, 13 Feb 2017 13:28:00 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59737) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKMO-0003nz-Lh for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKMN-0006Mv-Kl for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:20 -0500 Received: from mx1.redhat.com ([209.132.183.28]:54362) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKMI-0006JE-3b; Mon, 13 Feb 2017 12:24:14 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4018761B85; Mon, 13 Feb 2017 17:24:14 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3l031842; Mon, 13 Feb 2017 12:24:12 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:53 +0100 Message-Id: <1487006583-24350-32-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 13 Feb 2017 17:24:14 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 31/41] block: Fix pending requests check in bdrv_append() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" bdrv_append() cares about isolation of the node that it modifies, but not about activity in some subtree below it. Instead of using the recursive bdrv_requests_pending(), directly check bs->in_flight, which considers only the node in question. Signed-off-by: Kevin Wolf --- block.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/block.c b/block.c index 7d84d43..1e01647 100644 --- a/block.c +++ b/block.c @@ -2802,8 +2802,8 @@ static void change_parent_backing_link(BlockDriverSta= te *from, */ void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top) { - assert(!bdrv_requests_pending(bs_top)); - assert(!bdrv_requests_pending(bs_new)); + assert(!atomic_read(&bs_top->in_flight)); + assert(!atomic_read(&bs_new->in_flight)); =20 bdrv_ref(bs_top); =20 --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487008404847394.9672019677513; Mon, 13 Feb 2017 09:53:24 -0800 (PST) Received: from localhost ([::1]:58521 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKoS-0005lh-Ca for importer@patchew.org; Mon, 13 Feb 2017 12:53:20 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59795) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKMR-0003qW-2n for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:24 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKMP-0006OE-Dd for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:23 -0500 Received: from mx1.redhat.com ([209.132.183.28]:40416) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKMJ-0006KK-V1; Mon, 13 Feb 2017 12:24:16 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1DB41C056800; Mon, 13 Feb 2017 17:24:16 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3m031842; Mon, 13 Feb 2017 12:24:14 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:54 +0100 Message-Id: <1487006583-24350-33-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Mon, 13 Feb 2017 17:24:16 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 32/41] block: BdrvChildRole.attach/detach() callbacks X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Backing files are somewhat special compared to other kinds of children because they are attached and detached using bdrv_set_backing_hd() rather than the normal set of functions, which does a few more things like setting backing blockers, toggling the BDRV_O_NO_BACKING flag, setting parent_bs->backing_file, etc. These special features are a reason why change_parent_backing_link() can't handle backing files yet. With abstracting the additional features into .attach/.detach callbacks, we get a step closer to a function that can actually deal with this. Signed-off-by: Kevin Wolf --- block.c | 94 +++++++++++++++++++++++++++++--------------= ---- include/block/block_int.h | 3 ++ 2 files changed, 62 insertions(+), 35 deletions(-) diff --git a/block.c b/block.c index 1e01647..ff328f1 100644 --- a/block.c +++ b/block.c @@ -800,6 +800,57 @@ const BdrvChildRole child_format =3D { .drained_end =3D bdrv_child_cb_drained_end, }; =20 +static void bdrv_backing_attach(BdrvChild *c) +{ + BlockDriverState *parent =3D c->opaque; + BlockDriverState *backing_hd =3D c->bs; + + assert(!parent->backing_blocker); + error_setg(&parent->backing_blocker, + "node is used as backing hd of '%s'", + bdrv_get_device_or_node_name(parent)); + + parent->open_flags &=3D ~BDRV_O_NO_BACKING; + pstrcpy(parent->backing_file, sizeof(parent->backing_file), + backing_hd->filename); + pstrcpy(parent->backing_format, sizeof(parent->backing_format), + backing_hd->drv ? backing_hd->drv->format_name : ""); + + bdrv_op_block_all(backing_hd, parent->backing_blocker); + /* Otherwise we won't be able to commit or stream */ + bdrv_op_unblock(backing_hd, BLOCK_OP_TYPE_COMMIT_TARGET, + parent->backing_blocker); + bdrv_op_unblock(backing_hd, BLOCK_OP_TYPE_STREAM, + parent->backing_blocker); + /* + * We do backup in 3 ways: + * 1. drive backup + * The target bs is new opened, and the source is top BDS + * 2. blockdev backup + * Both the source and the target are top BDSes. + * 3. internal backup(used for block replication) + * Both the source and the target are backing file + * + * In case 1 and 2, neither the source nor the target is the backing f= ile. + * In case 3, we will block the top BDS, so there is only one block job + * for the top BDS and its backing chain. + */ + bdrv_op_unblock(backing_hd, BLOCK_OP_TYPE_BACKUP_SOURCE, + parent->backing_blocker); + bdrv_op_unblock(backing_hd, BLOCK_OP_TYPE_BACKUP_TARGET, + parent->backing_blocker); +} + +static void bdrv_backing_detach(BdrvChild *c) +{ + BlockDriverState *parent =3D c->opaque; + + assert(parent->backing_blocker); + bdrv_op_unblock_all(c->bs, parent->backing_blocker); + error_free(parent->backing_blocker); + parent->backing_blocker =3D NULL; +} + static char *bdrv_backing_link_name(BdrvChild *c) { BlockDriverState *parent =3D c->opaque; @@ -832,6 +883,8 @@ static void bdrv_backing_options(int *child_flags, QDic= t *child_options, } =20 static const BdrvChildRole child_backing =3D { + .attach =3D bdrv_backing_attach, + .detach =3D bdrv_backing_detach, .get_link_name =3D bdrv_backing_link_name, .inherit_options =3D bdrv_backing_options, .drained_begin =3D bdrv_child_cb_drained_begin, @@ -1606,6 +1659,9 @@ static void bdrv_replace_child(BdrvChild *child, Bloc= kDriverState *new_bs) if (old_bs->quiesce_counter && child->role->drained_end) { child->role->drained_end(child); } + if (child->role->detach) { + child->role->detach(child); + } QLIST_REMOVE(child, next_parent); bdrv_update_perm(old_bs); } @@ -1618,6 +1674,9 @@ static void bdrv_replace_child(BdrvChild *child, Bloc= kDriverState *new_bs) child->role->drained_begin(child); } bdrv_update_perm(new_bs); + if (child->role->attach) { + child->role->attach(child); + } } } =20 @@ -1758,52 +1817,17 @@ void bdrv_set_backing_hd(BlockDriverState *bs, Bloc= kDriverState *backing_hd) } =20 if (bs->backing) { - assert(bs->backing_blocker); - bdrv_op_unblock_all(bs->backing->bs, bs->backing_blocker); bdrv_unref_child(bs, bs->backing); - } else if (backing_hd) { - error_setg(&bs->backing_blocker, - "node is used as backing hd of '%s'", - bdrv_get_device_or_node_name(bs)); } =20 if (!backing_hd) { - error_free(bs->backing_blocker); - bs->backing_blocker =3D NULL; bs->backing =3D NULL; goto out; } /* FIXME Error handling */ bs->backing =3D bdrv_attach_child(bs, backing_hd, "backing", &child_ba= cking, &error_abort); - bs->open_flags &=3D ~BDRV_O_NO_BACKING; - pstrcpy(bs->backing_file, sizeof(bs->backing_file), backing_hd->filena= me); - pstrcpy(bs->backing_format, sizeof(bs->backing_format), - backing_hd->drv ? backing_hd->drv->format_name : ""); =20 - bdrv_op_block_all(backing_hd, bs->backing_blocker); - /* Otherwise we won't be able to commit or stream */ - bdrv_op_unblock(backing_hd, BLOCK_OP_TYPE_COMMIT_TARGET, - bs->backing_blocker); - bdrv_op_unblock(backing_hd, BLOCK_OP_TYPE_STREAM, - bs->backing_blocker); - /* - * We do backup in 3 ways: - * 1. drive backup - * The target bs is new opened, and the source is top BDS - * 2. blockdev backup - * Both the source and the target are top BDSes. - * 3. internal backup(used for block replication) - * Both the source and the target are backing file - * - * In case 1 and 2, neither the source nor the target is the backing f= ile. - * In case 3, we will block the top BDS, so there is only one block job - * for the top BDS and its backing chain. - */ - bdrv_op_unblock(backing_hd, BLOCK_OP_TYPE_BACKUP_SOURCE, - bs->backing_blocker); - bdrv_op_unblock(backing_hd, BLOCK_OP_TYPE_BACKUP_TARGET, - bs->backing_blocker); out: bdrv_refresh_limits(bs, NULL); } diff --git a/include/block/block_int.h b/include/block/block_int.h index b24fc49..d37fcc2 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -456,6 +456,9 @@ struct BdrvChildRole { */ void (*drained_begin)(BdrvChild *child); void (*drained_end)(BdrvChild *child); + + void (*attach)(BdrvChild *child); + void (*detach)(BdrvChild *child); }; =20 extern const BdrvChildRole child_file; --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487010443884769.1279298717559; Mon, 13 Feb 2017 10:27:23 -0800 (PST) Received: from localhost ([::1]:58757 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdLLN-0004PO-DW for importer@patchew.org; Mon, 13 Feb 2017 13:27:21 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59762) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKMP-0003ot-N6 for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:22 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKMO-0006Nn-O2 for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:21 -0500 Received: from mx1.redhat.com ([209.132.183.28]:53160) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKML-0006LL-NH; Mon, 13 Feb 2017 12:24:17 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DA37CC04B937; Mon, 13 Feb 2017 17:24:17 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3n031842; Mon, 13 Feb 2017 12:24:16 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:55 +0100 Message-Id: <1487006583-24350-34-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 13 Feb 2017 17:24:17 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 33/41] block: Allow backing file links in change_parent_backing_link() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Now that the backing file child role implements .attach/.detach callbacks, nothing prevents us from modifying the graph even if that involves changing backing file links. Signed-off-by: Kevin Wolf --- block.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/block.c b/block.c index ff328f1..8224dde 100644 --- a/block.c +++ b/block.c @@ -2788,9 +2788,9 @@ static void change_parent_backing_link(BlockDriverSta= te *from, continue; } if (c->role =3D=3D &child_backing) { - /* @from is generally not allowed to be a backing file, except= for - * when @to is the overlay. In that case, @from may not be rep= laced - * by @to as @to's backing node. */ + /* If @from is a backing file of @to, ignore the child to avoid + * creating a loop. We only want to change the pointer of other + * parents. */ QLIST_FOREACH(to_c, &to->children, next) { if (to_c =3D=3D c) { break; @@ -2801,7 +2801,6 @@ static void change_parent_backing_link(BlockDriverSta= te *from, } } =20 - assert(c->role !=3D &child_backing); bdrv_ref(to); bdrv_replace_child(c, to); bdrv_unref(from); --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487008657535175.19636416963408; Mon, 13 Feb 2017 09:57:37 -0800 (PST) Received: from localhost ([::1]:58547 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKsa-0001Iu-1e for importer@patchew.org; Mon, 13 Feb 2017 12:57:36 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59858) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKMU-0003v9-Tl for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:29 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKMS-0006Qp-NP for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:26 -0500 Received: from mx1.redhat.com ([209.132.183.28]:51326) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKMN-0006MM-Fk; Mon, 13 Feb 2017 12:24:19 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AEB934D685; Mon, 13 Feb 2017 17:24:19 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3o031842; Mon, 13 Feb 2017 12:24:18 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:56 +0100 Message-Id: <1487006583-24350-35-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Mon, 13 Feb 2017 17:24:19 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 34/41] mirror: Use real permissions in mirror/active commit block job X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The mirror block job is mainly used for two different scenarios: Mirroring to an otherwise unused, independent target node, or for active commit where the target node is part of the backing chain of the source. Similarly to the commit block job patch, we need to insert a new filter node to keep the permissions correct during active commit. Note that one change this implies is that job->blk points to mirror_top_bs as its root now, and mirror_top_bs (rather than the actual source node) contains the bs->job pointer. This requires qemu-img commit to get the job by name now rather than just taking bs->job. Signed-off-by: Kevin Wolf --- block/mirror.c | 160 ++++++++++++++++++++++++++++++++++++++---= ---- qemu-img.c | 6 +- tests/qemu-iotests/141 | 2 +- tests/qemu-iotests/141.out | 4 +- 4 files changed, 143 insertions(+), 29 deletions(-) diff --git a/block/mirror.c b/block/mirror.c index 9532b18..50d2585 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -38,7 +38,10 @@ typedef struct MirrorBlockJob { BlockJob common; RateLimit limit; BlockBackend *target; + BlockDriverState *mirror_top_bs; + BlockDriverState *source; BlockDriverState *base; + /* The name of the graph node to replace */ char *replaces; /* The BDS to replace */ @@ -319,7 +322,7 @@ static void mirror_do_zero_or_discard(MirrorBlockJob *s, =20 static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s) { - BlockDriverState *source =3D blk_bs(s->common.blk); + BlockDriverState *source =3D s->source; int64_t sector_num, first_chunk; uint64_t delay_ns =3D 0; /* At least the first dirty chunk is mirrored in one iteration. */ @@ -489,12 +492,14 @@ static void mirror_exit(BlockJob *job, void *opaque) MirrorBlockJob *s =3D container_of(job, MirrorBlockJob, common); MirrorExitData *data =3D opaque; AioContext *replace_aio_context =3D NULL; - BlockDriverState *src =3D blk_bs(s->common.blk); + BlockDriverState *src =3D s->source; BlockDriverState *target_bs =3D blk_bs(s->target); + BlockDriverState *mirror_top_bs =3D s->mirror_top_bs; =20 /* Make sure that the source BDS doesn't go away before we called * block_job_completed(). */ bdrv_ref(src); + bdrv_ref(mirror_top_bs); =20 if (s->to_replace) { replace_aio_context =3D bdrv_get_aio_context(s->to_replace); @@ -516,13 +521,6 @@ static void mirror_exit(BlockJob *job, void *opaque) bdrv_drained_begin(target_bs); bdrv_replace_in_backing_chain(to_replace, target_bs); bdrv_drained_end(target_bs); - - /* We just changed the BDS the job BB refers to, so switch the BB = back - * so the cleanup does the right thing. We don't need any permissi= ons - * any more now. */ - blk_remove_bs(job->blk); - blk_set_perm(job->blk, 0, BLK_PERM_ALL, &error_abort); - blk_insert_bs(job->blk, src, &error_abort); } if (s->to_replace) { bdrv_op_unblock_all(s->to_replace, s->replace_blocker); @@ -535,9 +533,23 @@ static void mirror_exit(BlockJob *job, void *opaque) g_free(s->replaces); blk_unref(s->target); s->target =3D NULL; + + /* Remove the mirror filter driver from the graph */ + bdrv_replace_in_backing_chain(mirror_top_bs, backing_bs(mirror_top_bs)= ); + + /* We just changed the BDS the job BB refers to (with either or both o= f the + * bdrv_replace_in_backing_chain() calls), so switch the BB back so the + * cleanup does the right thing. We don't need any permissions any more + * now. */ + blk_remove_bs(job->blk); + blk_set_perm(job->blk, 0, BLK_PERM_ALL, &error_abort); + blk_insert_bs(job->blk, mirror_top_bs, &error_abort); + block_job_completed(&s->common, data->ret); + g_free(data); bdrv_drained_end(src); + bdrv_unref(mirror_top_bs); bdrv_unref(src); } =20 @@ -557,7 +569,7 @@ static int coroutine_fn mirror_dirty_init(MirrorBlockJo= b *s) { int64_t sector_num, end; BlockDriverState *base =3D s->base; - BlockDriverState *bs =3D blk_bs(s->common.blk); + BlockDriverState *bs =3D s->source; BlockDriverState *target_bs =3D blk_bs(s->target); int ret, n; =20 @@ -636,7 +648,7 @@ static void coroutine_fn mirror_run(void *opaque) { MirrorBlockJob *s =3D opaque; MirrorExitData *data; - BlockDriverState *bs =3D blk_bs(s->common.blk); + BlockDriverState *bs =3D s->source; BlockDriverState *target_bs =3D blk_bs(s->target); bool need_drain =3D true; int64_t length; @@ -849,7 +861,7 @@ static void mirror_complete(BlockJob *job, Error **errp) MirrorBlockJob *s =3D container_of(job, MirrorBlockJob, common); BlockDriverState *src, *target; =20 - src =3D blk_bs(job->blk); + src =3D s->source; target =3D blk_bs(s->target); =20 if (!s->synced) { @@ -881,6 +893,10 @@ static void mirror_complete(BlockJob *job, Error **err= p) replace_aio_context =3D bdrv_get_aio_context(s->to_replace); aio_context_acquire(replace_aio_context); =20 + /* TODO Translate this into permission system. Current definition = of + * GRAPH_MOD would require to request it for the parents; they mig= ht + * not even be BlockDriverStates, however, so a BdrvChild can't ad= dress + * them. May need redefinition of GRAPH_MOD. */ error_setg(&s->replace_blocker, "block device is in use by block-job-complete"); bdrv_op_block_all(s->to_replace, s->replace_blocker); @@ -951,6 +967,46 @@ static const BlockJobDriver commit_active_job_driver = =3D { .drain =3D mirror_drain, }; =20 +static int coroutine_fn bdrv_mirror_top_preadv(BlockDriverState *bs, + uint64_t offset, uint64_t bytes, QEMUIOVector *qiov, int flags) +{ + return bdrv_co_preadv(bs->backing, offset, bytes, qiov, flags); +} + +static int coroutine_fn bdrv_mirror_top_pwritev(BlockDriverState *bs, + uint64_t offset, uint64_t bytes, QEMUIOVector *qiov, int flags) +{ + return bdrv_co_pwritev(bs->backing, offset, bytes, qiov, flags); +} + +static void bdrv_mirror_top_close(BlockDriverState *bs) +{ +} + +static void bdrv_mirror_top_child_perm(BlockDriverState *bs, BdrvChild *c, + const BdrvChildRole *role, + uint64_t perm, uint64_t shared, + uint64_t *nperm, uint64_t *nshared) +{ + /* Must be able to forward guest writes to the real image */ + *nperm =3D 0; + if (perm & BLK_PERM_WRITE) { + *nperm |=3D BLK_PERM_WRITE; + } + + *nshared =3D BLK_PERM_ALL; +} + +/* Dummy node that provides consistent read to its users without requiring= it + * from its backing file and that allows writes on the backing file chain.= */ +static BlockDriver bdrv_mirror_top =3D { + .format_name =3D "mirror_top", + .bdrv_co_preadv =3D bdrv_mirror_top_preadv, + .bdrv_co_pwritev =3D bdrv_mirror_top_pwritev, + .bdrv_close =3D bdrv_mirror_top_close, + .bdrv_child_perm =3D bdrv_mirror_top_child_perm, +}; + static void mirror_start_job(const char *job_id, BlockDriverState *bs, int creation_flags, BlockDriverState *target, const char *replaces, int64_t speed, @@ -966,6 +1022,9 @@ static void mirror_start_job(const char *job_id, Block= DriverState *bs, bool auto_complete) { MirrorBlockJob *s; + BlockDriverState *mirror_top_bs; + bool target_graph_mod; + bool target_is_backing; int ret; =20 if (granularity =3D=3D 0) { @@ -983,20 +1042,54 @@ static void mirror_start_job(const char *job_id, Blo= ckDriverState *bs, buf_size =3D DEFAULT_MIRROR_BUF_SIZE; } =20 - /* FIXME Use real permissions */ - s =3D block_job_create(job_id, driver, bs, 0, BLK_PERM_ALL, speed, + /* In the case of active commit, add dummy driver to provide consistent + * reads on the top, while disabling it in the intermediate nodes */ + ret =3D bdrv_new_open_driver(&bdrv_mirror_top, &mirror_top_bs, NULL, + BDRV_O_RDWR, errp); + if (ret < 0) { + return; + } + mirror_top_bs->total_sectors =3D bs->total_sectors; + + /* bdrv_append takes ownership of the mirror_top_bs reference, need to= keep + * it alive until block_job_create() even if bs has no parent. */ + bdrv_ref(mirror_top_bs); + bdrv_drained_begin(bs); + bdrv_append(mirror_top_bs, bs); + bdrv_drained_end(bs); + + /* Make sure that the source is not resized while the job is running */ + s =3D block_job_create(job_id, driver, mirror_top_bs, + BLK_PERM_CONSISTENT_READ, + BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE_UNCHANG= ED | + BLK_PERM_WRITE | BLK_PERM_GRAPH_MOD, speed, creation_flags, cb, opaque, errp); + bdrv_unref(mirror_top_bs); if (!s) { - return; + goto fail; } - - /* FIXME Use real permissions */ - s->target =3D blk_new(0, BLK_PERM_ALL); + s->source =3D bs; + s->mirror_top_bs =3D mirror_top_bs; + + /* No resize for the target either; while the mirror is still running,= a + * consistent read isn't necessarily possible. We could possibly allow + * writes and graph modifications, though it would likely defeat the + * purpose of a mirror, so leave them blocked for now. + * + * In the case of active commit, things look a bit different, though, + * because the target is an already populated backing file in active u= se. + * We can allow anything ecept resize there.*/ + target_is_backing =3D bdrv_chain_contains(bs, target); + target_graph_mod =3D (backing_mode !=3D MIRROR_LEAVE_BACKING_CHAIN); + s->target =3D blk_new(BLK_PERM_WRITE | + (target_graph_mod ? BLK_PERM_GRAPH_MOD : 0), + BLK_PERM_WRITE_UNCHANGED | + (target_is_backing ? BLK_PERM_CONSISTENT_READ | + BLK_PERM_WRITE | + BLK_PERM_GRAPH_MOD : 0)); ret =3D blk_insert_bs(s->target, target, errp); if (ret < 0) { - blk_unref(s->target); - block_job_unref(&s->common); - return; + goto fail; } =20 s->replaces =3D g_strdup(replaces); @@ -1020,21 +1113,38 @@ static void mirror_start_job(const char *job_id, Bl= ockDriverState *bs, return; } =20 - /* FIXME Use real permissions */ + /* Required permissions are already taken with blk_new() */ block_job_add_bdrv(&s->common, target, 0, BLK_PERM_ALL, &error_abort); =20 /* In commit_active_start() all intermediate nodes disappear, so * any jobs in them must be blocked */ - if (bdrv_chain_contains(bs, target)) { + if (target_is_backing) { BlockDriverState *iter; for (iter =3D backing_bs(bs); iter !=3D target; iter =3D backing_b= s(iter)) { - /* FIXME Use real permissions */ - block_job_add_bdrv(&s->common, iter, 0, BLK_PERM_ALL, &error_a= bort); + /* XXX BLK_PERM_WRITE needs to be allowed so we don't block ou= rselves + * at s->base. The other options would be a second filter driv= er above + * s->base. */ + ret =3D block_job_add_bdrv(&s->common, iter, 0, + BLK_PERM_WRITE_UNCHANGED | BLK_PERM_W= RITE, + errp); + if (ret < 0) { + goto fail; + } } } =20 trace_mirror_start(bs, s, opaque); block_job_start(&s->common); + return; + +fail: + if (s) { + g_free(s->replaces); + blk_unref(s->target); + block_job_unref(&s->common); + } + + bdrv_replace_in_backing_chain(mirror_top_bs, backing_bs(mirror_top_bs)= ); } =20 void mirror_start(const char *job_id, BlockDriverState *bs, diff --git a/qemu-img.c b/qemu-img.c index cff22e3..742faed 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -795,6 +795,8 @@ static void run_block_job(BlockJob *job, Error **errp) { AioContext *aio_context =3D blk_get_aio_context(job->blk); =20 + /* FIXME In error cases, the job simply goes away and we access a dang= ling + * pointer below. */ aio_context_acquire(aio_context); do { aio_poll(aio_context, true); @@ -816,6 +818,7 @@ static int img_commit(int argc, char **argv) const char *filename, *fmt, *cache, *base; BlockBackend *blk; BlockDriverState *bs, *base_bs; + BlockJob *job; bool progress =3D false, quiet =3D false, drop =3D false; bool writethrough; Error *local_err =3D NULL; @@ -951,7 +954,8 @@ static int img_commit(int argc, char **argv) bdrv_ref(bs); } =20 - run_block_job(bs->job, &local_err); + job =3D block_job_get("commit"); + run_block_job(job, &local_err); if (local_err) { goto unref_backing; } diff --git a/tests/qemu-iotests/141 b/tests/qemu-iotests/141 index 3ba79f0..6d8f0a1 100755 --- a/tests/qemu-iotests/141 +++ b/tests/qemu-iotests/141 @@ -67,7 +67,7 @@ test_blockjob() _send_qemu_cmd $QEMU_HANDLE \ "{'execute': 'x-blockdev-del', 'arguments': {'node-name': 'drv0'}}" \ - 'error' + 'error' | _filter_generated_node_ids =20 _send_qemu_cmd $QEMU_HANDLE \ "{'execute': 'block-job-cancel', diff --git a/tests/qemu-iotests/141.out b/tests/qemu-iotests/141.out index 195ca1a..82e763b 100644 --- a/tests/qemu-iotests/141.out +++ b/tests/qemu-iotests/141.out @@ -20,7 +20,7 @@ Formatting 'TEST_DIR/o.IMGFMT', fmt=3DIMGFMT size=3D10485= 76 backing_file=3DTEST_DIR/t. Formatting 'TEST_DIR/o.IMGFMT', fmt=3DIMGFMT size=3D1048576 backing_file= =3DTEST_DIR/t.IMGFMT backing_fmt=3DIMGFMT {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "BLOCK_JOB_READY", "data": {"device": "job0", "len": 0, "offset": 0, "spe= ed": 0, "type": "mirror"}} {"return": {}} -{"error": {"class": "GenericError", "desc": "Node drv0 is in use"}} +{"error": {"class": "GenericError", "desc": "Node 'drv0' is busy: node is = used as backing hd of 'NODE_NAME'"}} {"return": {}} {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "BLOCK_JOB_COMPLETED", "data": {"device": "job0", "len": 0, "offset": 0, = "speed": 0, "type": "mirror"}} {"return": {}} @@ -30,7 +30,7 @@ Formatting 'TEST_DIR/o.IMGFMT', fmt=3DIMGFMT size=3D10485= 76 backing_file=3DTEST_DIR/t. {"return": {}} {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "BLOCK_JOB_READY", "data": {"device": "job0", "len": 0, "offset": 0, "spe= ed": 0, "type": "commit"}} {"return": {}} -{"error": {"class": "GenericError", "desc": "Node drv0 is in use"}} +{"error": {"class": "GenericError", "desc": "Node 'drv0' is busy: node is = used as backing hd of 'NODE_NAME'"}} {"return": {}} {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "BLOCK_JOB_COMPLETED", "data": {"device": "job0", "len": 0, "offset": 0, = "speed": 0, "type": "commit"}} {"return": {}} --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487011027331852.9336666203682; Mon, 13 Feb 2017 10:37:07 -0800 (PST) Received: from localhost ([::1]:58809 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdLUo-0005Dq-0b for importer@patchew.org; Mon, 13 Feb 2017 13:37:06 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59830) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKMT-0003tT-8P for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:28 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKMS-0006QU-6x for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:25 -0500 Received: from mx1.redhat.com ([209.132.183.28]:51336) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKMP-0006Nt-CR; Mon, 13 Feb 2017 12:24:21 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8623F7E9E3; Mon, 13 Feb 2017 17:24:21 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3p031842; Mon, 13 Feb 2017 12:24:19 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:57 +0100 Message-Id: <1487006583-24350-36-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Mon, 13 Feb 2017 17:24:21 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 35/41] stream: Use real permissions in streaming block job X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The correct permissions are relatively obvious here (and explained in code comments). For intermediate streaming, we need to reopen the top node read-write before creating the job now because the permissions system catches attempts to get the BLK_PERM_WRITE_UNCHANGED permission on a read-only node. Signed-off-by: Kevin Wolf --- block/stream.c | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/block/stream.c b/block/stream.c index 47f0ffb..e562f57 100644 --- a/block/stream.c +++ b/block/stream.c @@ -229,27 +229,35 @@ void stream_start(const char *job_id, BlockDriverStat= e *bs, BlockDriverState *iter; int orig_bs_flags; =20 - /* FIXME Use real permissions */ - s =3D block_job_create(job_id, &stream_job_driver, bs, 0, BLK_PERM_ALL, - speed, BLOCK_JOB_DEFAULT, NULL, NULL, errp); - if (!s) { - return; - } - /* Make sure that the image is opened in read-write mode */ orig_bs_flags =3D bdrv_get_flags(bs); if (!(orig_bs_flags & BDRV_O_RDWR)) { if (bdrv_reopen(bs, orig_bs_flags | BDRV_O_RDWR, errp) !=3D 0) { - block_job_unref(&s->common); return; } } =20 - /* Block all intermediate nodes between bs and base, because they - * will disappear from the chain after this operation */ + /* Prevent concurrent jobs trying to modify the graph structure here, = we + * already have our own plans. Also don't allow resize as the image si= ze is + * queried only at the job start and then cached. */ + s =3D block_job_create(job_id, &stream_job_driver, bs, + BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE_UNCHANG= ED | + BLK_PERM_GRAPH_MOD, + BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE_UNCHANG= ED | + BLK_PERM_WRITE, + speed, BLOCK_JOB_DEFAULT, NULL, NULL, errp); + if (!s) { + goto fail; + } + + /* Block all intermediate nodes between bs and base, because they will + * disappear from the chain after this operation. The streaming job re= ads + * every block only once, assuming that it doesn't change, so block wr= ites + * and resizes. */ for (iter =3D backing_bs(bs); iter && iter !=3D base; iter =3D backing= _bs(iter)) { - /* FIXME Use real permissions */ - block_job_add_bdrv(&s->common, iter, 0, BLK_PERM_ALL, &error_abort= ); + block_job_add_bdrv(&s->common, iter, 0, + BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE_UNCHA= NGED, + &error_abort); } =20 s->base =3D base; @@ -259,4 +267,10 @@ void stream_start(const char *job_id, BlockDriverState= *bs, s->on_error =3D on_error; trace_stream_start(bs, base, s); block_job_start(&s->common); + return; + +fail: + if (orig_bs_flags !=3D bdrv_get_flags(bs)) { + bdrv_reopen(bs, s->bs_flags, NULL); + } } --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487010708645187.5350845518533; Mon, 13 Feb 2017 10:31:48 -0800 (PST) Received: from localhost ([::1]:58779 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdLPd-0000HY-8Z for importer@patchew.org; Mon, 13 Feb 2017 13:31:45 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59900) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKMY-00041R-Fn for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:32 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKMW-0006Sx-Tv for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:30 -0500 Received: from mx1.redhat.com ([209.132.183.28]:53252) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKMR-0006Pk-Lj; Mon, 13 Feb 2017 12:24:23 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CBB3DC04B943; Mon, 13 Feb 2017 17:24:23 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3q031842; Mon, 13 Feb 2017 12:24:21 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:58 +0100 Message-Id: <1487006583-24350-37-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 13 Feb 2017 17:24:23 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 36/41] hmp: Request permissions in qemu-io X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The HMP command 'qemu-io' is a bit tricky because it wants to work on the original BlockBackend, but additional permissions could be required. The details are explained in a comment in the code, but in summary, just request whatever permissions the current qemu-io command needs. Signed-off-by: Kevin Wolf --- block/block-backend.c | 6 ++++++ hmp.c | 26 +++++++++++++++++++++++++- include/qemu-io.h | 1 + include/sysemu/block-backend.h | 1 + qemu-io-cmds.c | 28 ++++++++++++++++++++++++++++ 5 files changed, 61 insertions(+), 1 deletion(-) diff --git a/block/block-backend.c b/block/block-backend.c index a314284..94db555 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -573,6 +573,12 @@ int blk_set_perm(BlockBackend *blk, uint64_t perm, uin= t64_t shared_perm, return 0; } =20 +void blk_get_perm(BlockBackend *blk, uint64_t *perm, uint64_t *shared_perm) +{ + *perm =3D blk->perm; + *shared_perm =3D blk->shared_perm; +} + static int blk_do_attach_dev(BlockBackend *blk, void *dev) { if (blk->dev) { diff --git a/hmp.c b/hmp.c index 801fddb..fde5016 100644 --- a/hmp.c +++ b/hmp.c @@ -2045,7 +2045,6 @@ void hmp_qemu_io(Monitor *mon, const QDict *qdict) if (!blk) { BlockDriverState *bs =3D bdrv_lookup_bs(NULL, device, &err); if (bs) { - /* FIXME Use real permissions */ blk =3D local_blk =3D blk_new(0, BLK_PERM_ALL); ret =3D blk_insert_bs(blk, bs, &err); if (ret < 0) { @@ -2059,6 +2058,31 @@ void hmp_qemu_io(Monitor *mon, const QDict *qdict) aio_context =3D blk_get_aio_context(blk); aio_context_acquire(aio_context); =20 + /* + * Notably absent: Proper permission management. This is sad, but it s= eems + * almost impossible to achieve without changing the semantics and the= reby + * limiting the use cases of the qemu-io HMP command. + * + * In an ideal world we would unconditionally create a new BlockBacken= d for + * qemuio_command(), but we have commands like 'reopen' and want them = to + * take effect on the exact BlockBackend whose name the user passed in= stead + * of just on a temporary copy of it. + * + * Another problem is that deleting the temporary BlockBackend involves + * draining all requests on it first, but some qemu-iotests cases want= to + * issue multiple aio_read/write requests and expect them to complete = in + * the background while the monitor has already returned. + * + * This is also what prevents us from saving the original permissions = and + * restoring them later: We can't revoke permissions until all requests + * have completed, and we don't know when that is nor can we really let + * anything else run before we have revoken them to avoid race conditi= ons. + * + * What happens now is that command() in qemu-io-cmds.c can extend the + * permissions if necessary for the qemu-io command. And they simply s= tay + * extended, possibly resulting in a read-only guest device keeping wr= ite + * permissions. Ugly, but it appears to be the lesser evil. + */ qemuio_command(blk, command); =20 aio_context_release(aio_context); diff --git a/include/qemu-io.h b/include/qemu-io.h index 4d402b9..196fde0 100644 --- a/include/qemu-io.h +++ b/include/qemu-io.h @@ -36,6 +36,7 @@ typedef struct cmdinfo { const char *args; const char *oneline; helpfunc_t help; + uint64_t perm; } cmdinfo_t; =20 extern bool qemuio_misalign; diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h index 65bd081..b400212 100644 --- a/include/sysemu/block-backend.h +++ b/include/sysemu/block-backend.h @@ -101,6 +101,7 @@ bool bdrv_has_blk(BlockDriverState *bs); bool bdrv_is_root_node(BlockDriverState *bs); int blk_set_perm(BlockBackend *blk, uint64_t perm, uint64_t shared_perm, Error **errp); +void blk_get_perm(BlockBackend *blk, uint64_t *perm, uint64_t *shared_perm= ); =20 void blk_set_allow_write_beyond_eof(BlockBackend *blk, bool allow); void blk_iostatus_enable(BlockBackend *blk); diff --git a/qemu-io-cmds.c b/qemu-io-cmds.c index e415b03..035cb96 100644 --- a/qemu-io-cmds.c +++ b/qemu-io-cmds.c @@ -83,6 +83,29 @@ static int command(BlockBackend *blk, const cmdinfo_t *c= t, int argc, } return 0; } + + /* Request additional permissions if necessary for this command. The c= aller + * is responsible for restoring the original permissions afterwards if= this + * is what it wants. */ + if (ct->perm && blk_is_available(blk)) { + uint64_t orig_perm, orig_shared_perm; + blk_get_perm(blk, &orig_perm, &orig_shared_perm); + + if (ct->perm & ~orig_perm) { + uint64_t new_perm; + Error *local_err =3D NULL; + int ret; + + new_perm =3D orig_perm | ct->perm; + + ret =3D blk_set_perm(blk, new_perm, orig_shared_perm, &local_e= rr); + if (ret < 0) { + error_report_err(local_err); + return 0; + } + } + } + optind =3D 0; return ct->cfunc(blk, argc, argv); } @@ -916,6 +939,7 @@ static const cmdinfo_t write_cmd =3D { .name =3D "write", .altname =3D "w", .cfunc =3D write_f, + .perm =3D BLK_PERM_WRITE, .argmin =3D 2, .argmax =3D -1, .args =3D "[-bcCfquz] [-P pattern] off len", @@ -1091,6 +1115,7 @@ static int writev_f(BlockBackend *blk, int argc, char= **argv); static const cmdinfo_t writev_cmd =3D { .name =3D "writev", .cfunc =3D writev_f, + .perm =3D BLK_PERM_WRITE, .argmin =3D 2, .argmax =3D -1, .args =3D "[-Cfq] [-P pattern] off len [len..]", @@ -1390,6 +1415,7 @@ static int aio_write_f(BlockBackend *blk, int argc, c= har **argv); static const cmdinfo_t aio_write_cmd =3D { .name =3D "aio_write", .cfunc =3D aio_write_f, + .perm =3D BLK_PERM_WRITE, .argmin =3D 2, .argmax =3D -1, .args =3D "[-Cfiquz] [-P pattern] off len [len..]", @@ -1554,6 +1580,7 @@ static const cmdinfo_t truncate_cmd =3D { .name =3D "truncate", .altname =3D "t", .cfunc =3D truncate_f, + .perm =3D BLK_PERM_WRITE | BLK_PERM_RESIZE, .argmin =3D 1, .argmax =3D 1, .args =3D "off", @@ -1651,6 +1678,7 @@ static const cmdinfo_t discard_cmd =3D { .name =3D "discard", .altname =3D "d", .cfunc =3D discard_f, + .perm =3D BLK_PERM_WRITE, .argmin =3D 2, .argmax =3D -1, .args =3D "[-Cq] off len", --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487008925330365.10445710938745; Mon, 13 Feb 2017 10:02:05 -0800 (PST) Received: from localhost ([::1]:58575 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKwr-0005OW-TW for importer@patchew.org; Mon, 13 Feb 2017 13:02:02 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59915) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKMZ-00042M-Dq for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:32 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKMY-0006TD-26 for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:31 -0500 Received: from mx1.redhat.com ([209.132.183.28]:39122) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKMT-0006Qy-D6; Mon, 13 Feb 2017 12:24:25 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 99DAC63E0B; Mon, 13 Feb 2017 17:24:25 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3r031842; Mon, 13 Feb 2017 12:24:24 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:22:59 +0100 Message-Id: <1487006583-24350-38-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Mon, 13 Feb 2017 17:24:25 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 37/41] migration/block: Use real permissions X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Request BLK_PERM_CONSISTENT_READ for the source of block migration, and handle potential permission errors as good as we can in this place (which is not very good, but it matches the other failure cases). Signed-off-by: Kevin Wolf --- migration/block.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/migration/block.c b/migration/block.c index d259936..958d0fc 100644 --- a/migration/block.c +++ b/migration/block.c @@ -379,7 +379,7 @@ static void unset_dirty_tracking(void) } } =20 -static void init_blk_migration(QEMUFile *f) +static int init_blk_migration(QEMUFile *f) { BlockDriverState *bs; BlkMigDevState *bmds; @@ -390,6 +390,8 @@ static void init_blk_migration(QEMUFile *f) BlkMigDevState *bmds; BlockDriverState *bs; } *bmds_bs; + Error *local_err =3D NULL; + int ret; =20 block_mig_state.submitted =3D 0; block_mig_state.read_done =3D 0; @@ -411,12 +413,12 @@ static void init_blk_migration(QEMUFile *f) =20 sectors =3D bdrv_nb_sectors(bs); if (sectors <=3D 0) { + ret =3D sectors; goto out; } =20 bmds =3D g_new0(BlkMigDevState, 1); - /* FIXME Use real permissions */ - bmds->blk =3D blk_new(0, BLK_PERM_ALL); + bmds->blk =3D blk_new(BLK_PERM_CONSISTENT_READ, BLK_PERM_ALL); bmds->blk_name =3D g_strdup(bdrv_get_device_name(bs)); bmds->bulk_completed =3D 0; bmds->total_sectors =3D sectors; @@ -446,7 +448,11 @@ static void init_blk_migration(QEMUFile *f) BlockDriverState *bs =3D bmds_bs[i].bs; =20 if (bmds) { - blk_insert_bs(bmds->blk, bs, &error_abort); + ret =3D blk_insert_bs(bmds->blk, bs, &local_err); + if (ret < 0) { + error_report_err(local_err); + goto out; + } =20 alloc_aio_bitmap(bmds); error_setg(&bmds->blocker, "block device is in use by migratio= n"); @@ -454,8 +460,10 @@ static void init_blk_migration(QEMUFile *f) } } =20 + ret =3D 0; out: g_free(bmds_bs); + return ret; } =20 /* Called with no lock taken. */ @@ -706,7 +714,10 @@ static int block_save_setup(QEMUFile *f, void *opaque) block_mig_state.submitted, block_mig_state.transferred); =20 qemu_mutex_lock_iothread(); - init_blk_migration(f); + ret =3D init_blk_migration(f); + if (ret < 0) { + return ret; + } =20 /* start track dirty blocks */ ret =3D set_dirty_tracking(); --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487009203763760.0873780412549; Mon, 13 Feb 2017 10:06:43 -0800 (PST) Received: from localhost ([::1]:58602 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdL1O-0001H4-Bs for importer@patchew.org; Mon, 13 Feb 2017 13:06:42 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59919) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKMZ-00042V-GE for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:32 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKMY-0006TI-2i for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:31 -0500 Received: from mx1.redhat.com ([209.132.183.28]:40504) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKMV-0006SQ-Bx; Mon, 13 Feb 2017 12:24:27 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8CFD3C0567A3; Mon, 13 Feb 2017 17:24:27 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3s031842; Mon, 13 Feb 2017 12:24:25 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:23:00 +0100 Message-Id: <1487006583-24350-39-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Mon, 13 Feb 2017 17:24:27 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 38/41] nbd/server: Use real permissions for NBD exports X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" NBD can't cope with device size changes, so resize must be forbidden, but otherwise we can tolerate anything. Depending on whether the export is writable or not, we only require consistent reads and writes. Signed-off-by: Kevin Wolf --- nbd/server.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/nbd/server.c b/nbd/server.c index deb4358..4bb37d6 100644 --- a/nbd/server.c +++ b/nbd/server.c @@ -889,10 +889,17 @@ NBDExport *nbd_export_new(BlockDriverState *bs, off_t= dev_offset, off_t size, { BlockBackend *blk; NBDExport *exp =3D g_malloc0(sizeof(NBDExport)); + uint64_t perm; int ret; =20 - /* FIXME Use real permissions */ - blk =3D blk_new(0, BLK_PERM_ALL); + /* Don't allow resize while the NBD server is running, otherwise we do= n't + * care what happens with the node. */ + perm =3D BLK_PERM_CONSISTENT_READ; + if ((nbdflags & NBD_FLAG_READ_ONLY) =3D=3D 0) { + perm |=3D BLK_PERM_WRITE; + } + blk =3D blk_new(perm, BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE_UNCHAN= GED | + BLK_PERM_WRITE | BLK_PERM_GRAPH_MOD); ret =3D blk_insert_bs(blk, bs, errp); if (ret < 0) { goto fail; --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487009453861640.1297380757471; Mon, 13 Feb 2017 10:10:53 -0800 (PST) Received: from localhost ([::1]:58633 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdL5O-0005Nh-Gp for importer@patchew.org; Mon, 13 Feb 2017 13:10:50 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59940) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKMa-00043U-FV for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:33 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKMZ-0006Tm-GO for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:32 -0500 Received: from mx1.redhat.com ([209.132.183.28]:59560) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKMX-0006Sm-2j; Mon, 13 Feb 2017 12:24:29 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3D74281245; Mon, 13 Feb 2017 17:24:29 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3t031842; Mon, 13 Feb 2017 12:24:27 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:23:01 +0100 Message-Id: <1487006583-24350-40-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Mon, 13 Feb 2017 17:24:29 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 39/41] tests: Remove FIXME comments X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Not requesting any permissions is actually correct for these test cases because no actual I/O or other operation covered by the permission system is performed. Signed-off-by: Kevin Wolf --- tests/test-blockjob.c | 2 +- tests/test-throttle.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test-blockjob.c b/tests/test-blockjob.c index 1afe17b..740e740 100644 --- a/tests/test-blockjob.c +++ b/tests/test-blockjob.c @@ -54,7 +54,7 @@ static BlockJob *do_test_id(BlockBackend *blk, const char= *id, * BlockDriverState inserted. */ static BlockBackend *create_blk(const char *name) { - /* FIXME Use real permissions */ + /* No I/O is performed on this device */ BlockBackend *blk =3D blk_new(0, BLK_PERM_ALL); BlockDriverState *bs; =20 diff --git a/tests/test-throttle.c b/tests/test-throttle.c index 5846433..bd7c501 100644 --- a/tests/test-throttle.c +++ b/tests/test-throttle.c @@ -593,7 +593,7 @@ static void test_groups(void) BlockBackend *blk1, *blk2, *blk3; BlockBackendPublic *blkp1, *blkp2, *blkp3; =20 - /* FIXME Use real permissions */ + /* No actual I/O is performed on these devices */ blk1 =3D blk_new(0, BLK_PERM_ALL); blk2 =3D blk_new(0, BLK_PERM_ALL); blk3 =3D blk_new(0, BLK_PERM_ALL); --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487011314654550.8344749621327; Mon, 13 Feb 2017 10:41:54 -0800 (PST) Received: from localhost ([::1]:58847 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdLZR-0001c0-3d for importer@patchew.org; Mon, 13 Feb 2017 13:41:53 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59979) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKMf-0004Br-8t for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:38 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKMc-0006Ub-88 for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:37 -0500 Received: from mx1.redhat.com ([209.132.183.28]:20651) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKMY-0006TO-TV; Mon, 13 Feb 2017 12:24:31 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 191708FD17; Mon, 13 Feb 2017 17:24:31 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3u031842; Mon, 13 Feb 2017 12:24:29 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:23:02 +0100 Message-Id: <1487006583-24350-41-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Mon, 13 Feb 2017 17:24:31 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 40/41] block: Pass BdrvChild to bdrv_aligned_preadv/pwritev X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This is where we want to check the permissions, so we need to have the BdrvChild around where they are stored. Signed-off-by: Kevin Wolf --- block/io.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/block/io.c b/block/io.c index c42b34a..cb2feff 100644 --- a/block/io.c +++ b/block/io.c @@ -1001,10 +1001,11 @@ err: * handles copy on read, zeroing after EOF, and fragmentation of large * reads; any other features must be implemented by the caller. */ -static int coroutine_fn bdrv_aligned_preadv(BlockDriverState *bs, +static int coroutine_fn bdrv_aligned_preadv(BdrvChild *child, BdrvTrackedRequest *req, int64_t offset, unsigned int bytes, int64_t align, QEMUIOVector *qiov, int flags) { + BlockDriverState *bs =3D child->bs; int64_t total_bytes, max_bytes; int ret =3D 0; uint64_t bytes_remaining =3D bytes; @@ -1158,7 +1159,7 @@ int coroutine_fn bdrv_co_preadv(BdrvChild *child, } =20 tracked_request_begin(&req, bs, offset, bytes, BDRV_TRACKED_READ); - ret =3D bdrv_aligned_preadv(bs, &req, offset, bytes, align, + ret =3D bdrv_aligned_preadv(child, &req, offset, bytes, align, use_local_qiov ? &local_qiov : qiov, flags); tracked_request_end(&req); @@ -1306,10 +1307,11 @@ fail: * Forwards an already correctly aligned write request to the BlockDriver, * after possibly fragmenting it. */ -static int coroutine_fn bdrv_aligned_pwritev(BlockDriverState *bs, +static int coroutine_fn bdrv_aligned_pwritev(BdrvChild *child, BdrvTrackedRequest *req, int64_t offset, unsigned int bytes, int64_t align, QEMUIOVector *qiov, int flags) { + BlockDriverState *bs =3D child->bs; BlockDriver *drv =3D bs->drv; bool waited; int ret; @@ -1397,12 +1399,13 @@ static int coroutine_fn bdrv_aligned_pwritev(BlockD= riverState *bs, return ret; } =20 -static int coroutine_fn bdrv_co_do_zero_pwritev(BlockDriverState *bs, +static int coroutine_fn bdrv_co_do_zero_pwritev(BdrvChild *child, int64_t offset, unsigned int bytes, BdrvRequestFlags flags, BdrvTrackedRequest *req) { + BlockDriverState *bs =3D child->bs; uint8_t *buf =3D NULL; QEMUIOVector local_qiov; struct iovec iov; @@ -1430,7 +1433,7 @@ static int coroutine_fn bdrv_co_do_zero_pwritev(Block= DriverState *bs, mark_request_serialising(req, align); wait_serialising_requests(req); bdrv_debug_event(bs, BLKDBG_PWRITEV_RMW_HEAD); - ret =3D bdrv_aligned_preadv(bs, req, offset & ~(align - 1), align, + ret =3D bdrv_aligned_preadv(child, req, offset & ~(align - 1), ali= gn, align, &local_qiov, 0); if (ret < 0) { goto fail; @@ -1438,7 +1441,7 @@ static int coroutine_fn bdrv_co_do_zero_pwritev(Block= DriverState *bs, bdrv_debug_event(bs, BLKDBG_PWRITEV_RMW_AFTER_HEAD); =20 memset(buf + head_padding_bytes, 0, zero_bytes); - ret =3D bdrv_aligned_pwritev(bs, req, offset & ~(align - 1), align, + ret =3D bdrv_aligned_pwritev(child, req, offset & ~(align - 1), al= ign, align, &local_qiov, flags & ~BDRV_REQ_ZERO_WRITE); if (ret < 0) { @@ -1452,7 +1455,7 @@ static int coroutine_fn bdrv_co_do_zero_pwritev(Block= DriverState *bs, if (bytes >=3D align) { /* Write the aligned part in the middle. */ uint64_t aligned_bytes =3D bytes & ~(align - 1); - ret =3D bdrv_aligned_pwritev(bs, req, offset, aligned_bytes, align, + ret =3D bdrv_aligned_pwritev(child, req, offset, aligned_bytes, al= ign, NULL, flags); if (ret < 0) { goto fail; @@ -1468,7 +1471,7 @@ static int coroutine_fn bdrv_co_do_zero_pwritev(Block= DriverState *bs, mark_request_serialising(req, align); wait_serialising_requests(req); bdrv_debug_event(bs, BLKDBG_PWRITEV_RMW_TAIL); - ret =3D bdrv_aligned_preadv(bs, req, offset, align, + ret =3D bdrv_aligned_preadv(child, req, offset, align, align, &local_qiov, 0); if (ret < 0) { goto fail; @@ -1476,7 +1479,7 @@ static int coroutine_fn bdrv_co_do_zero_pwritev(Block= DriverState *bs, bdrv_debug_event(bs, BLKDBG_PWRITEV_RMW_AFTER_TAIL); =20 memset(buf, 0, bytes); - ret =3D bdrv_aligned_pwritev(bs, req, offset, align, align, + ret =3D bdrv_aligned_pwritev(child, req, offset, align, align, &local_qiov, flags & ~BDRV_REQ_ZERO_WRI= TE); } fail: @@ -1523,7 +1526,7 @@ int coroutine_fn bdrv_co_pwritev(BdrvChild *child, tracked_request_begin(&req, bs, offset, bytes, BDRV_TRACKED_WRITE); =20 if (!qiov) { - ret =3D bdrv_co_do_zero_pwritev(bs, offset, bytes, flags, &req); + ret =3D bdrv_co_do_zero_pwritev(child, offset, bytes, flags, &req); goto out; } =20 @@ -1542,7 +1545,7 @@ int coroutine_fn bdrv_co_pwritev(BdrvChild *child, qemu_iovec_init_external(&head_qiov, &head_iov, 1); =20 bdrv_debug_event(bs, BLKDBG_PWRITEV_RMW_HEAD); - ret =3D bdrv_aligned_preadv(bs, &req, offset & ~(align - 1), align, + ret =3D bdrv_aligned_preadv(child, &req, offset & ~(align - 1), al= ign, align, &head_qiov, 0); if (ret < 0) { goto fail; @@ -1584,8 +1587,8 @@ int coroutine_fn bdrv_co_pwritev(BdrvChild *child, qemu_iovec_init_external(&tail_qiov, &tail_iov, 1); =20 bdrv_debug_event(bs, BLKDBG_PWRITEV_RMW_TAIL); - ret =3D bdrv_aligned_preadv(bs, &req, (offset + bytes) & ~(align -= 1), align, - align, &tail_qiov, 0); + ret =3D bdrv_aligned_preadv(child, &req, (offset + bytes) & ~(alig= n - 1), + align, align, &tail_qiov, 0); if (ret < 0) { goto fail; } @@ -1603,7 +1606,7 @@ int coroutine_fn bdrv_co_pwritev(BdrvChild *child, bytes =3D ROUND_UP(bytes, align); } =20 - ret =3D bdrv_aligned_pwritev(bs, &req, offset, bytes, align, + ret =3D bdrv_aligned_pwritev(child, &req, offset, bytes, align, use_local_qiov ? &local_qiov : qiov, flags); =20 --=20 1.8.3.1 From nobody Mon Apr 29 10:01:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487009475597901.7503576202195; Mon, 13 Feb 2017 10:11:15 -0800 (PST) Received: from localhost ([::1]:58634 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdL5k-0005h9-FT for importer@patchew.org; Mon, 13 Feb 2017 13:11:12 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59991) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cdKMg-0004E4-EC for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:39 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cdKMf-0006Uw-CF for qemu-devel@nongnu.org; Mon, 13 Feb 2017 12:24:38 -0500 Received: from mx1.redhat.com ([209.132.183.28]:57894) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cdKMa-0006Tz-NP; Mon, 13 Feb 2017 12:24:32 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E64CB811A7; Mon, 13 Feb 2017 17:24:32 +0000 (UTC) Received: from noname.redhat.com (ovpn-117-183.ams2.redhat.com [10.36.117.183]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v1DHNC3v031842; Mon, 13 Feb 2017 12:24:31 -0500 From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 13 Feb 2017 18:23:03 +0100 Message-Id: <1487006583-24350-42-git-send-email-kwolf@redhat.com> In-Reply-To: <1487006583-24350-1-git-send-email-kwolf@redhat.com> References: <1487006583-24350-1-git-send-email-kwolf@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Mon, 13 Feb 2017 17:24:32 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [RFC PATCH 41/41] block: Assertions for write permissions X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, jcody@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This adds assertions that ensure that the necessary write permissions have been granted before someone attempts to write to a node. Signed-off-by: Kevin Wolf --- block/io.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/block/io.c b/block/io.c index cb2feff..74929e5 100644 --- a/block/io.c +++ b/block/io.c @@ -925,9 +925,11 @@ bdrv_driver_pwritev_compressed(BlockDriverState *bs, u= int64_t offset, return drv->bdrv_co_pwritev_compressed(bs, offset, bytes, qiov); } =20 -static int coroutine_fn bdrv_co_do_copy_on_readv(BlockDriverState *bs, +static int coroutine_fn bdrv_co_do_copy_on_readv(BdrvChild *child, int64_t offset, unsigned int bytes, QEMUIOVector *qiov) { + BlockDriverState *bs =3D child->bs; + /* Perform I/O through a temporary buffer so that users who scribble o= ver * their read buffer while the operation is in progress do not end up * modifying the image file. This is critical for zero-copy guest I/O @@ -943,6 +945,8 @@ static int coroutine_fn bdrv_co_do_copy_on_readv(BlockD= riverState *bs, size_t skip_bytes; int ret; =20 + assert(child->perm & (BLK_PERM_WRITE_UNCHANGED | BLK_PERM_WRITE)); + /* Cover entire cluster so no additional backing file I/O is required = when * allocating cluster in the image file. */ @@ -1051,7 +1055,7 @@ static int coroutine_fn bdrv_aligned_preadv(BdrvChild= *child, } =20 if (!ret || pnum !=3D nb_sectors) { - ret =3D bdrv_co_do_copy_on_readv(bs, offset, bytes, qiov); + ret =3D bdrv_co_do_copy_on_readv(child, offset, bytes, qiov); goto out; } } @@ -1334,6 +1338,7 @@ static int coroutine_fn bdrv_aligned_pwritev(BdrvChil= d *child, assert(!waited || !req->serialising); assert(req->overlap_offset <=3D offset); assert(offset + bytes <=3D req->overlap_offset + req->overlap_bytes); + assert(child->perm & BLK_PERM_WRITE); =20 ret =3D notifier_with_return_list_notify(&bs->before_write_notifiers, = req); =20 --=20 1.8.3.1