From nobody Mon Feb 9 11:34:30 2026 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.zohomail.com; dkim=fail; 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 (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1528991522162197.33012604045825; Thu, 14 Jun 2018 08:52:02 -0700 (PDT) Received: from localhost ([::1]:41412 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fTUXS-0002AV-B5 for importer@patchew.org; Thu, 14 Jun 2018 11:51:54 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53122) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fTUVM-0000j6-Um for qemu-devel@nongnu.org; Thu, 14 Jun 2018 11:49:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fTUVI-0003nA-0v for qemu-devel@nongnu.org; Thu, 14 Jun 2018 11:49:44 -0400 Received: from fanzine.igalia.com ([91.117.99.155]:37178) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fTUVH-0003jq-FW; Thu, 14 Jun 2018 11:49:39 -0400 Received: from [194.100.51.2] (helo=perseus.local) by fanzine.igalia.com with esmtpsa (Cipher TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim) id 1fTUVE-0004dn-GM; Thu, 14 Jun 2018 17:49:36 +0200 Received: from berto by perseus.local with local (Exim 4.89) (envelope-from ) id 1fTUUv-0008Nb-6x; Thu, 14 Jun 2018 18:49:17 +0300 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=References:In-Reply-To:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=57AJAvPr1IHfnsZy7s1ngwYaVIJnxReCkZvhVvyIRO0=; b=HCIn7wVuq5WUXGCkOsWFcSxkHPnxyMTxP7KqzVXwNntt8ZrbGm9kI5t/Yum5rVTQ9Q/UL9En5jMuwRCTLP8D8TZ25vopayARjdVJegecre9bLRH1GiDk/LzXqLQE+NsXnh6Yk9u+quYwNOmq80M4uAqUm8RtwDoPIoLhYiJN8ztm2mVO67TjIxHZCyX0diosuNtVvlj2FjfG2USratvVwiAzM4/k03twFKhGM/VSJJ/X02CvJRsRlYlh8TzoSvLcK5SV5Wv1UfrQ72rkMLXL5ZqnZD7PHjtyOltHZYjbIiITQEHNs+FOUeSA/Ut7uTddrqTIv72S5YyZmSr2Tdyl2Q==; From: Alberto Garcia To: qemu-devel@nongnu.org Date: Thu, 14 Jun 2018 18:49:00 +0300 Message-Id: <2de7c60c63a3824a46150b5b43f898887099a43e.1528991017.git.berto@igalia.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x (no timestamps) [generic] [fuzzy] X-Received-From: 91.117.99.155 Subject: [Qemu-devel] [RFC PATCH 03/10] block: Allow changing 'detect-zeroes' on reopen 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: Kevin Wolf , Alberto Garcia , qemu-block@nongnu.org, Markus Armbruster , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 'detect-zeroes' is one of the basic BlockdevOptions available for all drivers, but it's silently ignored by bdrv_reopen_prepare/commit(), so the user cannot change it and doesn't get an error explaining that it can't be changed. Since there's no reason why we shouldn't allow changing it and the implementation is trivial, let's just do it. Signed-off-by: Alberto Garcia --- block.c | 54 ++++++++++++++++++++++++++++++++++++-----------= ---- include/block/block.h | 1 + 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/block.c b/block.c index e470db7e5e..4c186e54b6 100644 --- a/block.c +++ b/block.c @@ -759,6 +759,29 @@ static void bdrv_join_options(BlockDriverState *bs, QD= ict *options, } } =20 +static BlockdevDetectZeroesOptions bdrv_parse_detect_zeroes(const char *va= lue, + int open_flags, + Error **errp) +{ + Error *local_err =3D NULL; + BlockdevDetectZeroesOptions detect_zeroes =3D + qapi_enum_parse(&BlockdevDetectZeroesOptions_lookup, value, + BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return detect_zeroes; + } + + if (detect_zeroes =3D=3D BLOCKDEV_DETECT_ZEROES_OPTIONS_UNMAP && + !(open_flags & BDRV_O_UNMAP)) + { + error_setg(errp, "setting detect-zeroes to unmap is not allowed " + "without setting discard operation to unmap"); + } + + return detect_zeroes; +} + /** * Set open flags for a given discard mode * @@ -1390,27 +1413,14 @@ static int bdrv_open_common(BlockDriverState *bs, B= lockBackend *file, =20 detect_zeroes =3D qemu_opt_get(opts, "detect-zeroes"); if (detect_zeroes) { - BlockdevDetectZeroesOptions value =3D - qapi_enum_parse(&BlockdevDetectZeroesOptions_lookup, - detect_zeroes, - BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF, - &local_err); + bs->detect_zeroes =3D bdrv_parse_detect_zeroes(detect_zeroes, + bs->open_flags, + &local_err); if (local_err) { error_propagate(errp, local_err); ret =3D -EINVAL; goto fail_opts; } - - if (value =3D=3D BLOCKDEV_DETECT_ZEROES_OPTIONS_UNMAP && - !(bs->open_flags & BDRV_O_UNMAP)) - { - error_setg(errp, "setting detect-zeroes to unmap is not allowe= d " - "without setting discard operation to unmap"); - ret =3D -EINVAL; - goto fail_opts; - } - - bs->detect_zeroes =3D value; } =20 if (filename !=3D NULL) { @@ -3148,6 +3158,17 @@ int bdrv_reopen_prepare(BDRVReopenState *reopen_stat= e, BlockReopenQueue *queue, } } =20 + value =3D qemu_opt_get(opts, "detect-zeroes"); + if (value) { + reopen_state->detect_zeroes =3D + bdrv_parse_detect_zeroes(value, reopen_state->flags, &local_er= r); + if (local_err) { + error_propagate(errp, local_err); + ret =3D -EINVAL; + goto error; + } + } + /* node-name and driver must be unchanged. Put them back into the QDic= t, so * that they are checked at the end of this function. */ value =3D qemu_opt_get(opts, "node-name"); @@ -3278,6 +3299,7 @@ void bdrv_reopen_commit(BDRVReopenState *reopen_state) bs->explicit_options =3D reopen_state->explicit_options; bs->open_flags =3D reopen_state->flags; bs->read_only =3D !(reopen_state->flags & BDRV_O_RDWR); + bs->detect_zeroes =3D reopen_state->detect_zeroes; =20 bdrv_refresh_limits(bs, NULL); =20 diff --git a/include/block/block.h b/include/block/block.h index e677080c4e..1e78587331 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -159,6 +159,7 @@ typedef QSIMPLEQ_HEAD(BlockReopenQueue, BlockReopenQueu= eEntry) BlockReopenQueue; typedef struct BDRVReopenState { BlockDriverState *bs; int flags; + BlockdevDetectZeroesOptions detect_zeroes; uint64_t perm, shared_perm; QDict *options; QDict *explicit_options; --=20 2.11.0