From nobody Sat May 4 14:54:08 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=virtuozzo.com ARC-Seal: i=1; a=rsa-sha256; t=1555928486; cv=none; d=zoho.com; s=zohoarc; b=YMj2xQfBj8vtFuKiR4nCj1GwqzWfEPIlFi1y+3jJLRdiUXFnyJE5ksQ2ySwvzToWOY3C49YQ+Bx18tNWfYVuzcXogoVud5WRJn7wxYw8ocmA7oHWpKik3MkkIEsXBcY03+KQ3TbxO++Ts6wIx+VdYZf9K9p2HsQMvWjiIc9KNOo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1555928486; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=UsreyI43FybOml82lZM8Z5cpEXivf6tG2NBzSiE6qCU=; b=AxnakraEK3iXjHAD5en/WIbEsDz+6JmyyU9nEmUYctogFEi2RGtDrmTynJnTehHHIM4hXCvOjCe+QxAA5Gsk9PuEXuyx/AnYgnrxIclSrphLUKMJKBdy06t1iAl9iqKmqx1EA17eFfE341IHNvarXjM5fN8hoH/SKIDLSRo70M4= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1555928486893483.804206062386; Mon, 22 Apr 2019 03:21:26 -0700 (PDT) Received: from localhost ([127.0.0.1]:35156 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hIW4e-0004QJ-Rq for importer@patchew.org; Mon, 22 Apr 2019 06:21:20 -0400 Received: from eggs.gnu.org ([209.51.188.92]:57999) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hIW2Y-0002xl-DJ for qemu-devel@nongnu.org; Mon, 22 Apr 2019 06:19:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hIW2X-0006YW-33 for qemu-devel@nongnu.org; Mon, 22 Apr 2019 06:19:10 -0400 Received: from relay.sw.ru ([185.231.240.75]:44554) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hIW2W-0006Wh-RQ; Mon, 22 Apr 2019 06:19:09 -0400 Received: from [10.28.8.145] (helo=kvm.sw.ru) by relay.sw.ru with esmtp (Exim 4.91) (envelope-from ) id 1hIW2P-00029b-C4; Mon, 22 Apr 2019 13:19:01 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Mon, 22 Apr 2019 13:18:58 +0300 Message-Id: <20190422101900.13897-2-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20190422101900.13897-1-vsementsov@virtuozzo.com> References: <20190422101900.13897-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 185.231.240.75 Subject: [Qemu-devel] [PATCH v5 1/3] block: include base when checking image chain for block allocation 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: fam@euphon.net, kwolf@redhat.com, vsementsov@virtuozzo.com, berto@igalia.com, wencongyang2@huawei.com, xiechanglong.d@gmail.com, mreitz@redhat.com, stefanha@redhat.com, andrey.shinkevich@virtuozzo.com, den@openvz.org, jsnow@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Andrey Shinkevich This patch is used in the 'block/stream: introduce a bottom node' that is following. Instead of the base node, the caller may pass the node that has the base as its backing image to the function bdrv_is_allocated_above() with a new parameter include_base =3D true and get rid of the dependency on the base that may change during commit/stream parallel jobs. Now, if the specified base is not found in the backing image chain, the QEMU will crash. Suggested-by: Vladimir Sementsov-Ogievskiy Signed-off-by: Andrey Shinkevich Signed-off-by: Vladimir Sementsov-Ogievskiy [only reword comment in block/io.c as Alberto suggested] Reviewed-by: Alberto Garcia --- include/block/block.h | 3 ++- block/commit.c | 2 +- block/io.c | 18 +++++++++++++----- block/mirror.c | 2 +- block/replication.c | 2 +- block/stream.c | 2 +- 6 files changed, 19 insertions(+), 10 deletions(-) diff --git a/include/block/block.h b/include/block/block.h index c7a26199aa..f98e8582a1 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -447,7 +447,8 @@ int bdrv_block_status_above(BlockDriverState *bs, Block= DriverState *base, int bdrv_is_allocated(BlockDriverState *bs, int64_t offset, int64_t bytes, int64_t *pnum); int bdrv_is_allocated_above(BlockDriverState *top, BlockDriverState *base, - int64_t offset, int64_t bytes, int64_t *pnum); + bool include_base, int64_t offset, int64_t byt= es, + int64_t *pnum); =20 bool bdrv_is_read_only(BlockDriverState *bs); int bdrv_can_set_read_only(BlockDriverState *bs, bool read_only, diff --git a/block/commit.c b/block/commit.c index ba60fef58a..1bd5284ba9 100644 --- a/block/commit.c +++ b/block/commit.c @@ -177,7 +177,7 @@ static int coroutine_fn commit_run(Job *job, Error **er= rp) break; } /* Copy if allocated above the base */ - ret =3D bdrv_is_allocated_above(blk_bs(s->top), blk_bs(s->base), + ret =3D bdrv_is_allocated_above(blk_bs(s->top), blk_bs(s->base), f= alse, offset, COMMIT_BUFFER_SIZE, &n); copy =3D (ret =3D=3D 1); trace_commit_one_iteration(s, offset, n, ret); diff --git a/block/io.c b/block/io.c index dfc153b8d8..2361af9086 100644 --- a/block/io.c +++ b/block/io.c @@ -2317,9 +2317,10 @@ int coroutine_fn bdrv_is_allocated(BlockDriverState = *bs, int64_t offset, * Given an image chain: ... -> [BASE] -> [INTER1] -> [INTER2] -> [TOP] * * Return true if (a prefix of) the given range is allocated in any image - * between BASE and TOP (inclusive). BASE can be NULL to check if the giv= en - * offset is allocated in any image of the chain. Return false otherwise, - * or negative errno on failure. + * between BASE and TOP (BASE is only included if include_base is set). + * BASE can be NULL to check if the given offset is allocated in any + * image of the chain. Return false otherwise, or negative errno on + * failure. * * 'pnum' is set to the number of bytes (including and immediately * following the specified offset) that are known to be in the same @@ -2331,14 +2332,17 @@ int coroutine_fn bdrv_is_allocated(BlockDriverState= *bs, int64_t offset, */ int bdrv_is_allocated_above(BlockDriverState *top, BlockDriverState *base, - int64_t offset, int64_t bytes, int64_t *pnum) + bool include_base, int64_t offset, + int64_t bytes, int64_t *pnum) { BlockDriverState *intermediate; int ret; int64_t n =3D bytes; =20 + assert(base || !include_base); + intermediate =3D top; - while (intermediate && intermediate !=3D base) { + while (include_base || intermediate !=3D base) { int64_t pnum_inter; int64_t size_inter; =20 @@ -2360,6 +2364,10 @@ int bdrv_is_allocated_above(BlockDriverState *top, n =3D pnum_inter; } =20 + if (intermediate =3D=3D base) { + break; + } + intermediate =3D backing_bs(intermediate); } =20 diff --git a/block/mirror.c b/block/mirror.c index ff15cfb197..923548f92f 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -807,7 +807,7 @@ static int coroutine_fn mirror_dirty_init(MirrorBlockJo= b *s) return 0; } =20 - ret =3D bdrv_is_allocated_above(bs, base, offset, bytes, &count); + ret =3D bdrv_is_allocated_above(bs, base, false, offset, bytes, &c= ount); if (ret < 0) { return ret; } diff --git a/block/replication.c b/block/replication.c index 3d4dedddfc..fc8d2adc68 100644 --- a/block/replication.c +++ b/block/replication.c @@ -272,7 +272,7 @@ static coroutine_fn int replication_co_writev(BlockDriv= erState *bs, while (remaining_sectors > 0) { int64_t count; =20 - ret =3D bdrv_is_allocated_above(top->bs, base->bs, + ret =3D bdrv_is_allocated_above(top->bs, base->bs, false, sector_num * BDRV_SECTOR_SIZE, remaining_sectors * BDRV_SECTOR_SIZE, &count); diff --git a/block/stream.c b/block/stream.c index bfaebb861a..0920092ed2 100644 --- a/block/stream.c +++ b/block/stream.c @@ -162,7 +162,7 @@ static int coroutine_fn stream_run(Job *job, Error **er= rp) } else if (ret >=3D 0) { /* Copy if allocated in the intermediate images. Limit to the * known-unallocated area [offset, offset+n*BDRV_SECTOR_SIZE).= */ - ret =3D bdrv_is_allocated_above(backing_bs(bs), base, + ret =3D bdrv_is_allocated_above(backing_bs(bs), base, false, offset, n, &n); =20 /* Finish early if end of backing file has been reached */ --=20 2.18.0 From nobody Sat May 4 14:54:08 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=virtuozzo.com ARC-Seal: i=1; a=rsa-sha256; t=1555928470; cv=none; d=zoho.com; s=zohoarc; b=ZsE/ao6kK8PNvshL8mghTd49DSqnClTA2XyzbGpw+l/0YAJpXPaufM8p0WAFTahEaSBMqpngujTy9qt/ZmDXtgb4AroY6pAMqdhIOf7kZq25jBzQaBKqzHFwciqq0nDUcW/F/MzjKfPi6FCNERFaYB5M3S1BDcAHE4qekWlVUVM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1555928470; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=+/Leq7fLKgHqU95LXmujhPKSH+jENaMxObEJKmOpvMA=; b=bH9w0oDZFRC8TA9NmQ27RrYbPHD1ii3zMgCUnbnCqAq4L/Xh2zCF0UvJ2/Wrs7VlCa01IcbWVvAslVxEcCp6iGypQH7FiLyicb5uafdPSqlNJ/HZEajITvylkc4fKdzCQam7P5cZHiTqB08hUq6bGgNSWFMK/g4MMlvHKOccSPk= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1555928470349784.9922042142065; Mon, 22 Apr 2019 03:21:10 -0700 (PDT) Received: from localhost ([127.0.0.1]:35148 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hIW4I-0003qd-Iz for importer@patchew.org; Mon, 22 Apr 2019 06:20:58 -0400 Received: from eggs.gnu.org ([209.51.188.92]:57995) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hIW2Y-0002xf-7x for qemu-devel@nongnu.org; Mon, 22 Apr 2019 06:19:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hIW2W-0006Y9-RP for qemu-devel@nongnu.org; Mon, 22 Apr 2019 06:19:10 -0400 Received: from relay.sw.ru ([185.231.240.75]:44546) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hIW2W-0006Wg-Jd; Mon, 22 Apr 2019 06:19:08 -0400 Received: from [10.28.8.145] (helo=kvm.sw.ru) by relay.sw.ru with esmtp (Exim 4.91) (envelope-from ) id 1hIW2P-00029b-P8; Mon, 22 Apr 2019 13:19:02 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Mon, 22 Apr 2019 13:18:59 +0300 Message-Id: <20190422101900.13897-3-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20190422101900.13897-1-vsementsov@virtuozzo.com> References: <20190422101900.13897-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 185.231.240.75 Subject: [Qemu-devel] [PATCH v5 2/3] block/stream: refactor stream_run: drop goto 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: fam@euphon.net, kwolf@redhat.com, vsementsov@virtuozzo.com, berto@igalia.com, wencongyang2@huawei.com, xiechanglong.d@gmail.com, mreitz@redhat.com, stefanha@redhat.com, andrey.shinkevich@virtuozzo.com, den@openvz.org, jsnow@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The goto is unnecessary in the stream_run() since the common exit code was removed in the commit eb23654dbe43b549ea2a9ebff9d8e: "jobs: utilize job_exit shim". Signed-off-by: Vladimir Sementsov-Ogievskiy Signed-off-by: Andrey Shinkevich Reviewed-by: Alberto Garcia --- block/stream.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/block/stream.c b/block/stream.c index 0920092ed2..e73a3201c8 100644 --- a/block/stream.c +++ b/block/stream.c @@ -122,13 +122,12 @@ static int coroutine_fn stream_run(Job *job, Error **= errp) void *buf; =20 if (!bs->backing) { - goto out; + return 0; } =20 len =3D bdrv_getlength(bs); if (len < 0) { - ret =3D len; - goto out; + return len; } job_progress_set_remaining(&s->common.job, len); =20 @@ -205,14 +204,10 @@ static int coroutine_fn stream_run(Job *job, Error **= errp) bdrv_disable_copy_on_read(bs); } =20 - /* Do not remove the backing file if an error was there but ignored. = */ - ret =3D error; - qemu_vfree(buf); =20 -out: - /* Modify backing chain and close BDSes in main loop */ - return ret; + /* Do not remove the backing file if an error was there but ignored. */ + return error; } =20 static const BlockJobDriver stream_job_driver =3D { --=20 2.18.0 From nobody Sat May 4 14:54:08 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=virtuozzo.com ARC-Seal: i=1; a=rsa-sha256; t=1555928474; cv=none; d=zoho.com; s=zohoarc; b=D2kZmiXM5bOFVKiIyWHYD7fTAa8mi0BF85v7SMe/e8ZzPRn8rRPgeundcgnyGjZwKR1PBhRTpha1tQVVWVGqu/xWMKnItwzUYL/SuerYVUXm3zBdfqOBNou2++HKGn9FTyT/vO52xLMQaSAFBNMwEoAaJIwdny9D3Jga0Elxyhs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1555928474; h=Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=02y9UdowFvV2IrJNVXjWR0xs865FOEuHj3I7UAjUWvM=; b=gIPruQGXhhW1+N75fQN1cVe9LssU0+FP5FxecTtlRs0x0lHDlrMuCDoEwnFuBUvvuxSWSsluxW8EYFPvCvAzGiWs/qj/FizNHFS+rRoaWnWNA7D+9x4Y9ZFNoeO4x291lvPsZ+ktZlT/xPlDPdoV30SdxGklfLQDeE6F5ZkeW4I= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (209.51.188.17 [209.51.188.17]) by mx.zohomail.com with SMTPS id 1555928474040477.4231334904224; Mon, 22 Apr 2019 03:21:14 -0700 (PDT) Received: from localhost ([127.0.0.1]:35150 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hIW4M-0003rI-1P for importer@patchew.org; Mon, 22 Apr 2019 06:21:02 -0400 Received: from eggs.gnu.org ([209.51.188.92]:58013) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hIW2Y-0002xq-TB for qemu-devel@nongnu.org; Mon, 22 Apr 2019 06:19:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hIW2X-0006Yc-4F for qemu-devel@nongnu.org; Mon, 22 Apr 2019 06:19:10 -0400 Received: from relay.sw.ru ([185.231.240.75]:44552) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hIW2W-0006Wi-RZ; Mon, 22 Apr 2019 06:19:09 -0400 Received: from [10.28.8.145] (helo=kvm.sw.ru) by relay.sw.ru with esmtp (Exim 4.91) (envelope-from ) id 1hIW2Q-00029b-AS; Mon, 22 Apr 2019 13:19:02 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Mon, 22 Apr 2019 13:19:00 +0300 Message-Id: <20190422101900.13897-4-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20190422101900.13897-1-vsementsov@virtuozzo.com> References: <20190422101900.13897-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 185.231.240.75 Subject: [Qemu-devel] [PATCH v5 3/3] block/stream: introduce a bottom 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: fam@euphon.net, kwolf@redhat.com, vsementsov@virtuozzo.com, berto@igalia.com, wencongyang2@huawei.com, xiechanglong.d@gmail.com, mreitz@redhat.com, stefanha@redhat.com, andrey.shinkevich@virtuozzo.com, den@openvz.org, jsnow@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Andrey Shinkevich The bottom node is the intermediate block device that has the base as its backing image. It is used instead of the base node while a block stream job is running to avoid dependency on the base that may change due to the parallel jobs. The change may take place due to a filter node as well that is inserted between the base and the intermediate bottom node. It occurs when the base node is the top one for another commit or stream job. After the introduction of the bottom node, don't freeze its backing child, that's the base, anymore. Suggested-by: Vladimir Sementsov-Ogievskiy Signed-off-by: Andrey Shinkevich Reviewed-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Alberto Garcia --- block/stream.c | 49 +++++++++++++++++++++--------------------- tests/qemu-iotests/245 | 4 ++-- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/block/stream.c b/block/stream.c index e73a3201c8..c39212eb3c 100644 --- a/block/stream.c +++ b/block/stream.c @@ -31,7 +31,7 @@ enum { =20 typedef struct StreamBlockJob { BlockJob common; - BlockDriverState *base; + BlockDriverState *bottom; BlockdevOnError on_error; char *backing_file_str; bool bs_read_only; @@ -56,7 +56,7 @@ static void stream_abort(Job *job) =20 if (s->chain_frozen) { BlockJob *bjob =3D &s->common; - bdrv_unfreeze_backing_chain(blk_bs(bjob->blk), s->base); + bdrv_unfreeze_backing_chain(blk_bs(bjob->blk), s->bottom); } } =20 @@ -65,11 +65,11 @@ static int stream_prepare(Job *job) StreamBlockJob *s =3D container_of(job, StreamBlockJob, common.job); BlockJob *bjob =3D &s->common; BlockDriverState *bs =3D blk_bs(bjob->blk); - BlockDriverState *base =3D s->base; + BlockDriverState *base =3D backing_bs(s->bottom); Error *local_err =3D NULL; int ret =3D 0; =20 - bdrv_unfreeze_backing_chain(bs, base); + bdrv_unfreeze_backing_chain(bs, s->bottom); s->chain_frozen =3D false; =20 if (bs->backing) { @@ -112,7 +112,7 @@ static int coroutine_fn stream_run(Job *job, Error **er= rp) StreamBlockJob *s =3D container_of(job, StreamBlockJob, common.job); BlockBackend *blk =3D s->common.blk; BlockDriverState *bs =3D blk_bs(blk); - BlockDriverState *base =3D s->base; + bool enable_cor =3D !backing_bs(s->bottom); int64_t len; int64_t offset =3D 0; uint64_t delay_ns =3D 0; @@ -121,7 +121,8 @@ static int coroutine_fn stream_run(Job *job, Error **er= rp) int64_t n =3D 0; /* bytes */ void *buf; =20 - if (!bs->backing) { + if (bs =3D=3D s->bottom) { + /* Nothing to stream */ return 0; } =20 @@ -138,7 +139,7 @@ static int coroutine_fn stream_run(Job *job, Error **er= rp) * backing chain since the copy-on-read operation does not take base i= nto * account. */ - if (!base) { + if (enable_cor) { bdrv_enable_copy_on_read(bs); } =20 @@ -161,9 +162,8 @@ static int coroutine_fn stream_run(Job *job, Error **er= rp) } else if (ret >=3D 0) { /* Copy if allocated in the intermediate images. Limit to the * known-unallocated area [offset, offset+n*BDRV_SECTOR_SIZE).= */ - ret =3D bdrv_is_allocated_above(backing_bs(bs), base, false, + ret =3D bdrv_is_allocated_above(backing_bs(bs), s->bottom, tru= e, offset, n, &n); - /* Finish early if end of backing file has been reached */ if (ret =3D=3D 0 && n =3D=3D 0) { n =3D len - offset; @@ -200,7 +200,7 @@ static int coroutine_fn stream_run(Job *job, Error **er= rp) } } =20 - if (!base) { + if (enable_cor) { bdrv_disable_copy_on_read(bs); } =20 @@ -232,8 +232,10 @@ void stream_start(const char *job_id, BlockDriverState= *bs, StreamBlockJob *s; BlockDriverState *iter; bool bs_read_only; + int basic_flags =3D BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE_UNCHANGE= D; + BlockDriverState *bottom =3D bdrv_find_overlay(bs, base); =20 - if (bdrv_freeze_backing_chain(bs, base, errp) < 0) { + if (bdrv_freeze_backing_chain(bs, bottom, errp) < 0) { return; } =20 @@ -250,26 +252,25 @@ void stream_start(const char *job_id, BlockDriverStat= e *bs, * 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, NULL, 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, + basic_flags | BLK_PERM_GRAPH_MOD, + basic_flags | BLK_PERM_WRITE, speed, creation_flags, NULL, NULL, errp); if (!s) { goto fail; } =20 - /* 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)) { - block_job_add_bdrv(&s->common, "intermediate node", iter, 0, - BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE_UNCHA= NGED, - &error_abort); + /* + * Block all intermediate nodes between bs and bottom (inclusive), bec= ause + * they will disappear from the chain after this operation. The stream= ing + * job reads every block only once, assuming that it doesn't change, so + * forbid writes and resizes. + */ + for (iter =3D bs; iter !=3D bottom; iter =3D backing_bs(iter)) { + block_job_add_bdrv(&s->common, "intermediate node", backing_bs(ite= r), + 0, basic_flags, &error_abort); } =20 - s->base =3D base; + s->bottom =3D bottom; s->backing_file_str =3D g_strdup(backing_file_str); s->bs_read_only =3D bs_read_only; s->chain_frozen =3D true; diff --git a/tests/qemu-iotests/245 b/tests/qemu-iotests/245 index a04c6235c1..006f9f72f0 100644 --- a/tests/qemu-iotests/245 +++ b/tests/qemu-iotests/245 @@ -865,9 +865,9 @@ class TestBlockdevReopen(iotests.QMPTestCase): device =3D 'hd0', base_node =3D 'hd2', speed = =3D 512 * 1024) self.assert_qmp(result, 'return', {}) =20 - # We can't remove hd2 while the stream job is ongoing + # We can remove hd2 while the stream job is ongoing opts['backing']['backing'] =3D None - self.reopen(opts, {}, "Cannot change 'backing' link from 'hd1' to = 'hd2'") + self.reopen(opts, {}) =20 # We can't remove hd1 while the stream job is ongoing opts['backing'] =3D None --=20 2.18.0