From nobody Sun Feb 8 18:09:13 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.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; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580148073613541.4705330623088; Mon, 27 Jan 2020 10:01:13 -0800 (PST) Received: from localhost ([::1]:49106 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8hE-0000tY-H1 for importer@patchew.org; Mon, 27 Jan 2020 13:01:12 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:54884) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8cP-00023B-Mn for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:14 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iw8cO-0002jQ-Fq for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:13 -0500 Received: from us-smtp-1.mimecast.com ([205.139.110.61]:32789 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iw8cO-0002ip-CS for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:12 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-308-4xA8Ppo7OTKtT9dMynd0KQ-1; Mon, 27 Jan 2020 12:56:07 -0500 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C9A3A107ACC4; Mon, 27 Jan 2020 17:56:06 +0000 (UTC) Received: from linux.fritz.box.com (ovpn-117-108.ams2.redhat.com [10.36.117.108]) by smtp.corp.redhat.com (Postfix) with ESMTP id CF505863C0; Mon, 27 Jan 2020 17:56:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580147772; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=mJuBfHMwEGp02SAr4dkBpu+8wDNXv0Qba2ws4MC9toU=; b=W9ZKYq9AMadX7+cl3ll2+R+QeAeoHAE9ljeXLMFxo48E97oUvrFy23wUgLJLXsl5F+Yx2C k5Dz3bZP5tOphTSJ78OiqjzxguQSQt8AaYvtOqQe4DE0mWDnuTWAZMJ6T3zf7x1QI+F198 WFFfE6vd4g0i7tBo5ObKMfPa1HAOl7o= From: Kevin Wolf To: qemu-block@nongnu.org Subject: [PULL 01/13] iotests.py: Let wait_migration wait even more Date: Mon, 27 Jan 2020 18:55:47 +0100 Message-Id: <20200127175559.18173-2-kwolf@redhat.com> In-Reply-To: <20200127175559.18173-1-kwolf@redhat.com> References: <20200127175559.18173-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-MC-Unique: 4xA8Ppo7OTKtT9dMynd0KQ-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 205.139.110.61 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, peter.maydell@linaro.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Max Reitz The "migration completed" event may be sent (on the source, to be specific) before the migration is actually completed, so the VM runstate will still be "finish-migrate" instead of "postmigrate". So ask the users of VM.wait_migration() to specify the final runstate they desire and then poll the VM until it has reached that state. (This should be over very quickly, so busy polling is fine.) Without this patch, I see intermittent failures in the new iotest 280 under high system load. I have not yet seen such failures with other iotests that use VM.wait_migration() and query-status afterwards, but maybe they just occur even more rarely, or it is because they also wait on the destination VM to be running. Signed-off-by: Max Reitz Signed-off-by: Kevin Wolf --- tests/qemu-iotests/iotests.py | 6 +++++- tests/qemu-iotests/234 | 8 ++++---- tests/qemu-iotests/262 | 4 ++-- tests/qemu-iotests/280 | 2 +- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py index 13fd8b5cd2..0b62c42851 100644 --- a/tests/qemu-iotests/iotests.py +++ b/tests/qemu-iotests/iotests.py @@ -668,12 +668,16 @@ class VM(qtest.QEMUQtestMachine): } ])) =20 - def wait_migration(self): + def wait_migration(self, expect_runstate): while True: event =3D self.event_wait('MIGRATION') log(event, filters=3D[filter_qmp_event]) if event['data']['status'] =3D=3D 'completed': break + # The event may occur in finish-migrate, so wait for the expected + # post-migration runstate + while self.qmp('query-status')['return']['status'] !=3D expect_run= state: + pass =20 def node_info(self, node_name): nodes =3D self.qmp('query-named-block-nodes') diff --git a/tests/qemu-iotests/234 b/tests/qemu-iotests/234 index 34c818c485..59a7f949ec 100755 --- a/tests/qemu-iotests/234 +++ b/tests/qemu-iotests/234 @@ -69,9 +69,9 @@ with iotests.FilePath('img') as img_path, \ iotests.log(vm_a.qmp('migrate', uri=3D'exec:cat >%s' % (fifo_a))) with iotests.Timeout(3, 'Migration does not complete'): # Wait for the source first (which includes setup=3Dsetup) - vm_a.wait_migration() + vm_a.wait_migration('postmigrate') # Wait for the destination second (which does not) - vm_b.wait_migration() + vm_b.wait_migration('running') =20 iotests.log(vm_a.qmp('query-migrate')['return']['status']) iotests.log(vm_b.qmp('query-migrate')['return']['status']) @@ -98,9 +98,9 @@ with iotests.FilePath('img') as img_path, \ iotests.log(vm_b.qmp('migrate', uri=3D'exec:cat >%s' % (fifo_b))) with iotests.Timeout(3, 'Migration does not complete'): # Wait for the source first (which includes setup=3Dsetup) - vm_b.wait_migration() + vm_b.wait_migration('postmigrate') # Wait for the destination second (which does not) - vm_a.wait_migration() + vm_a.wait_migration('running') =20 iotests.log(vm_a.qmp('query-migrate')['return']['status']) iotests.log(vm_b.qmp('query-migrate')['return']['status']) diff --git a/tests/qemu-iotests/262 b/tests/qemu-iotests/262 index 0963daa806..bbcb5260a6 100755 --- a/tests/qemu-iotests/262 +++ b/tests/qemu-iotests/262 @@ -71,9 +71,9 @@ with iotests.FilePath('img') as img_path, \ iotests.log(vm_a.qmp('migrate', uri=3D'exec:cat >%s' % (fifo))) with iotests.Timeout(3, 'Migration does not complete'): # Wait for the source first (which includes setup=3Dsetup) - vm_a.wait_migration() + vm_a.wait_migration('postmigrate') # Wait for the destination second (which does not) - vm_b.wait_migration() + vm_b.wait_migration('running') =20 iotests.log(vm_a.qmp('query-migrate')['return']['status']) iotests.log(vm_b.qmp('query-migrate')['return']['status']) diff --git a/tests/qemu-iotests/280 b/tests/qemu-iotests/280 index 0b1fa8e1d8..85e9114c5e 100755 --- a/tests/qemu-iotests/280 +++ b/tests/qemu-iotests/280 @@ -45,7 +45,7 @@ with iotests.FilePath('base') as base_path , \ vm.qmp_log('migrate', uri=3D'exec:cat > /dev/null') =20 with iotests.Timeout(3, 'Migration does not complete'): - vm.wait_migration() + vm.wait_migration('postmigrate') =20 iotests.log('\nVM is now stopped:') iotests.log(vm.qmp('query-migrate')['return']['status']) --=20 2.20.1 From nobody Sun Feb 8 18:09:13 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.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; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580147963813676.8452287808549; Mon, 27 Jan 2020 09:59:23 -0800 (PST) Received: from localhost ([::1]:49042 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8fS-0006ik-Pg for importer@patchew.org; Mon, 27 Jan 2020 12:59:22 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:54912) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8cR-00025Z-3I for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:16 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iw8cP-0002kF-HZ for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:15 -0500 Received: from us-smtp-1.mimecast.com ([207.211.31.81]:28451 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iw8cP-0002k7-Eh for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:13 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-339-qjDZron4MDGlfGLOY3BkBQ-1; Mon, 27 Jan 2020 12:56:09 -0500 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 130FF804C24; Mon, 27 Jan 2020 17:56:08 +0000 (UTC) Received: from linux.fritz.box.com (ovpn-117-108.ams2.redhat.com [10.36.117.108]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1CC9E863CE; Mon, 27 Jan 2020 17:56:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580147773; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=JhNYikyggMXNLapw/CC2IM7fX9UYRW8lpBkJAnDhDX4=; b=LsBQdCvtzeAoj/1TenWhwEkaY9uAWgr23jYyxH13cm5N2iB6CqDNNx0DoGpYuzf8FqN9QR udS/7jwUhTZz0icYhPcDmgmSxU82CoohMeWhiFoRDD0bOQ3hziawE1UFlQKxYXengm15PT breZtwDkOadTn8+WCqqIAto4GwSnR2k= From: Kevin Wolf To: qemu-block@nongnu.org Subject: [PULL 02/13] iotests: Add more "skip_if_unsupported" statements to the python tests Date: Mon, 27 Jan 2020 18:55:48 +0100 Message-Id: <20200127175559.18173-3-kwolf@redhat.com> In-Reply-To: <20200127175559.18173-1-kwolf@redhat.com> References: <20200127175559.18173-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-MC-Unique: qjDZron4MDGlfGLOY3BkBQ-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 207.211.31.81 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, peter.maydell@linaro.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Thomas Huth The python code already contains a possibility to skip tests if the corresponding driver is not available in the qemu binary - use it in more spots to avoid that the tests are failing if the driver has been disabled. While we're at it, we can now also remove some of the old checks that were using iotests.supports_quorum() - and which were apparently not working as expected since the tests aborted instead of being skipped when "quorum" was missing in the QEMU binary. Signed-off-by: Thomas Huth Signed-off-by: Kevin Wolf --- tests/qemu-iotests/030 | 4 +--- tests/qemu-iotests/040 | 2 ++ tests/qemu-iotests/041 | 39 +++------------------------------------ tests/qemu-iotests/245 | 2 ++ 4 files changed, 8 insertions(+), 39 deletions(-) diff --git a/tests/qemu-iotests/030 b/tests/qemu-iotests/030 index be35bde06f..0990681c1e 100755 --- a/tests/qemu-iotests/030 +++ b/tests/qemu-iotests/030 @@ -530,6 +530,7 @@ class TestQuorum(iotests.QMPTestCase): children =3D [] backing =3D [] =20 + @iotests.skip_if_unsupported(['quorum']) def setUp(self): opts =3D ['driver=3Dquorum', 'vote-threshold=3D2'] =20 @@ -560,9 +561,6 @@ class TestQuorum(iotests.QMPTestCase): os.remove(img) =20 def test_stream_quorum(self): - if not iotests.supports_quorum(): - return - self.assertNotEqual(qemu_io('-f', iotests.imgfmt, '-rU', '-c', 'ma= p', self.children[0]), qemu_io('-f', iotests.imgfmt, '-rU', '-c', 'ma= p', self.backing[0]), 'image file map matches backing file before st= reaming') diff --git a/tests/qemu-iotests/040 b/tests/qemu-iotests/040 index 762ad1ebcb..74f62c3c4a 100755 --- a/tests/qemu-iotests/040 +++ b/tests/qemu-iotests/040 @@ -106,6 +106,7 @@ class TestSingleDrive(ImageCommitTestCase): self.assertEqual(-1, qemu_io('-f', 'raw', '-c', 'read -P 0xab 0 52= 4288', backing_img).find("verification failed")) self.assertEqual(-1, qemu_io('-f', 'raw', '-c', 'read -P 0xef 5242= 88 524288', backing_img).find("verification failed")) =20 + @iotests.skip_if_unsupported(['throttle']) def test_commit_with_filter_and_quit(self): result =3D self.vm.qmp('object-add', qom_type=3D'throttle-group', = id=3D'tg') self.assert_qmp(result, 'return', {}) @@ -125,6 +126,7 @@ class TestSingleDrive(ImageCommitTestCase): self.has_quit =3D True =20 # Same as above, but this time we add the filter after starting the job + @iotests.skip_if_unsupported(['throttle']) def test_commit_plus_filter_and_quit(self): result =3D self.vm.qmp('object-add', qom_type=3D'throttle-group', = id=3D'tg') self.assert_qmp(result, 'return', {}) diff --git a/tests/qemu-iotests/041 b/tests/qemu-iotests/041 index d7be30b62b..c07437fda1 100755 --- a/tests/qemu-iotests/041 +++ b/tests/qemu-iotests/041 @@ -871,6 +871,7 @@ class TestRepairQuorum(iotests.QMPTestCase): image_len =3D 1 * 1024 * 1024 # MB IMAGES =3D [ quorum_img1, quorum_img2, quorum_img3 ] =20 + @iotests.skip_if_unsupported(['quorum']) def setUp(self): self.vm =3D iotests.VM() =20 @@ -891,9 +892,8 @@ class TestRepairQuorum(iotests.QMPTestCase): #assemble the quorum block device from the individual files args =3D { "driver": "quorum", "node-name": "quorum0", "vote-threshold": 2, "children": [ "img0", "img1", "img2"= ] } - if iotests.supports_quorum(): - result =3D self.vm.qmp("blockdev-add", **args) - self.assert_qmp(result, 'return', {}) + result =3D self.vm.qmp("blockdev-add", **args) + self.assert_qmp(result, 'return', {}) =20 =20 def tearDown(self): @@ -906,9 +906,6 @@ class TestRepairQuorum(iotests.QMPTestCase): pass =20 def test_complete(self): - if not iotests.supports_quorum(): - return - self.assert_no_active_block_jobs() =20 result =3D self.vm.qmp('drive-mirror', job_id=3D'job0', device=3D'= quorum0', @@ -925,9 +922,6 @@ class TestRepairQuorum(iotests.QMPTestCase): 'target image does not match source after mirrorin= g') =20 def test_cancel(self): - if not iotests.supports_quorum(): - return - self.assert_no_active_block_jobs() =20 result =3D self.vm.qmp('drive-mirror', job_id=3D'job0', device=3D'= quorum0', @@ -942,9 +936,6 @@ class TestRepairQuorum(iotests.QMPTestCase): self.vm.shutdown() =20 def test_cancel_after_ready(self): - if not iotests.supports_quorum(): - return - self.assert_no_active_block_jobs() =20 result =3D self.vm.qmp('drive-mirror', job_id=3D'job0', device=3D'= quorum0', @@ -961,9 +952,6 @@ class TestRepairQuorum(iotests.QMPTestCase): 'target image does not match source after mirrorin= g') =20 def test_pause(self): - if not iotests.supports_quorum(): - return - self.assert_no_active_block_jobs() =20 result =3D self.vm.qmp('drive-mirror', job_id=3D'job0', device=3D'= quorum0', @@ -989,9 +977,6 @@ class TestRepairQuorum(iotests.QMPTestCase): 'target image does not match source after mirrorin= g') =20 def test_medium_not_found(self): - if not iotests.supports_quorum(): - return - if iotests.qemu_default_machine !=3D 'pc': return =20 @@ -1003,9 +988,6 @@ class TestRepairQuorum(iotests.QMPTestCase): self.assert_qmp(result, 'error/class', 'GenericError') =20 def test_image_not_found(self): - if not iotests.supports_quorum(): - return - result =3D self.vm.qmp('drive-mirror', job_id=3D'job0', device=3D'= quorum0', sync=3D'full', node_name=3D'repair0', replace= s=3D'img1', mode=3D'existing', target=3Dquorum_repair_img, @@ -1013,9 +995,6 @@ class TestRepairQuorum(iotests.QMPTestCase): self.assert_qmp(result, 'error/class', 'GenericError') =20 def test_device_not_found(self): - if not iotests.supports_quorum(): - return - result =3D self.vm.qmp('drive-mirror', job_id=3D'job0', device=3D'nonexistent', sync=3D'full', node_name=3D'repair0', @@ -1024,9 +1003,6 @@ class TestRepairQuorum(iotests.QMPTestCase): self.assert_qmp(result, 'error/class', 'GenericError') =20 def test_wrong_sync_mode(self): - if not iotests.supports_quorum(): - return - result =3D self.vm.qmp('drive-mirror', device=3D'quorum0', job_id= =3D'job0', node_name=3D'repair0', replaces=3D'img1', @@ -1034,27 +1010,18 @@ class TestRepairQuorum(iotests.QMPTestCase): self.assert_qmp(result, 'error/class', 'GenericError') =20 def test_no_node_name(self): - if not iotests.supports_quorum(): - return - result =3D self.vm.qmp('drive-mirror', job_id=3D'job0', device=3D'= quorum0', sync=3D'full', replaces=3D'img1', target=3Dquorum_repair_img, format=3Diotests.= imgfmt) self.assert_qmp(result, 'error/class', 'GenericError') =20 def test_nonexistent_replaces(self): - if not iotests.supports_quorum(): - return - result =3D self.vm.qmp('drive-mirror', job_id=3D'job0', device=3D'= quorum0', sync=3D'full', node_name=3D'repair0', replace= s=3D'img77', target=3Dquorum_repair_img, format=3Diotests.= imgfmt) self.assert_qmp(result, 'error/class', 'GenericError') =20 def test_after_a_quorum_snapshot(self): - if not iotests.supports_quorum(): - return - result =3D self.vm.qmp('blockdev-snapshot-sync', node_name=3D'img1= ', snapshot_file=3Dquorum_snapshot_file, snapshot_node_name=3D"snap1"); diff --git a/tests/qemu-iotests/245 b/tests/qemu-iotests/245 index e66a23c5f0..d12b253065 100644 --- a/tests/qemu-iotests/245 +++ b/tests/qemu-iotests/245 @@ -478,6 +478,7 @@ class TestBlockdevReopen(iotests.QMPTestCase): # This test verifies that we can't change the children of a block # device during a reopen operation in a way that would create # cycles in the node graph + @iotests.skip_if_unsupported(['blkverify']) def test_graph_cycles(self): opts =3D [] =20 @@ -534,6 +535,7 @@ class TestBlockdevReopen(iotests.QMPTestCase): self.assert_qmp(result, 'return', {}) =20 # Misc reopen tests with different block drivers + @iotests.skip_if_unsupported(['quorum', 'throttle']) def test_misc_drivers(self): #################### ###### quorum ###### --=20 2.20.1 From nobody Sun Feb 8 18:09:13 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.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; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580147977360650.8238538030279; Mon, 27 Jan 2020 09:59:37 -0800 (PST) Received: from localhost ([::1]:49054 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8fg-0007Lu-9m for importer@patchew.org; Mon, 27 Jan 2020 12:59:36 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:54888) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8cP-00023T-VV for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:14 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iw8cO-0002jq-Qc for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:13 -0500 Received: from us-smtp-1.mimecast.com ([207.211.31.81]:41313 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iw8cO-0002je-N4 for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:12 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-401-2GPKQLrXNhWu7L_D8_AbTg-1; Mon, 27 Jan 2020 12:56:10 -0500 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 52E6D10054E3; Mon, 27 Jan 2020 17:56:09 +0000 (UTC) Received: from linux.fritz.box.com (ovpn-117-108.ams2.redhat.com [10.36.117.108]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5A8DA811FA; Mon, 27 Jan 2020 17:56:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580147772; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=whY9m/n393v/4z6oCJTlCyXaViieQSRjL7N9uY3PsLg=; b=A1xHN6im3K8Noy1nUBLHfnrPnXsTVnyyKGnBeaE4g0T8Fs/1nYMiVOxQKOG22C87/7VinK CoNg3/oimfXlxZ2qRJqE+oIxvksLDwiDr1NOJyYXwvr9YyWSp/vcxCgFRzOwqS+fH2dH5l IOZjV7MJmX6QD4Qxh5IrHxy1KH9M3Mk= From: Kevin Wolf To: qemu-block@nongnu.org Subject: [PULL 03/13] blockdev: fix coding style issues in drive_backup_prepare Date: Mon, 27 Jan 2020 18:55:49 +0100 Message-Id: <20200127175559.18173-4-kwolf@redhat.com> In-Reply-To: <20200127175559.18173-1-kwolf@redhat.com> References: <20200127175559.18173-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-MC-Unique: 2GPKQLrXNhWu7L_D8_AbTg-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 207.211.31.81 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, peter.maydell@linaro.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Sergio Lopez Fix a couple of minor coding style issues in drive_backup_prepare. Signed-off-by: Sergio Lopez Reviewed-by: Max Reitz Reviewed-by: Kevin Wolf Signed-off-by: Kevin Wolf --- blockdev.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/blockdev.c b/blockdev.c index 8e029e9c01..553e315972 100644 --- a/blockdev.c +++ b/blockdev.c @@ -3620,7 +3620,7 @@ static BlockJob *do_drive_backup(DriveBackup *backup,= JobTxn *txn, =20 if (!backup->has_format) { backup->format =3D backup->mode =3D=3D NEW_IMAGE_MODE_EXISTING ? - NULL : (char*) bs->drv->format_name; + NULL : (char *) bs->drv->format_name; } =20 /* Early check to avoid creating target */ @@ -3630,8 +3630,10 @@ static BlockJob *do_drive_backup(DriveBackup *backup= , JobTxn *txn, =20 flags =3D bs->open_flags | BDRV_O_RDWR; =20 - /* See if we have a backing HD we can use to create our new image - * on top of. */ + /* + * See if we have a backing HD we can use to create our new image + * on top of. + */ if (backup->sync =3D=3D MIRROR_SYNC_MODE_TOP) { source =3D backing_bs(bs); if (!source) { --=20 2.20.1 From nobody Sun Feb 8 18:09:13 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.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; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580147880671846.7931256791327; Mon, 27 Jan 2020 09:58:00 -0800 (PST) Received: from localhost ([::1]:49022 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8e7-0004Xo-D8 for importer@patchew.org; Mon, 27 Jan 2020 12:57:59 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:54982) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8cY-0002EX-C5 for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iw8cS-0002p8-PB for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:22 -0500 Received: from us-smtp-delivery-1.mimecast.com ([205.139.110.120]:60963 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iw8cS-0002oJ-KP for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:16 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-224-BrnSvcz0NMGTkflbkKsqdA-1; Mon, 27 Jan 2020 12:56:11 -0500 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B780D100726D; Mon, 27 Jan 2020 17:56:10 +0000 (UTC) Received: from linux.fritz.box.com (ovpn-117-108.ams2.redhat.com [10.36.117.108]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9C60A811FA; Mon, 27 Jan 2020 17:56:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580147776; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=O1KnApslL9RQ06AWCJZWT09Y8cmrVADIaoAlEGGo0eA=; b=L5loOvfCnvEZRu0AckXnAFxytfliv/MqoGkYCp4WiwMo/Bx2eeCaozXFCS+gO2UXh2oZWD Kfuv9zarWuPn7aKPxRTE5Om4eiMNe0JV2B1cigJCwcklfhtaBJgD7RcJVHfPC5S50JLxdL LEiaNsemUVbjnbfZPTMULf7IOgkm3+c= From: Kevin Wolf To: qemu-block@nongnu.org Subject: [PULL 04/13] blockdev: unify qmp_drive_backup and drive-backup transaction paths Date: Mon, 27 Jan 2020 18:55:50 +0100 Message-Id: <20200127175559.18173-5-kwolf@redhat.com> In-Reply-To: <20200127175559.18173-1-kwolf@redhat.com> References: <20200127175559.18173-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-MC-Unique: BrnSvcz0NMGTkflbkKsqdA-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 205.139.110.120 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, peter.maydell@linaro.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Sergio Lopez Issuing a drive-backup from qmp_drive_backup takes a slightly different path than when it's issued from a transaction. In the code, this is manifested as some redundancy between do_drive_backup() and drive_backup_prepare(). This change unifies both paths, merging do_drive_backup() and drive_backup_prepare(), and changing qmp_drive_backup() to create a transaction instead of calling do_backup_common() direcly. As a side-effect, now qmp_drive_backup() is executed inside a drained section, as it happens when creating a drive-backup transaction. This change is visible from the user's perspective, as the job gets paused and immediately resumed before starting the actual work. Also fix tests 141, 185 and 219 to cope with the extra JOB_STATUS_CHANGE lines. Signed-off-by: Sergio Lopez Reviewed-by: Kevin Wolf Signed-off-by: Kevin Wolf --- blockdev.c | 224 +++++++++++++++++-------------------- tests/qemu-iotests/141.out | 2 + tests/qemu-iotests/185.out | 2 + tests/qemu-iotests/219 | 7 +- tests/qemu-iotests/219.out | 8 ++ 5 files changed, 117 insertions(+), 126 deletions(-) diff --git a/blockdev.c b/blockdev.c index 553e315972..5e85fc042e 100644 --- a/blockdev.c +++ b/blockdev.c @@ -1761,39 +1761,128 @@ typedef struct DriveBackupState { BlockJob *job; } DriveBackupState; =20 -static BlockJob *do_drive_backup(DriveBackup *backup, JobTxn *txn, - Error **errp); +static BlockJob *do_backup_common(BackupCommon *backup, + BlockDriverState *bs, + BlockDriverState *target_bs, + AioContext *aio_context, + JobTxn *txn, Error **errp); =20 static void drive_backup_prepare(BlkActionState *common, Error **errp) { DriveBackupState *state =3D DO_UPCAST(DriveBackupState, common, common= ); - BlockDriverState *bs; DriveBackup *backup; + BlockDriverState *bs; + BlockDriverState *target_bs; + BlockDriverState *source =3D NULL; AioContext *aio_context; + QDict *options; Error *local_err =3D NULL; + int flags; + int64_t size; + bool set_backing_hd =3D false; =20 assert(common->action->type =3D=3D TRANSACTION_ACTION_KIND_DRIVE_BACKU= P); backup =3D common->action->u.drive_backup.data; =20 + if (!backup->has_mode) { + backup->mode =3D NEW_IMAGE_MODE_ABSOLUTE_PATHS; + } + bs =3D bdrv_lookup_bs(backup->device, backup->device, errp); if (!bs) { return; } =20 + if (!bs->drv) { + error_setg(errp, "Device has no medium"); + return; + } + aio_context =3D bdrv_get_aio_context(bs); aio_context_acquire(aio_context); =20 /* Paired with .clean() */ bdrv_drained_begin(bs); =20 - state->bs =3D bs; + if (!backup->has_format) { + backup->format =3D backup->mode =3D=3D NEW_IMAGE_MODE_EXISTING ? + NULL : (char *) bs->drv->format_name; + } + + /* Early check to avoid creating target */ + if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_BACKUP_SOURCE, errp)) { + goto out; + } + + flags =3D bs->open_flags | BDRV_O_RDWR; + + /* + * See if we have a backing HD we can use to create our new image + * on top of. + */ + if (backup->sync =3D=3D MIRROR_SYNC_MODE_TOP) { + source =3D backing_bs(bs); + if (!source) { + backup->sync =3D MIRROR_SYNC_MODE_FULL; + } + } + if (backup->sync =3D=3D MIRROR_SYNC_MODE_NONE) { + source =3D bs; + flags |=3D BDRV_O_NO_BACKING; + set_backing_hd =3D true; + } + + size =3D bdrv_getlength(bs); + if (size < 0) { + error_setg_errno(errp, -size, "bdrv_getlength failed"); + goto out; + } + + if (backup->mode !=3D NEW_IMAGE_MODE_EXISTING) { + assert(backup->format); + if (source) { + bdrv_refresh_filename(source); + bdrv_img_create(backup->target, backup->format, source->filena= me, + source->drv->format_name, NULL, + size, flags, false, &local_err); + } else { + bdrv_img_create(backup->target, backup->format, NULL, NULL, NU= LL, + size, flags, false, &local_err); + } + } =20 - state->job =3D do_drive_backup(backup, common->block_job_txn, &local_e= rr); if (local_err) { error_propagate(errp, local_err); goto out; } =20 + options =3D qdict_new(); + qdict_put_str(options, "discard", "unmap"); + qdict_put_str(options, "detect-zeroes", "unmap"); + if (backup->format) { + qdict_put_str(options, "driver", backup->format); + } + + target_bs =3D bdrv_open(backup->target, NULL, options, flags, errp); + if (!target_bs) { + goto out; + } + + if (set_backing_hd) { + bdrv_set_backing_hd(target_bs, source, &local_err); + if (local_err) { + goto unref; + } + } + + state->bs =3D bs; + + state->job =3D do_backup_common(qapi_DriveBackup_base(backup), + bs, target_bs, aio_context, + common->block_job_txn, errp); + +unref: + bdrv_unref(target_bs); out: aio_context_release(aio_context); } @@ -3587,126 +3676,13 @@ static BlockJob *do_backup_common(BackupCommon *ba= ckup, return job; } =20 -static BlockJob *do_drive_backup(DriveBackup *backup, JobTxn *txn, - Error **errp) -{ - BlockDriverState *bs; - BlockDriverState *target_bs; - BlockDriverState *source =3D NULL; - BlockJob *job =3D NULL; - AioContext *aio_context; - QDict *options; - Error *local_err =3D NULL; - int flags; - int64_t size; - bool set_backing_hd =3D false; - - if (!backup->has_mode) { - backup->mode =3D NEW_IMAGE_MODE_ABSOLUTE_PATHS; - } - - bs =3D bdrv_lookup_bs(backup->device, backup->device, errp); - if (!bs) { - return NULL; - } - - if (!bs->drv) { - error_setg(errp, "Device has no medium"); - return NULL; - } - - aio_context =3D bdrv_get_aio_context(bs); - aio_context_acquire(aio_context); - - if (!backup->has_format) { - backup->format =3D backup->mode =3D=3D NEW_IMAGE_MODE_EXISTING ? - NULL : (char *) bs->drv->format_name; - } - - /* Early check to avoid creating target */ - if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_BACKUP_SOURCE, errp)) { - goto out; - } - - flags =3D bs->open_flags | BDRV_O_RDWR; - - /* - * See if we have a backing HD we can use to create our new image - * on top of. - */ - if (backup->sync =3D=3D MIRROR_SYNC_MODE_TOP) { - source =3D backing_bs(bs); - if (!source) { - backup->sync =3D MIRROR_SYNC_MODE_FULL; - } - } - if (backup->sync =3D=3D MIRROR_SYNC_MODE_NONE) { - source =3D bs; - flags |=3D BDRV_O_NO_BACKING; - set_backing_hd =3D true; - } - - size =3D bdrv_getlength(bs); - if (size < 0) { - error_setg_errno(errp, -size, "bdrv_getlength failed"); - goto out; - } - - if (backup->mode !=3D NEW_IMAGE_MODE_EXISTING) { - assert(backup->format); - if (source) { - bdrv_refresh_filename(source); - bdrv_img_create(backup->target, backup->format, source->filena= me, - source->drv->format_name, NULL, - size, flags, false, &local_err); - } else { - bdrv_img_create(backup->target, backup->format, NULL, NULL, NU= LL, - size, flags, false, &local_err); - } - } - - if (local_err) { - error_propagate(errp, local_err); - goto out; - } - - options =3D qdict_new(); - qdict_put_str(options, "discard", "unmap"); - qdict_put_str(options, "detect-zeroes", "unmap"); - if (backup->format) { - qdict_put_str(options, "driver", backup->format); - } - - target_bs =3D bdrv_open(backup->target, NULL, options, flags, errp); - if (!target_bs) { - goto out; - } - - if (set_backing_hd) { - bdrv_set_backing_hd(target_bs, source, &local_err); - if (local_err) { - goto unref; - } - } - - job =3D do_backup_common(qapi_DriveBackup_base(backup), - bs, target_bs, aio_context, txn, errp); - -unref: - bdrv_unref(target_bs); -out: - aio_context_release(aio_context); - return job; -} - -void qmp_drive_backup(DriveBackup *arg, Error **errp) +void qmp_drive_backup(DriveBackup *backup, Error **errp) { - - BlockJob *job; - job =3D do_drive_backup(arg, NULL, errp); - if (job) { - job_start(&job->job); - } + TransactionAction action =3D { + .type =3D TRANSACTION_ACTION_KIND_DRIVE_BACKUP, + .u.drive_backup.data =3D backup, + }; + blockdev_do_action(&action, errp); } =20 BlockDeviceInfoList *qmp_query_named_block_nodes(Error **errp) diff --git a/tests/qemu-iotests/141.out b/tests/qemu-iotests/141.out index 3645675ce8..263b680bdf 100644 --- a/tests/qemu-iotests/141.out +++ b/tests/qemu-iotests/141.out @@ -13,6 +13,8 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=3DIMGFMT size=3D10485= 76 backing_file=3DTEST_DIR/m. Formatting 'TEST_DIR/o.IMGFMT', fmt=3DIMGFMT size=3D1048576 backing_file= =3DTEST_DIR/t.IMGFMT backing_fmt=3DIMGFMT {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "job0"}} {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "job0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "paused", "id": "job0"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "job0"}} {'execute': 'blockdev-del', 'arguments': {'node-name': 'drv0'}} {"error": {"class": "GenericError", "desc": "Node 'drv0' is busy: node is = used as backing hd of 'NODE_NAME'"}} {'execute': 'block-job-cancel', 'arguments': {'device': 'job0'}} diff --git a/tests/qemu-iotests/185.out b/tests/qemu-iotests/185.out index 8379ac5854..9a3b65782b 100644 --- a/tests/qemu-iotests/185.out +++ b/tests/qemu-iotests/185.out @@ -65,6 +65,8 @@ Formatting 'TEST_DIR/t.qcow2.copy', fmt=3Dqcow2 size=3D67= 108864 cluster_size=3D65536 l Formatting 'TEST_DIR/t.qcow2.copy', fmt=3Dqcow2 size=3D67108864 cluster_si= ze=3D65536 lazy_refcounts=3Doff refcount_bits=3D16 {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "created", "id": "disk"}} {"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "disk"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "paused", "id": "disk"}} +{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event"= : "JOB_STATUS_CHANGE", "data": {"status": "running", "id": "disk"}} {"return": {}} { 'execute': 'quit' } {"return": {}} diff --git a/tests/qemu-iotests/219 b/tests/qemu-iotests/219 index e0c51662c0..655f54d881 100755 --- a/tests/qemu-iotests/219 +++ b/tests/qemu-iotests/219 @@ -63,7 +63,7 @@ def test_pause_resume(vm): # logged immediately iotests.log(vm.qmp('query-jobs')) =20 -def test_job_lifecycle(vm, job, job_args, has_ready=3DFalse): +def test_job_lifecycle(vm, job, job_args, has_ready=3DFalse, is_mirror=3DF= alse): global img_size =20 iotests.log('') @@ -135,6 +135,9 @@ def test_job_lifecycle(vm, job, job_args, has_ready=3DF= alse): iotests.log('Waiting for PENDING state...') iotests.log(iotests.filter_qmp_event(vm.event_wait('JOB_STATUS_CHANGE'= ))) iotests.log(iotests.filter_qmp_event(vm.event_wait('JOB_STATUS_CHANGE'= ))) + if is_mirror: + iotests.log(iotests.filter_qmp_event(vm.event_wait('JOB_STATUS_CHA= NGE'))) + iotests.log(iotests.filter_qmp_event(vm.event_wait('JOB_STATUS_CHA= NGE'))) =20 if not job_args.get('auto-finalize', True): # PENDING state: @@ -218,7 +221,7 @@ with iotests.FilePath('disk.img') as disk_path, \ =20 for auto_finalize in [True, False]: for auto_dismiss in [True, False]: - test_job_lifecycle(vm, 'drive-backup', job_args=3D{ + test_job_lifecycle(vm, 'drive-backup', is_mirror=3DTrue, job_a= rgs=3D{ 'device': 'drive0-node', 'target': copy_path, 'sync': 'full', diff --git a/tests/qemu-iotests/219.out b/tests/qemu-iotests/219.out index 8ebd3fee60..0ea5d0b9d5 100644 --- a/tests/qemu-iotests/219.out +++ b/tests/qemu-iotests/219.out @@ -135,6 +135,8 @@ Pause/resume in RUNNING {"return": {}} =20 Waiting for PENDING state... +{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE",= "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} +{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE"= , "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} {"data": {"id": "job0", "status": "waiting"}, "event": "JOB_STATUS_CHANGE"= , "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} {"data": {"id": "job0", "status": "pending"}, "event": "JOB_STATUS_CHANGE"= , "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} {"data": {"id": "job0", "status": "concluded"}, "event": "JOB_STATUS_CHANG= E", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} @@ -186,6 +188,8 @@ Pause/resume in RUNNING {"return": {}} =20 Waiting for PENDING state... +{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE",= "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} +{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE"= , "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} {"data": {"id": "job0", "status": "waiting"}, "event": "JOB_STATUS_CHANGE"= , "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} {"data": {"id": "job0", "status": "pending"}, "event": "JOB_STATUS_CHANGE"= , "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} {"data": {"id": "job0", "status": "concluded"}, "event": "JOB_STATUS_CHANG= E", "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} @@ -245,6 +249,8 @@ Pause/resume in RUNNING {"return": {}} =20 Waiting for PENDING state... +{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE",= "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} +{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE"= , "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} {"data": {"id": "job0", "status": "waiting"}, "event": "JOB_STATUS_CHANGE"= , "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} {"data": {"id": "job0", "status": "pending"}, "event": "JOB_STATUS_CHANGE"= , "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} {"return": [{"current-progress": 4194304, "id": "job0", "status": "pending= ", "total-progress": 4194304, "type": "backup"}]} @@ -304,6 +310,8 @@ Pause/resume in RUNNING {"return": {}} =20 Waiting for PENDING state... +{"data": {"id": "job0", "status": "paused"}, "event": "JOB_STATUS_CHANGE",= "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} +{"data": {"id": "job0", "status": "running"}, "event": "JOB_STATUS_CHANGE"= , "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} {"data": {"id": "job0", "status": "waiting"}, "event": "JOB_STATUS_CHANGE"= , "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} {"data": {"id": "job0", "status": "pending"}, "event": "JOB_STATUS_CHANGE"= , "timestamp": {"microseconds": "USECS", "seconds": "SECS"}} {"return": [{"current-progress": 4194304, "id": "job0", "status": "pending= ", "total-progress": 4194304, "type": "backup"}]} --=20 2.20.1 From nobody Sun Feb 8 18:09:13 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.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; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 158014817238192.91695559450272; Mon, 27 Jan 2020 10:02:52 -0800 (PST) Received: from localhost ([::1]:49142 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8io-0002sY-ML for importer@patchew.org; Mon, 27 Jan 2020 13:02:50 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:54980) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8cY-0002EU-BW for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:23 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iw8cT-0002pn-H5 for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:22 -0500 Received: from us-smtp-1.mimecast.com ([205.139.110.61]:44365 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iw8cT-0002pQ-Dz for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:17 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-138-GlR6iw4HNtOA8hxyVWDRWA-1; Mon, 27 Jan 2020 12:56:13 -0500 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 010A2804C21; Mon, 27 Jan 2020 17:56:12 +0000 (UTC) Received: from linux.fritz.box.com (ovpn-117-108.ams2.redhat.com [10.36.117.108]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0BF6F863C0; Mon, 27 Jan 2020 17:56:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580147777; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=eibWu5YYNXVA/nSIzjNe7DPtBXdmmzVCw/nu5hrUSWE=; b=KEH3LkW+jc5Zbp2aCAH00zlluQSSSoXe6ySahppEwtl32On0hBsDiqKzcakVU/OxEcPYmA /C2L5kKmdI1L3cFjqEHWkbu3wRoGUhmP+6Jl1NcNL8y/UgZ5J+/famjYjEcRvEuEf2Lg9w cNoc+0FJiItYWtSGZ936KRkKTB3gi80= From: Kevin Wolf To: qemu-block@nongnu.org Subject: [PULL 05/13] blockdev: unify qmp_blockdev_backup and blockdev-backup transaction paths Date: Mon, 27 Jan 2020 18:55:51 +0100 Message-Id: <20200127175559.18173-6-kwolf@redhat.com> In-Reply-To: <20200127175559.18173-1-kwolf@redhat.com> References: <20200127175559.18173-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-MC-Unique: GlR6iw4HNtOA8hxyVWDRWA-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 205.139.110.61 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, peter.maydell@linaro.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Sergio Lopez Issuing a blockdev-backup from qmp_blockdev_backup takes a slightly different path than when it's issued from a transaction. In the code, this is manifested as some redundancy between do_blockdev_backup() and blockdev_backup_prepare(). This change unifies both paths, merging do_blockdev_backup() and blockdev_backup_prepare(), and changing qmp_blockdev_backup() to create a transaction instead of calling do_backup_common() direcly. As a side-effect, now qmp_blockdev_backup() is executed inside a drained section, as it happens when creating a blockdev-backup transaction. This change is visible from the user's perspective, as the job gets paused and immediately resumed before starting the actual work. Signed-off-by: Sergio Lopez Reviewed-by: Max Reitz Reviewed-by: Kevin Wolf Signed-off-by: Kevin Wolf --- blockdev.c | 60 ++++++++++++------------------------------------------ 1 file changed, 13 insertions(+), 47 deletions(-) diff --git a/blockdev.c b/blockdev.c index 5e85fc042e..152a0f7454 100644 --- a/blockdev.c +++ b/blockdev.c @@ -1940,16 +1940,13 @@ typedef struct BlockdevBackupState { BlockJob *job; } BlockdevBackupState; =20 -static BlockJob *do_blockdev_backup(BlockdevBackup *backup, JobTxn *txn, - Error **errp); - static void blockdev_backup_prepare(BlkActionState *common, Error **errp) { BlockdevBackupState *state =3D DO_UPCAST(BlockdevBackupState, common, = common); BlockdevBackup *backup; - BlockDriverState *bs, *target; + BlockDriverState *bs; + BlockDriverState *target_bs; AioContext *aio_context; - Error *local_err =3D NULL; =20 assert(common->action->type =3D=3D TRANSACTION_ACTION_KIND_BLOCKDEV_BA= CKUP); backup =3D common->action->u.blockdev_backup.data; @@ -1959,8 +1956,8 @@ static void blockdev_backup_prepare(BlkActionState *c= ommon, Error **errp) return; } =20 - target =3D bdrv_lookup_bs(backup->target, backup->target, errp); - if (!target) { + target_bs =3D bdrv_lookup_bs(backup->target, backup->target, errp); + if (!target_bs) { return; } =20 @@ -1971,13 +1968,10 @@ static void blockdev_backup_prepare(BlkActionState = *common, Error **errp) /* Paired with .clean() */ bdrv_drained_begin(state->bs); =20 - state->job =3D do_blockdev_backup(backup, common->block_job_txn, &loca= l_err); - if (local_err) { - error_propagate(errp, local_err); - goto out; - } + state->job =3D do_backup_common(qapi_BlockdevBackup_base(backup), + bs, target_bs, aio_context, + common->block_job_txn, errp); =20 -out: aio_context_release(aio_context); } =20 @@ -3695,41 +3689,13 @@ XDbgBlockGraph *qmp_x_debug_query_block_graph(Error= **errp) return bdrv_get_xdbg_block_graph(errp); } =20 -BlockJob *do_blockdev_backup(BlockdevBackup *backup, JobTxn *txn, - Error **errp) +void qmp_blockdev_backup(BlockdevBackup *backup, Error **errp) { - BlockDriverState *bs; - BlockDriverState *target_bs; - AioContext *aio_context; - BlockJob *job; - - bs =3D bdrv_lookup_bs(backup->device, backup->device, errp); - if (!bs) { - return NULL; - } - - target_bs =3D bdrv_lookup_bs(backup->target, backup->target, errp); - if (!target_bs) { - return NULL; - } - - aio_context =3D bdrv_get_aio_context(bs); - aio_context_acquire(aio_context); - - job =3D do_backup_common(qapi_BlockdevBackup_base(backup), - bs, target_bs, aio_context, txn, errp); - - aio_context_release(aio_context); - return job; -} - -void qmp_blockdev_backup(BlockdevBackup *arg, Error **errp) -{ - BlockJob *job; - job =3D do_blockdev_backup(arg, NULL, errp); - if (job) { - job_start(&job->job); - } + TransactionAction action =3D { + .type =3D TRANSACTION_ACTION_KIND_BLOCKDEV_BACKUP, + .u.blockdev_backup.data =3D backup, + }; + blockdev_do_action(&action, errp); } =20 /* Parameter check and block job starting for drive mirroring. --=20 2.20.1 From nobody Sun Feb 8 18:09:13 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.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; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580148382661299.7321655281679; Mon, 27 Jan 2020 10:06:22 -0800 (PST) Received: from localhost ([::1]:49208 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8mD-0006Vw-Gw for importer@patchew.org; Mon, 27 Jan 2020 13:06:21 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:55050) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8ca-0002KH-L2 for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:27 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iw8cY-0002tt-Kl for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:24 -0500 Received: from us-smtp-delivery-1.mimecast.com ([205.139.110.120]:48733 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iw8cY-0002qu-Ct for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:22 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-34-gC4nkT3aOuKQYbwRDacCPQ-1; Mon, 27 Jan 2020 12:56:14 -0500 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 412508005AE; Mon, 27 Jan 2020 17:56:13 +0000 (UTC) Received: from linux.fritz.box.com (ovpn-117-108.ams2.redhat.com [10.36.117.108]) by smtp.corp.redhat.com (Postfix) with ESMTP id 49FEB811FA; Mon, 27 Jan 2020 17:56:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580147778; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=QRyKETSp3ok/kzgmtcT7fS0bXY2pEk96ruK92XTs2Rk=; b=RO2EdZ6O+IdDjDgyuPyxdsH2XhqTnLP9sdZwUof3ePyCIsWp2MxTfA5ttr9LpAhLXj0djQ 3uqD8VIKTxUibThcYRMM/ehx2KWLbYBjY1OOjwBjIIheZfmfKDuFIWV4rDRKx76I+NDObf /bqjSX3nO3dHx08GZqEOftJKA2qfpb4= From: Kevin Wolf To: qemu-block@nongnu.org Subject: [PULL 06/13] blockdev: honor bdrv_try_set_aio_context() context requirements Date: Mon, 27 Jan 2020 18:55:52 +0100 Message-Id: <20200127175559.18173-7-kwolf@redhat.com> In-Reply-To: <20200127175559.18173-1-kwolf@redhat.com> References: <20200127175559.18173-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-MC-Unique: gC4nkT3aOuKQYbwRDacCPQ-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 205.139.110.120 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, peter.maydell@linaro.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Sergio Lopez bdrv_try_set_aio_context() requires that the old context is held, and the new context is not held. Fix all the occurrences where it's not done this way. Suggested-by: Max Reitz Signed-off-by: Sergio Lopez Signed-off-by: Kevin Wolf --- blockdev.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 60 insertions(+), 8 deletions(-) diff --git a/blockdev.c b/blockdev.c index 152a0f7454..1dacbc20ec 100644 --- a/blockdev.c +++ b/blockdev.c @@ -1535,6 +1535,7 @@ static void external_snapshot_prepare(BlkActionState = *common, DO_UPCAST(ExternalSnapshotState, common, comm= on); TransactionAction *action =3D common->action; AioContext *aio_context; + AioContext *old_context; int ret; =20 /* 'blockdev-snapshot' and 'blockdev-snapshot-sync' have similar @@ -1675,7 +1676,16 @@ static void external_snapshot_prepare(BlkActionState= *common, goto out; } =20 + /* Honor bdrv_try_set_aio_context() context acquisition requirements. = */ + old_context =3D bdrv_get_aio_context(state->new_bs); + aio_context_release(aio_context); + aio_context_acquire(old_context); + ret =3D bdrv_try_set_aio_context(state->new_bs, aio_context, errp); + + aio_context_release(old_context); + aio_context_acquire(aio_context); + if (ret < 0) { goto out; } @@ -1775,11 +1785,13 @@ static void drive_backup_prepare(BlkActionState *co= mmon, Error **errp) BlockDriverState *target_bs; BlockDriverState *source =3D NULL; AioContext *aio_context; + AioContext *old_context; QDict *options; Error *local_err =3D NULL; int flags; int64_t size; bool set_backing_hd =3D false; + int ret; =20 assert(common->action->type =3D=3D TRANSACTION_ACTION_KIND_DRIVE_BACKU= P); backup =3D common->action->u.drive_backup.data; @@ -1868,6 +1880,21 @@ static void drive_backup_prepare(BlkActionState *com= mon, Error **errp) goto out; } =20 + /* Honor bdrv_try_set_aio_context() context acquisition requirements. = */ + old_context =3D bdrv_get_aio_context(target_bs); + aio_context_release(aio_context); + aio_context_acquire(old_context); + + ret =3D bdrv_try_set_aio_context(target_bs, aio_context, errp); + if (ret < 0) { + bdrv_unref(target_bs); + aio_context_release(old_context); + return; + } + + aio_context_release(old_context); + aio_context_acquire(aio_context); + if (set_backing_hd) { bdrv_set_backing_hd(target_bs, source, &local_err); if (local_err) { @@ -1947,6 +1974,8 @@ static void blockdev_backup_prepare(BlkActionState *c= ommon, Error **errp) BlockDriverState *bs; BlockDriverState *target_bs; AioContext *aio_context; + AioContext *old_context; + int ret; =20 assert(common->action->type =3D=3D TRANSACTION_ACTION_KIND_BLOCKDEV_BA= CKUP); backup =3D common->action->u.blockdev_backup.data; @@ -1961,7 +1990,18 @@ static void blockdev_backup_prepare(BlkActionState *= common, Error **errp) return; } =20 + /* Honor bdrv_try_set_aio_context() context acquisition requirements. = */ aio_context =3D bdrv_get_aio_context(bs); + old_context =3D bdrv_get_aio_context(target_bs); + aio_context_acquire(old_context); + + ret =3D bdrv_try_set_aio_context(target_bs, aio_context, errp); + if (ret < 0) { + aio_context_release(old_context); + return; + } + + aio_context_release(old_context); aio_context_acquire(aio_context); state->bs =3D bs; =20 @@ -3562,7 +3602,6 @@ static BlockJob *do_backup_common(BackupCommon *backu= p, BlockJob *job =3D NULL; BdrvDirtyBitmap *bmap =3D NULL; int job_flags =3D JOB_DEFAULT; - int ret; =20 if (!backup->has_speed) { backup->speed =3D 0; @@ -3586,11 +3625,6 @@ static BlockJob *do_backup_common(BackupCommon *back= up, backup->compress =3D false; } =20 - ret =3D bdrv_try_set_aio_context(target_bs, aio_context, errp); - if (ret < 0) { - return NULL; - } - if ((backup->sync =3D=3D MIRROR_SYNC_MODE_BITMAP) || (backup->sync =3D=3D MIRROR_SYNC_MODE_INCREMENTAL)) { /* done before desugaring 'incremental' to print the right message= */ @@ -3825,6 +3859,7 @@ void qmp_drive_mirror(DriveMirror *arg, Error **errp) BlockDriverState *bs; BlockDriverState *source, *target_bs; AioContext *aio_context; + AioContext *old_context; BlockMirrorBackingMode backing_mode; Error *local_err =3D NULL; QDict *options =3D NULL; @@ -3937,12 +3972,22 @@ void qmp_drive_mirror(DriveMirror *arg, Error **err= p) (arg->mode =3D=3D NEW_IMAGE_MODE_EXISTING || !bdrv_has_zero_init(target_bs))); =20 + + /* Honor bdrv_try_set_aio_context() context acquisition requirements. = */ + old_context =3D bdrv_get_aio_context(target_bs); + aio_context_release(aio_context); + aio_context_acquire(old_context); + ret =3D bdrv_try_set_aio_context(target_bs, aio_context, errp); if (ret < 0) { bdrv_unref(target_bs); - goto out; + aio_context_release(old_context); + return; } =20 + aio_context_release(old_context); + aio_context_acquire(aio_context); + blockdev_mirror_common(arg->has_job_id ? arg->job_id : NULL, bs, targe= t_bs, arg->has_replaces, arg->replaces, arg->sync, backing_mode, zero_target, @@ -3984,6 +4029,7 @@ void qmp_blockdev_mirror(bool has_job_id, const char = *job_id, BlockDriverState *bs; BlockDriverState *target_bs; AioContext *aio_context; + AioContext *old_context; BlockMirrorBackingMode backing_mode =3D MIRROR_LEAVE_BACKING_CHAIN; Error *local_err =3D NULL; bool zero_target; @@ -4001,10 +4047,16 @@ void qmp_blockdev_mirror(bool has_job_id, const cha= r *job_id, =20 zero_target =3D (sync =3D=3D MIRROR_SYNC_MODE_FULL); =20 + /* Honor bdrv_try_set_aio_context() context acquisition requirements. = */ + old_context =3D bdrv_get_aio_context(target_bs); aio_context =3D bdrv_get_aio_context(bs); - aio_context_acquire(aio_context); + aio_context_acquire(old_context); =20 ret =3D bdrv_try_set_aio_context(target_bs, aio_context, errp); + + aio_context_release(old_context); + aio_context_acquire(aio_context); + if (ret < 0) { goto out; } --=20 2.20.1 From nobody Sun Feb 8 18:09:13 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.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; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580148530528401.3500109624176; Mon, 27 Jan 2020 10:08:50 -0800 (PST) Received: from localhost ([::1]:49232 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8oZ-0000S6-8k for importer@patchew.org; Mon, 27 Jan 2020 13:08:47 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:55127) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8cc-0002Or-L4 for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:28 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iw8cZ-0002v8-0R for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:26 -0500 Received: from us-smtp-delivery-1.mimecast.com ([207.211.31.120]:37413 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iw8cY-0002qo-JY for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:22 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-93-JR9bZiriNIuwvTYI1NVCfg-1; Mon, 27 Jan 2020 12:56:15 -0500 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 7E60B1800D41; Mon, 27 Jan 2020 17:56:14 +0000 (UTC) Received: from linux.fritz.box.com (ovpn-117-108.ams2.redhat.com [10.36.117.108]) by smtp.corp.redhat.com (Postfix) with ESMTP id 88C3D811FA; Mon, 27 Jan 2020 17:56:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580147778; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=IfIVcq+ux/EFqe0ma8Uwjmnr0hiVietchSh5T+OcTNc=; b=dPJ67ue8QoliA6dkLj8jajD60CFM4m/985NS5hPpqeTLaElmSeUMsn2VLVcSPalQ48eHGw 8AssMDgMkHS1ws+TabSo63Mnp5GlG0pBJ7SIbS80VX3T9+G/1CtC3gUQ9FOLgA3yVM5n55 ICtbIXTVwvebi7CDgT6t9Wwv/jpixS0= From: Kevin Wolf To: qemu-block@nongnu.org Subject: [PULL 07/13] block/backup-top: Don't acquire context while dropping top Date: Mon, 27 Jan 2020 18:55:53 +0100 Message-Id: <20200127175559.18173-8-kwolf@redhat.com> In-Reply-To: <20200127175559.18173-1-kwolf@redhat.com> References: <20200127175559.18173-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-MC-Unique: JR9bZiriNIuwvTYI1NVCfg-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 207.211.31.120 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, peter.maydell@linaro.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Sergio Lopez All paths that lead to bdrv_backup_top_drop(), except for the call from backup_clean(), imply that the BDS AioContext has already been acquired, so doing it there too can potentially lead to QEMU hanging on AIO_WAIT_WHILE(). An easy way to trigger this situation is by issuing a two actions transaction, with a proper and a bogus blockdev-backup, so the second one will trigger a rollback. This will trigger a hang with an stack trace like this one: #0 0x00007fb680c75016 in __GI_ppoll (fds=3D0x55e74580f7c0, nfds=3D1, time= out=3D, timeout@entry=3D0x0, sigmask=3Dsigmask@entry=3D0x0) at ../sysdeps/unix= /sysv/linux/ppoll.c:39 #1 0x000055e743386e09 in ppoll (__ss=3D0x0, __timeout=3D0x0, __nfds=3D, __fds=3D) at /usr/include/bits/poll2.h:77 #2 0x000055e743386e09 in qemu_poll_ns (fds=3D, nfds=3D, timeout=3D) at util/qemu-timer.c:336 #3 0x000055e743388dc4 in aio_poll (ctx=3D0x55e7458925d0, blocking=3Dblock= ing@entry=3Dtrue) at util/aio-posix.c:669 #4 0x000055e743305dea in bdrv_flush (bs=3Dbs@entry=3D0x55e74593c0d0) at b= lock/io.c:2878 #5 0x000055e7432be58e in bdrv_close (bs=3D0x55e74593c0d0) at block.c:4017 #6 0x000055e7432be58e in bdrv_delete (bs=3D) at block.c:42= 62 #7 0x000055e7432be58e in bdrv_unref (bs=3Dbs@entry=3D0x55e74593c0d0) at b= lock.c:5644 #8 0x000055e743316b9b in bdrv_backup_top_drop (bs=3Dbs@entry=3D0x55e74593= c0d0) at block/backup-top.c:273 #9 0x000055e74331461f in backup_job_create (job_id=3D0x0, bs=3Dbs@entry=3D0x55e7458d5820, target=3Dtarget@entry= =3D0x55e74589f640, speed=3D0, sync_mode=3DMIRROR_SYNC_MODE_FULL, sync_bitma= p=3Dsync_bitmap@entry=3D0x0, bitmap_mode=3DBITMAP_SYNC_MODE_ON_SUCCESS, com= press=3Dfalse, filter_node_name=3D0x0, on_source_error=3DBLOCKDEV_ON_ERROR_= REPORT, on_target_error=3DBLOCKDEV_ON_ERROR_REPORT, creation_flags=3D0, cb= =3D0x0, opaque=3D0x0, txn=3D0x0, errp=3D0x7ffddfd1efb0) at block/backup.c:4= 78 #10 0x000055e74315bc52 in do_backup_common (backup=3Dbackup@entry=3D0x55e746c066d0, bs=3Dbs@entry=3D0x55e7458d582= 0, target_bs=3Dtarget_bs@entry=3D0x55e74589f640, aio_context=3Daio_context@= entry=3D0x55e7458a91e0, txn=3Dtxn@entry=3D0x0, errp=3Derrp@entry=3D0x7ffddf= d1efb0) at blockdev.c:3580 #11 0x000055e74315c37c in do_blockdev_backup (backup=3Dbackup@entry=3D0x55e746c066d0, txn=3D0x0, errp=3Derrp@entry= =3D0x7ffddfd1efb0) at /usr/src/debug/qemu-kvm-4.2.0-2.module+el8.2.0+5135+ed3b2489.x86_64= /./qapi/qapi-types-block-core.h:1492 #12 0x000055e74315c449 in blockdev_backup_prepare (common=3D0x55e746a8de90= , errp=3D0x7ffddfd1f018) at blockdev.c:1885 #13 0x000055e743160152 in qmp_transaction (dev_list=3D, has_props=3D, props=3D0x55= e7467fe2c0, errp=3Derrp@entry=3D0x7ffddfd1f088) at blockdev.c:2340 #14 0x000055e743287ff5 in qmp_marshal_transaction (args=3D, ret=3D, errp=3D0x7ffddfd1f0f8) at qapi/qapi-commands-transaction.c:44 #15 0x000055e74333de6c in do_qmp_dispatch (errp=3D0x7ffddfd1f0f0, allow_oob=3D, request=3D, cmds=3D0x55e743c28d60 ) at qapi/qmp-dispatch.c:132 #16 0x000055e74333de6c in qmp_dispatch (cmds=3D0x55e743c28d60 , request=3D, allo= w_oob=3D) at qapi/qmp-dispatch.c:175 #17 0x000055e74325c061 in monitor_qmp_dispatch (mon=3D0x55e745908030, req= =3D) at monitor/qmp.c:145 #18 0x000055e74325c6fa in monitor_qmp_bh_dispatcher (data=3D) at monitor/qmp.c:234 #19 0x000055e743385866 in aio_bh_call (bh=3D0x55e745807ae0) at util/async.= c:117 #20 0x000055e743385866 in aio_bh_poll (ctx=3Dctx@entry=3D0x55e7458067a0) a= t util/async.c:117 #21 0x000055e743388c54 in aio_dispatch (ctx=3D0x55e7458067a0) at util/aio-= posix.c:459 #22 0x000055e743385742 in aio_ctx_dispatch (source=3D, callback=3D, user_data=3D) at util/async.c:260 #23 0x00007fb68543e67d in g_main_dispatch (context=3D0x55e745893a40) at gm= ain.c:3176 #24 0x00007fb68543e67d in g_main_context_dispatch (context=3Dcontext@entry= =3D0x55e745893a40) at gmain.c:3829 #25 0x000055e743387d08 in glib_pollfds_poll () at util/main-loop.c:219 #26 0x000055e743387d08 in os_host_main_loop_wait (timeout=3D) at util/main-loop.c:242 #27 0x000055e743387d08 in main_loop_wait (nonblocking=3D) a= t util/main-loop.c:518 #28 0x000055e74316a3c1 in main_loop () at vl.c:1828 #29 0x000055e743016a72 in main (argc=3D, argv=3D, envp=3D) at vl.c:4504 Fix this by not acquiring the AioContext there, and ensuring all paths leading to it have it already acquired (backup_clean()). RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=3D1782111 Signed-off-by: Sergio Lopez Signed-off-by: Kevin Wolf --- block/backup-top.c | 5 ----- block/backup.c | 3 +++ 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/block/backup-top.c b/block/backup-top.c index 818d3f26b4..b8d863ff08 100644 --- a/block/backup-top.c +++ b/block/backup-top.c @@ -255,9 +255,6 @@ append_failed: void bdrv_backup_top_drop(BlockDriverState *bs) { BDRVBackupTopState *s =3D bs->opaque; - AioContext *aio_context =3D bdrv_get_aio_context(bs); - - aio_context_acquire(aio_context); =20 bdrv_drained_begin(bs); =20 @@ -271,6 +268,4 @@ void bdrv_backup_top_drop(BlockDriverState *bs) bdrv_drained_end(bs); =20 bdrv_unref(bs); - - aio_context_release(aio_context); } diff --git a/block/backup.c b/block/backup.c index cf62b1a38c..1383e219f5 100644 --- a/block/backup.c +++ b/block/backup.c @@ -135,8 +135,11 @@ static void backup_abort(Job *job) static void backup_clean(Job *job) { BackupBlockJob *s =3D container_of(job, BackupBlockJob, common.job); + AioContext *aio_context =3D bdrv_get_aio_context(s->backup_top); =20 + aio_context_acquire(aio_context); bdrv_backup_top_drop(s->backup_top); + aio_context_release(aio_context); } =20 void backup_do_checkpoint(BlockJob *job, Error **errp) --=20 2.20.1 From nobody Sun Feb 8 18:09:13 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.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; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580148291738809.833176790288; Mon, 27 Jan 2020 10:04:51 -0800 (PST) Received: from localhost ([::1]:49172 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8kk-0004uh-HJ for importer@patchew.org; Mon, 27 Jan 2020 13:04:50 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:55053) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8ca-0002KN-NG for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:27 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iw8cY-0002tj-KN for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:24 -0500 Received: from us-smtp-delivery-1.mimecast.com ([205.139.110.120]:58715 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iw8cY-0002rt-Ce for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:22 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-32-1IgjyjGEOSGdQkKz_Q1zRg-1; Mon, 27 Jan 2020 12:56:16 -0500 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id BCCDF107ACC5; Mon, 27 Jan 2020 17:56:15 +0000 (UTC) Received: from linux.fritz.box.com (ovpn-117-108.ams2.redhat.com [10.36.117.108]) by smtp.corp.redhat.com (Postfix) with ESMTP id C6B60863C0; Mon, 27 Jan 2020 17:56:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580147780; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=fYWMYUOprsn2KuNX5E6MISeuolECeTpsS8tGXI6Bhos=; b=SuD+FO6DfG23TnL/zT2HQYIgYDtKoQaBI6x23DW9CabI3JZnOuILuSdorFsRM8fRRxjuSB /KBb0CoSWGZD3mq4oyCTjDPCLdqc9N0RNJQZRR20xFHxlkKCftvWDRoL1asEPzQLi1mDX1 1jtGW+uHtQ6prlGuvkFxDTbhawY7K3s= From: Kevin Wolf To: qemu-block@nongnu.org Subject: [PULL 08/13] blockdev: Acquire AioContext on dirty bitmap functions Date: Mon, 27 Jan 2020 18:55:54 +0100 Message-Id: <20200127175559.18173-9-kwolf@redhat.com> In-Reply-To: <20200127175559.18173-1-kwolf@redhat.com> References: <20200127175559.18173-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-MC-Unique: 1IgjyjGEOSGdQkKz_Q1zRg-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 205.139.110.120 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, peter.maydell@linaro.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Sergio Lopez Dirty map addition and removal functions are not acquiring to BDS AioContext, while they may call to code that expects it to be acquired. This may trigger a crash with a stack trace like this one: #0 0x00007f0ef146370f in __GI_raise (sig=3Dsig@entry=3D6) at ../sysdeps/unix/sysv/linux/raise.c:50 #1 0x00007f0ef144db25 in __GI_abort () at abort.c:79 #2 0x0000565022294dce in error_exit (err=3D, msg=3Dmsg@entry=3D0x56502243a730 <__func__.163= 50> "qemu_mutex_unlock_impl") at util/qemu-thread-posix.c:36 #3 0x00005650222950ba in qemu_mutex_unlock_impl (mutex=3Dmutex@entry=3D0x5650244b0240, file=3Dfile@entry=3D0x565022439= adf "util/async.c", line=3Dline@entry=3D526) at util/qemu-thread-posix.c:108 #4 0x0000565022290029 in aio_context_release (ctx=3Dctx@entry=3D0x5650244b01e0) at util/async.c:526 #5 0x000056502221cd08 in bdrv_can_store_new_dirty_bitmap (bs=3Dbs@entry=3D0x5650244dc820, name=3Dname@entry=3D0x56502481d360 "b= itmap1", granularity=3Dgranularity@entry=3D65536, errp=3Derrp@entry=3D0x7ff= f22831718) at block/dirty-bitmap.c:542 #6 0x000056502206ae53 in qmp_block_dirty_bitmap_add (errp=3D0x7fff22831718, disabled=3Dfalse, has_disabled=3D, persistent=3D, has_persistent=3Dtrue, granularity=3D6553= 6, has_granularity=3D, name=3D0x56502481d360 "bitmap1", node= =3D) at blockdev.c:2894 #7 0x000056502206ae53 in qmp_block_dirty_bitmap_add (node=3D, name=3D0x56502481d360 "bitmap1", has_granular= ity=3D, granularity=3D, has_persistent=3Dtrue= , persistent=3D, has_disabled=3Dfalse, disabled=3Dfalse, err= p=3D0x7fff22831718) at blockdev.c:2856 #8 0x00005650221847a3 in qmp_marshal_block_dirty_bitmap_add (args=3D, ret=3D, errp=3D0x7fff22831798) at qapi/qapi-commands-block-core.c:651 #9 0x0000565022247e6c in do_qmp_dispatch (errp=3D0x7fff22831790, allow_oob=3D, request=3D, cmds=3D0x565022b32d60 ) at qapi/qmp-dispatch.c:132 #10 0x0000565022247e6c in qmp_dispatch (cmds=3D0x565022b32d60 , request=3D, allo= w_oob=3D) at qapi/qmp-dispatch.c:175 #11 0x0000565022166061 in monitor_qmp_dispatch (mon=3D0x56502450faa0, req=3D) at monitor/qmp.c:145 #12 0x00005650221666fa in monitor_qmp_bh_dispatcher (data=3D) at monitor/qmp.c:234 #13 0x000056502228f866 in aio_bh_call (bh=3D0x56502440eae0) at util/async.c:117 #14 0x000056502228f866 in aio_bh_poll (ctx=3Dctx@entry=3D0x56502440d7a0) at util/async.c:117 #15 0x0000565022292c54 in aio_dispatch (ctx=3D0x56502440d7a0) at util/aio-posix.c:459 #16 0x000056502228f742 in aio_ctx_dispatch (source=3D, callback=3D, user_data=3D) at util/async.c:260 #17 0x00007f0ef5ce667d in g_main_dispatch (context=3D0x56502449aa40) at gmain.c:3176 #18 0x00007f0ef5ce667d in g_main_context_dispatch (context=3Dcontext@entry=3D0x56502449aa40) at gmain.c:3829 #19 0x0000565022291d08 in glib_pollfds_poll () at util/main-loop.c:219 #20 0x0000565022291d08 in os_host_main_loop_wait (timeout=3D) at util/main-loop.c:242 #21 0x0000565022291d08 in main_loop_wait (nonblocking=3D) at util/main-loop.c:518 #22 0x00005650220743c1 in main_loop () at vl.c:1828 #23 0x0000565021f20a72 in main (argc=3D, argv=3D, envp=3D) at vl.c:4504 Fix this by acquiring the AioContext at qmp_block_dirty_bitmap_add() and qmp_block_dirty_bitmap_add(). RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=3D1782175 Signed-off-by: Sergio Lopez Signed-off-by: Kevin Wolf --- blockdev.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/blockdev.c b/blockdev.c index 1dacbc20ec..d4ef6cd452 100644 --- a/blockdev.c +++ b/blockdev.c @@ -2984,6 +2984,7 @@ void qmp_block_dirty_bitmap_add(const char *node, con= st char *name, { BlockDriverState *bs; BdrvDirtyBitmap *bitmap; + AioContext *aio_context; =20 if (!name || name[0] =3D=3D '\0') { error_setg(errp, "Bitmap name cannot be empty"); @@ -2995,11 +2996,14 @@ void qmp_block_dirty_bitmap_add(const char *node, c= onst char *name, return; } =20 + aio_context =3D bdrv_get_aio_context(bs); + aio_context_acquire(aio_context); + if (has_granularity) { if (granularity < 512 || !is_power_of_2(granularity)) { error_setg(errp, "Granularity must be power of 2 " "and at least 512"); - return; + goto out; } } else { /* Default to cluster size, if available: */ @@ -3017,12 +3021,12 @@ void qmp_block_dirty_bitmap_add(const char *node, c= onst char *name, if (persistent && !bdrv_can_store_new_dirty_bitmap(bs, name, granularity, errp)) { - return; + goto out; } =20 bitmap =3D bdrv_create_dirty_bitmap(bs, granularity, name, errp); if (bitmap =3D=3D NULL) { - return; + goto out; } =20 if (disabled) { @@ -3030,6 +3034,9 @@ void qmp_block_dirty_bitmap_add(const char *node, con= st char *name, } =20 bdrv_dirty_bitmap_set_persistence(bitmap, persistent); + +out: + aio_context_release(aio_context); } =20 static BdrvDirtyBitmap *do_block_dirty_bitmap_remove( @@ -3038,21 +3045,27 @@ static BdrvDirtyBitmap *do_block_dirty_bitmap_remov= e( { BlockDriverState *bs; BdrvDirtyBitmap *bitmap; + AioContext *aio_context; =20 bitmap =3D block_dirty_bitmap_lookup(node, name, &bs, errp); if (!bitmap || !bs) { return NULL; } =20 + aio_context =3D bdrv_get_aio_context(bs); + aio_context_acquire(aio_context); + if (bdrv_dirty_bitmap_check(bitmap, BDRV_BITMAP_BUSY | BDRV_BITMAP_RO, errp)) { + aio_context_release(aio_context); return NULL; } =20 if (bdrv_dirty_bitmap_get_persistence(bitmap) && bdrv_remove_persistent_dirty_bitmap(bs, name, errp) < 0) { - return NULL; + aio_context_release(aio_context); + return NULL; } =20 if (release) { @@ -3063,6 +3076,7 @@ static BdrvDirtyBitmap *do_block_dirty_bitmap_remove( *bitmap_bs =3D bs; } =20 + aio_context_release(aio_context); return release ? NULL : bitmap; } =20 --=20 2.20.1 From nobody Sun Feb 8 18:09:13 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.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; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 158014806944287.56622466948932; Mon, 27 Jan 2020 10:01:09 -0800 (PST) Received: from localhost ([::1]:49104 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8hA-0000qH-4x for importer@patchew.org; Mon, 27 Jan 2020 13:01:08 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:55069) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8cb-0002LG-4V for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:27 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iw8cY-0002uQ-R3 for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:24 -0500 Received: from us-smtp-delivery-1.mimecast.com ([205.139.110.120]:31024 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iw8cY-0002rd-GI for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:22 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-344-A2dtTsbUN0uXyvK3y7d6sw-1; Mon, 27 Jan 2020 12:56:18 -0500 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 0BEA91007269; Mon, 27 Jan 2020 17:56:17 +0000 (UTC) Received: from linux.fritz.box.com (ovpn-117-108.ams2.redhat.com [10.36.117.108]) by smtp.corp.redhat.com (Postfix) with ESMTP id 121D0811FA; Mon, 27 Jan 2020 17:56:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580147780; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=hBx84FkRgattWyuzqryLHMgYVI8/+4cZhdK/scUWLIw=; b=COq0WTvc4klFQ6d0359hAzysg4VHRFv0ZPDlW12PbzZLIhXDHValWuK29vclzzaAr+1JtX 2NXi2mGD342AdfgtKvtHPpt5arIWkc9JMJHE+f7oC46kUTadFzIFOYN6l6w/phEyCi4rNU iKDSMdSqqIr2POHZZiBM6a2pLo2vhOI= From: Kevin Wolf To: qemu-block@nongnu.org Subject: [PULL 09/13] blockdev: Return bs to the proper context on snapshot abort Date: Mon, 27 Jan 2020 18:55:55 +0100 Message-Id: <20200127175559.18173-10-kwolf@redhat.com> In-Reply-To: <20200127175559.18173-1-kwolf@redhat.com> References: <20200127175559.18173-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-MC-Unique: A2dtTsbUN0uXyvK3y7d6sw-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 205.139.110.120 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, peter.maydell@linaro.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Sergio Lopez external_snapshot_abort() calls to bdrv_set_backing_hd(), which returns state->old_bs to the main AioContext, as it's intended to be used then the BDS is going to be released. As that's not the case when aborting an external snapshot, return it to the AioContext it was before the call. This issue can be triggered by issuing a transaction with two actions, a proper blockdev-snapshot-sync and a bogus one, so the second will trigger a transaction abort. This results in a crash with an stack trace like this one: #0 0x00007fa1048b28df in __GI_raise (sig=3Dsig@entry=3D6) at ../sysdeps/u= nix/sysv/linux/raise.c:50 #1 0x00007fa10489ccf5 in __GI_abort () at abort.c:79 #2 0x00007fa10489cbc9 in __assert_fail_base (fmt=3D0x7fa104a03300 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", ass= ertion=3D0x5572240b44d8 "bdrv_get_aio_context(old_bs) =3D=3D bdrv_get_aio_c= ontext(new_bs)", file=3D0x557224014d30 "block.c", line=3D2240, function=3D<= optimized out>) at assert.c:92 #3 0x00007fa1048aae96 in __GI___assert_fail (assertion=3Dassertion@entry=3D0x5572240b44d8 "bdrv_get_aio_context(ol= d_bs) =3D=3D bdrv_get_aio_context(new_bs)", file=3Dfile@entry=3D0x557224014= d30 "block.c", line=3Dline@entry=3D2240, function=3Dfunction@entry=3D0x5572= 240b5d60 <__PRETTY_FUNCTION__.31620> "bdrv_replace_child_noperm") at assert= .c:101 #4 0x0000557223e631f8 in bdrv_replace_child_noperm (child=3D0x557225b9c98= 0, new_bs=3Dnew_bs@entry=3D0x557225c42e40) at block.c:2240 #5 0x0000557223e68be7 in bdrv_replace_node (from=3D0x557226951a60, to=3D0= x557225c42e40, errp=3D0x5572247d6138 ) at block.c:4196 #6 0x0000557223d069c4 in external_snapshot_abort (common=3D0x557225d7e170= ) at blockdev.c:1731 #7 0x0000557223d069c4 in external_snapshot_abort (common=3D0x557225d7e170= ) at blockdev.c:1717 #8 0x0000557223d09013 in qmp_transaction (dev_list=3D, has= _props=3D, props=3D0x557225cc7d70, errp=3Derrp@entry=3D0x7ff= e704c0c98) at blockdev.c:2360 #9 0x0000557223e32085 in qmp_marshal_transaction (args=3D,= ret=3D, errp=3D0x7ffe704c0d08) at qapi/qapi-commands-transa= ction.c:44 #10 0x0000557223ee798c in do_qmp_dispatch (errp=3D0x7ffe704c0d00, allow_oo= b=3D, request=3D, cmds=3D0x5572247d3cc0 ) at qapi/qmp-dispatch.c:132 #11 0x0000557223ee798c in qmp_dispatch (cmds=3D0x5572247d3cc0 , request=3D, allow_oob=3D) at qapi/qmp-dis= patch.c:175 #12 0x0000557223e06141 in monitor_qmp_dispatch (mon=3D0x557225c69ff0, req= =3D) at monitor/qmp.c:120 #13 0x0000557223e0678a in monitor_qmp_bh_dispatcher (data=3D) at monitor/qmp.c:209 #14 0x0000557223f2f366 in aio_bh_call (bh=3D0x557225b9dc60) at util/async.= c:117 #15 0x0000557223f2f366 in aio_bh_poll (ctx=3Dctx@entry=3D0x557225b9c840) a= t util/async.c:117 #16 0x0000557223f32754 in aio_dispatch (ctx=3D0x557225b9c840) at util/aio-= posix.c:459 #17 0x0000557223f2f242 in aio_ctx_dispatch (source=3D, call= back=3D, user_data=3D) at util/async.c:260 #18 0x00007fa10913467d in g_main_dispatch (context=3D0x557225c28e80) at gm= ain.c:3176 #19 0x00007fa10913467d in g_main_context_dispatch (context=3Dcontext@entry= =3D0x557225c28e80) at gmain.c:3829 #20 0x0000557223f31808 in glib_pollfds_poll () at util/main-loop.c:219 #21 0x0000557223f31808 in os_host_main_loop_wait (timeout=3D) at util/main-loop.c:242 #22 0x0000557223f31808 in main_loop_wait (nonblocking=3D) a= t util/main-loop.c:518 #23 0x0000557223d13201 in main_loop () at vl.c:1828 #24 0x0000557223bbfb82 in main (argc=3D, argv=3D, envp=3D) at vl.c:4504 RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=3D1779036 Signed-off-by: Sergio Lopez Signed-off-by: Kevin Wolf --- blockdev.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/blockdev.c b/blockdev.c index d4ef6cd452..4cd9a58d36 100644 --- a/blockdev.c +++ b/blockdev.c @@ -1731,6 +1731,8 @@ static void external_snapshot_abort(BlkActionState *c= ommon) if (state->new_bs) { if (state->overlay_appended) { AioContext *aio_context; + AioContext *tmp_context; + int ret; =20 aio_context =3D bdrv_get_aio_context(state->old_bs); aio_context_acquire(aio_context); @@ -1738,6 +1740,25 @@ static void external_snapshot_abort(BlkActionState *= common) bdrv_ref(state->old_bs); /* we can't let bdrv_set_backind_hd= () close state->old_bs; we need it = */ bdrv_set_backing_hd(state->new_bs, NULL, &error_abort); + + /* + * The call to bdrv_set_backing_hd() above returns state->old_= bs to + * the main AioContext. As we're still going to be using it, r= eturn + * it to the AioContext it was before. + */ + tmp_context =3D bdrv_get_aio_context(state->old_bs); + if (aio_context !=3D tmp_context) { + aio_context_release(aio_context); + aio_context_acquire(tmp_context); + + ret =3D bdrv_try_set_aio_context(state->old_bs, + aio_context, NULL); + assert(ret =3D=3D 0); + + aio_context_release(tmp_context); + aio_context_acquire(aio_context); + } + bdrv_replace_node(state->new_bs, state->old_bs, &error_abort); bdrv_unref(state->old_bs); /* bdrv_replace_node() ref'ed old_b= s */ =20 --=20 2.20.1 From nobody Sun Feb 8 18:09:13 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.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; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580148209641282.6029399628127; Mon, 27 Jan 2020 10:03:29 -0800 (PST) Received: from localhost ([::1]:49146 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8jQ-0003Ek-6Z for importer@patchew.org; Mon, 27 Jan 2020 13:03:28 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:55194) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8cd-0002Qi-I4 for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:30 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iw8ca-0002w9-0t for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:27 -0500 Received: from us-smtp-1.mimecast.com ([207.211.31.81]:33818 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iw8cZ-0002vs-SQ for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:23 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-145-MzoWjmFGMveUKubD7IZlWg-1; Mon, 27 Jan 2020 12:56:19 -0500 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 49B82107ACC4; Mon, 27 Jan 2020 17:56:18 +0000 (UTC) Received: from linux.fritz.box.com (ovpn-117-108.ams2.redhat.com [10.36.117.108]) by smtp.corp.redhat.com (Postfix) with ESMTP id 52C95811FA; Mon, 27 Jan 2020 17:56:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580147783; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=4lLlOqbMbLKMqokwuyfhJlJ7LYn0AhIBA8RZ84mtuNM=; b=EMUxnHbulWe9v/myhSuri0xJI9LG7bUPVqgG2rMavoiXMkY6UdE9A9zBXidjuS5YJjTFos YpgeHKJLG1BQjofwKjsopOAV3CBLak4Dd4UaWnYUn1t6zM3ETMv00GsGqfBg0AQZyr8RZ0 BQJIP9KPPMSF+iBExsqDvQO6065XQQ8= From: Kevin Wolf To: qemu-block@nongnu.org Subject: [PULL 10/13] iotests: Test handling of AioContexts with some blockdev actions Date: Mon, 27 Jan 2020 18:55:56 +0100 Message-Id: <20200127175559.18173-11-kwolf@redhat.com> In-Reply-To: <20200127175559.18173-1-kwolf@redhat.com> References: <20200127175559.18173-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-MC-Unique: MzoWjmFGMveUKubD7IZlWg-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 207.211.31.81 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, peter.maydell@linaro.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Sergio Lopez Includes the following tests: - Adding a dirty bitmap. * RHBZ: 1782175 - Starting a drive-mirror to an NBD-backed target. * RHBZ: 1746217, 1773517 - Aborting an external snapshot transaction. * RHBZ: 1779036 - Aborting a blockdev backup transaction. * RHBZ: 1782111 For each one of them, a VM with a number of disks running in an IOThread AioContext is used. Signed-off-by: Sergio Lopez Signed-off-by: Kevin Wolf --- tests/qemu-iotests/281 | 247 +++++++++++++++++++++++++++++++++++++ tests/qemu-iotests/281.out | 5 + tests/qemu-iotests/group | 1 + 3 files changed, 253 insertions(+) create mode 100755 tests/qemu-iotests/281 create mode 100644 tests/qemu-iotests/281.out diff --git a/tests/qemu-iotests/281 b/tests/qemu-iotests/281 new file mode 100755 index 0000000000..269d583b2c --- /dev/null +++ b/tests/qemu-iotests/281 @@ -0,0 +1,247 @@ +#!/usr/bin/env python +# +# Test cases for blockdev + IOThread interactions +# +# Copyright (C) 2019 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +import os +import iotests +from iotests import qemu_img + +image_len =3D 64 * 1024 * 1024 + +# Test for RHBZ#1782175 +class TestDirtyBitmapIOThread(iotests.QMPTestCase): + drive0_img =3D os.path.join(iotests.test_dir, 'drive0.img') + images =3D { 'drive0': drive0_img } + + def setUp(self): + for name in self.images: + qemu_img('create', '-f', iotests.imgfmt, + self.images[name], str(image_len)) + + self.vm =3D iotests.VM() + self.vm.add_object('iothread,id=3Diothread0') + + for name in self.images: + self.vm.add_blockdev('driver=3Dfile,filename=3D%s,node-name=3D= file_%s' + % (self.images[name], name)) + self.vm.add_blockdev('driver=3Dqcow2,file=3Dfile_%s,node-name= =3D%s' + % (name, name)) + + self.vm.launch() + self.vm.qmp('x-blockdev-set-iothread', + node_name=3D'drive0', iothread=3D'iothread0', + force=3DTrue) + + def tearDown(self): + self.vm.shutdown() + for name in self.images: + os.remove(self.images[name]) + + def test_add_dirty_bitmap(self): + result =3D self.vm.qmp( + 'block-dirty-bitmap-add', + node=3D'drive0', + name=3D'bitmap1', + persistent=3DTrue, + ) + + self.assert_qmp(result, 'return', {}) + + +# Test for RHBZ#1746217 & RHBZ#1773517 +class TestNBDMirrorIOThread(iotests.QMPTestCase): + nbd_sock =3D os.path.join(iotests.sock_dir, 'nbd.sock') + drive0_img =3D os.path.join(iotests.test_dir, 'drive0.img') + mirror_img =3D os.path.join(iotests.test_dir, 'mirror.img') + images =3D { 'drive0': drive0_img, 'mirror': mirror_img } + + def setUp(self): + for name in self.images: + qemu_img('create', '-f', iotests.imgfmt, + self.images[name], str(image_len)) + + self.vm_src =3D iotests.VM(path_suffix=3D'src') + self.vm_src.add_object('iothread,id=3Diothread0') + self.vm_src.add_blockdev('driver=3Dfile,filename=3D%s,node-name=3D= file0' + % (self.drive0_img)) + self.vm_src.add_blockdev('driver=3Dqcow2,file=3Dfile0,node-name=3D= drive0') + self.vm_src.launch() + self.vm_src.qmp('x-blockdev-set-iothread', + node_name=3D'drive0', iothread=3D'iothread0', + force=3DTrue) + + self.vm_tgt =3D iotests.VM(path_suffix=3D'tgt') + self.vm_tgt.add_object('iothread,id=3Diothread0') + self.vm_tgt.add_blockdev('driver=3Dfile,filename=3D%s,node-name=3D= file0' + % (self.mirror_img)) + self.vm_tgt.add_blockdev('driver=3Dqcow2,file=3Dfile0,node-name=3D= drive0') + self.vm_tgt.launch() + self.vm_tgt.qmp('x-blockdev-set-iothread', + node_name=3D'drive0', iothread=3D'iothread0', + force=3DTrue) + + def tearDown(self): + self.vm_src.shutdown() + self.vm_tgt.shutdown() + for name in self.images: + os.remove(self.images[name]) + + def test_nbd_mirror(self): + result =3D self.vm_tgt.qmp( + 'nbd-server-start', + addr=3D{ + 'type': 'unix', + 'data': { 'path': self.nbd_sock } + } + ) + self.assert_qmp(result, 'return', {}) + + result =3D self.vm_tgt.qmp( + 'nbd-server-add', + device=3D'drive0', + writable=3DTrue + ) + self.assert_qmp(result, 'return', {}) + + result =3D self.vm_src.qmp( + 'drive-mirror', + device=3D'drive0', + target=3D'nbd+unix:///drive0?socket=3D' + self.nbd_sock, + sync=3D'full', + mode=3D'existing', + speed=3D64*1024*1024, + job_id=3D'j1' + ) + self.assert_qmp(result, 'return', {}) + + self.vm_src.event_wait(name=3D"BLOCK_JOB_READY") + + +# Test for RHBZ#1779036 +class TestExternalSnapshotAbort(iotests.QMPTestCase): + drive0_img =3D os.path.join(iotests.test_dir, 'drive0.img') + snapshot_img =3D os.path.join(iotests.test_dir, 'snapshot.img') + images =3D { 'drive0': drive0_img, 'snapshot': snapshot_img } + + def setUp(self): + for name in self.images: + qemu_img('create', '-f', iotests.imgfmt, + self.images[name], str(image_len)) + + self.vm =3D iotests.VM() + self.vm.add_object('iothread,id=3Diothread0') + self.vm.add_blockdev('driver=3Dfile,filename=3D%s,node-name=3Dfile= 0' + % (self.drive0_img)) + self.vm.add_blockdev('driver=3Dqcow2,file=3Dfile0,node-name=3Ddriv= e0') + self.vm.launch() + self.vm.qmp('x-blockdev-set-iothread', + node_name=3D'drive0', iothread=3D'iothread0', + force=3DTrue) + + def tearDown(self): + self.vm.shutdown() + for name in self.images: + os.remove(self.images[name]) + + def test_external_snapshot_abort(self): + # Use a two actions transaction with a bogus values on the second + # one to trigger an abort of the transaction. + result =3D self.vm.qmp('transaction', actions=3D[ + { + 'type': 'blockdev-snapshot-sync', + 'data': { 'node-name': 'drive0', + 'snapshot-file': self.snapshot_img, + 'snapshot-node-name': 'snap1', + 'mode': 'absolute-paths', + 'format': 'qcow2' } + }, + { + 'type': 'blockdev-snapshot-sync', + 'data': { 'node-name': 'drive0', + 'snapshot-file': '/fakesnapshot', + 'snapshot-node-name': 'snap2', + 'mode': 'absolute-paths', + 'format': 'qcow2' } + }, + ]) + + # Crashes on failure, we expect this error. + self.assert_qmp(result, 'error/class', 'GenericError') + + +# Test for RHBZ#1782111 +class TestBlockdevBackupAbort(iotests.QMPTestCase): + drive0_img =3D os.path.join(iotests.test_dir, 'drive0.img') + drive1_img =3D os.path.join(iotests.test_dir, 'drive1.img') + snap0_img =3D os.path.join(iotests.test_dir, 'snap0.img') + snap1_img =3D os.path.join(iotests.test_dir, 'snap1.img') + images =3D { 'drive0': drive0_img, + 'drive1': drive1_img, + 'snap0': snap0_img, + 'snap1': snap1_img } + + def setUp(self): + for name in self.images: + qemu_img('create', '-f', iotests.imgfmt, + self.images[name], str(image_len)) + + self.vm =3D iotests.VM() + self.vm.add_object('iothread,id=3Diothread0') + self.vm.add_device('virtio-scsi,iothread=3Diothread0') + + for name in self.images: + self.vm.add_blockdev('driver=3Dfile,filename=3D%s,node-name=3D= file_%s' + % (self.images[name], name)) + self.vm.add_blockdev('driver=3Dqcow2,file=3Dfile_%s,node-name= =3D%s' + % (name, name)) + + self.vm.add_device('scsi-hd,drive=3Ddrive0') + self.vm.add_device('scsi-hd,drive=3Ddrive1') + self.vm.launch() + + def tearDown(self): + self.vm.shutdown() + for name in self.images: + os.remove(self.images[name]) + + def test_blockdev_backup_abort(self): + # Use a two actions transaction with a bogus values on the second + # one to trigger an abort of the transaction. + result =3D self.vm.qmp('transaction', actions=3D[ + { + 'type': 'blockdev-backup', + 'data': { 'device': 'drive0', + 'target': 'snap0', + 'sync': 'full', + 'job-id': 'j1' } + }, + { + 'type': 'blockdev-backup', + 'data': { 'device': 'drive1', + 'target': 'snap1', + 'sync': 'full' } + }, + ]) + + # Hangs on failure, we expect this error. + self.assert_qmp(result, 'error/class', 'GenericError') + +if __name__ =3D=3D '__main__': + iotests.main(supported_fmts=3D['qcow2'], + supported_protocols=3D['file']) diff --git a/tests/qemu-iotests/281.out b/tests/qemu-iotests/281.out new file mode 100644 index 0000000000..89968f35d7 --- /dev/null +++ b/tests/qemu-iotests/281.out @@ -0,0 +1,5 @@ +.... +---------------------------------------------------------------------- +Ran 4 tests + +OK diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group index cb2b789e44..e041cc1ee3 100644 --- a/tests/qemu-iotests/group +++ b/tests/qemu-iotests/group @@ -288,3 +288,4 @@ 277 rw quick 279 rw backing quick 280 rw migration quick +281 rw quick --=20 2.20.1 From nobody Sun Feb 8 18:09:13 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.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; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580147921113600.3928657744392; Mon, 27 Jan 2020 09:58:41 -0800 (PST) Received: from localhost ([::1]:49032 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8em-0005he-0t for importer@patchew.org; Mon, 27 Jan 2020 12:58:40 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:55093) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8cb-0002My-S1 for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:27 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iw8cZ-0002vb-FH for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:25 -0500 Received: from us-smtp-1.mimecast.com ([205.139.110.61]:23465 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iw8cZ-0002ut-9d for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:23 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-260-QXSuOeqMNCq3ZQL4amIrYA-1; Mon, 27 Jan 2020 12:56:20 -0500 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 86AB01882CC9; Mon, 27 Jan 2020 17:56:19 +0000 (UTC) Received: from linux.fritz.box.com (ovpn-117-108.ams2.redhat.com [10.36.117.108]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9146F863C0; Mon, 27 Jan 2020 17:56:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580147782; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kgYVzUu7uSw5ID+mth66811eFcWviQoHdDvyj1J4PM0=; b=HM+tp6CDokDBqBn44csHaANmJhJCb/7J4+SvObIN0PPRDgtsH4bsatpJ1SEB4x7iEItijS L6Ue+evod+oUZKVXbgG2laQ3M9xzngjmnKK5GNPO7pk7fG3AC4L5G0o9g6w/+G+Vq+xffO SZtfOn/hUVqcchgNmj/oJYjDuieE/Qw= From: Kevin Wolf To: qemu-block@nongnu.org Subject: [PULL 11/13] block/backup: fix memory leak in bdrv_backup_top_append() Date: Mon, 27 Jan 2020 18:55:57 +0100 Message-Id: <20200127175559.18173-12-kwolf@redhat.com> In-Reply-To: <20200127175559.18173-1-kwolf@redhat.com> References: <20200127175559.18173-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-MC-Unique: QXSuOeqMNCq3ZQL4amIrYA-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 205.139.110.61 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, peter.maydell@linaro.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Eiichi Tsukata bdrv_open_driver() allocates bs->opaque according to drv->instance_size. There is no need to allocate it and overwrite opaque in bdrv_backup_top_append(). Reproducer: $ QTEST_QEMU_BINARY=3D./x86_64-softmmu/qemu-system-x86_64 valgrind -q --l= eak-check=3Dfull tests/test-replication -p /replication/secondary/start =3D=3D29792=3D=3D 24 bytes in 1 blocks are definitely lost in loss record= 52 of 226 =3D=3D29792=3D=3D at 0x483AB1A: calloc (vg_replace_malloc.c:762) =3D=3D29792=3D=3D by 0x4B07CE0: g_malloc0 (in /usr/lib64/libglib-2.0.s= o.0.6000.7) =3D=3D29792=3D=3D by 0x12BAB9: bdrv_open_driver (block.c:1289) =3D=3D29792=3D=3D by 0x12BEA9: bdrv_new_open_driver (block.c:1359) =3D=3D29792=3D=3D by 0x1D15CB: bdrv_backup_top_append (backup-top.c:19= 0) =3D=3D29792=3D=3D by 0x1CC11A: backup_job_create (backup.c:439) =3D=3D29792=3D=3D by 0x1CD542: replication_start (replication.c:544) =3D=3D29792=3D=3D by 0x1401B9: replication_start_all (replication.c:52) =3D=3D29792=3D=3D by 0x128B50: test_secondary_start (test-replication.= c:427) ... Fixes: 7df7868b9640 ("block: introduce backup-top filter driver") Signed-off-by: Eiichi Tsukata Reviewed-by: Vladimir Sementsov-Ogievskiy Signed-off-by: Kevin Wolf --- block/backup-top.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/block/backup-top.c b/block/backup-top.c index b8d863ff08..9aed2eb4c0 100644 --- a/block/backup-top.c +++ b/block/backup-top.c @@ -196,7 +196,7 @@ BlockDriverState *bdrv_backup_top_append(BlockDriverSta= te *source, } =20 top->total_sectors =3D source->total_sectors; - top->opaque =3D state =3D g_new0(BDRVBackupTopState, 1); + state =3D top->opaque; =20 bdrv_ref(target); state->target =3D bdrv_attach_child(top, target, "target", &child_file= , errp); --=20 2.20.1 From nobody Sun Feb 8 18:09:13 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.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; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580148431590133.88903499619698; Mon, 27 Jan 2020 10:07:11 -0800 (PST) Received: from localhost ([::1]:49214 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8n0-0007LC-In for importer@patchew.org; Mon, 27 Jan 2020 13:07:10 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:55099) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8cc-0002NK-0e for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:27 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iw8ca-0002ww-DA for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:25 -0500 Received: from us-smtp-delivery-1.mimecast.com ([207.211.31.120]:21882 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iw8ca-0002w7-82 for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:24 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-239-_V8-615YPPS927rbjt8SBg-1; Mon, 27 Jan 2020 12:56:21 -0500 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C4BDC1137840; Mon, 27 Jan 2020 17:56:20 +0000 (UTC) Received: from linux.fritz.box.com (ovpn-117-108.ams2.redhat.com [10.36.117.108]) by smtp.corp.redhat.com (Postfix) with ESMTP id CE2DC863C0; Mon, 27 Jan 2020 17:56:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580147783; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=rugvYEwoIwoelRTUu2JWXYPrO6eTvHjrQ7lHwwQIxQI=; b=V9Rg+hD5DlaafQud+VzG9vt60BhsWSu8VQeI9B2RipaSZGIlBblk3BPqo4MYyZqokpsbcU e0o4qAGUpMf5Qcw+0OWb4nY3Im3ydVrQ8mYEVCkJ5R+AaJg3byTa6lVyDwDIX1MQ/ePKH5 Do6TkLm0lzU+7K2wQ3RzJsAdy8d0Ed8= From: Kevin Wolf To: qemu-block@nongnu.org Subject: [PULL 12/13] iscsi: Cap block count from GET LBA STATUS (CVE-2020-1711) Date: Mon, 27 Jan 2020 18:55:58 +0100 Message-Id: <20200127175559.18173-13-kwolf@redhat.com> In-Reply-To: <20200127175559.18173-1-kwolf@redhat.com> References: <20200127175559.18173-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-MC-Unique: _V8-615YPPS927rbjt8SBg-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 207.211.31.120 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, peter.maydell@linaro.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Felipe Franciosi When querying an iSCSI server for the provisioning status of blocks (via GET LBA STATUS), Qemu only validates that the response descriptor zero's LBA matches the one requested. Given the SCSI spec allows servers to respond with the status of blocks beyond the end of the LUN, Qemu may have its heap corrupted by clearing/setting too many bits at the end of its allocmap for the LUN. A malicious guest in control of the iSCSI server could carefully program Qemu's heap (by selectively setting the bitmap) and then smash it. This limits the number of bits that iscsi_co_block_status() will try to update in the allocmap so it can't overflow the bitmap. Fixes: CVE-2020-1711 Cc: qemu-stable@nongnu.org Signed-off-by: Felipe Franciosi Signed-off-by: Peter Turschmid Signed-off-by: Raphael Norwitz Signed-off-by: Kevin Wolf --- block/iscsi.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/block/iscsi.c b/block/iscsi.c index 2aea7e3f13..cbd57294ab 100644 --- a/block/iscsi.c +++ b/block/iscsi.c @@ -701,7 +701,7 @@ static int coroutine_fn iscsi_co_block_status(BlockDriv= erState *bs, struct scsi_get_lba_status *lbas =3D NULL; struct scsi_lba_status_descriptor *lbasd =3D NULL; struct IscsiTask iTask; - uint64_t lba; + uint64_t lba, max_bytes; int ret; =20 iscsi_co_init_iscsitask(iscsilun, &iTask); @@ -721,6 +721,7 @@ static int coroutine_fn iscsi_co_block_status(BlockDriv= erState *bs, } =20 lba =3D offset / iscsilun->block_size; + max_bytes =3D (iscsilun->num_blocks - lba) * iscsilun->block_size; =20 qemu_mutex_lock(&iscsilun->mutex); retry: @@ -764,7 +765,7 @@ retry: goto out_unlock; } =20 - *pnum =3D (int64_t) lbasd->num_blocks * iscsilun->block_size; + *pnum =3D MIN((int64_t) lbasd->num_blocks * iscsilun->block_size, max_= bytes); =20 if (lbasd->provisioning =3D=3D SCSI_PROVISIONING_TYPE_DEALLOCATED || lbasd->provisioning =3D=3D SCSI_PROVISIONING_TYPE_ANCHORED) { --=20 2.20.1 From nobody Sun Feb 8 18:09:13 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.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; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1580148586438528.4438944787772; Mon, 27 Jan 2020 10:09:46 -0800 (PST) Received: from localhost ([::1]:49242 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8pV-0001Q2-8l for importer@patchew.org; Mon, 27 Jan 2020 13:09:45 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:55257) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iw8ce-0002Ty-W0 for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:29 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iw8cd-00031Y-8N for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:28 -0500 Received: from us-smtp-1.mimecast.com ([205.139.110.61]:52767 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iw8cd-00030u-30 for qemu-devel@nongnu.org; Mon, 27 Jan 2020 12:56:27 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-118-_jCNf9zHOtqIzkxJRBECfg-1; Mon, 27 Jan 2020 12:56:23 -0500 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 0ED8110054E3; Mon, 27 Jan 2020 17:56:22 +0000 (UTC) Received: from linux.fritz.box.com (ovpn-117-108.ams2.redhat.com [10.36.117.108]) by smtp.corp.redhat.com (Postfix) with ESMTP id 18363811FA; Mon, 27 Jan 2020 17:56:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1580147786; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=SUz5RWsEGqxHVI5aeGTjm6JjUoqyUOJxn3a+tb1QVSw=; b=fRTc28xFV2aCoQCPe1HJwVT50w0xli3HTgQEsY29cmQLj5kf0xHTV8ekvxrk1In1wgGRVm p6QD42WQNU50BBkcpiiuU8g68F2YIyj2yn7JHFAL7Rd5tq9w+tHvZGUtD90QD09T+vN1q1 5ms59jBi3A4fm78Mq1LFZ7e0H+lD+VI= From: Kevin Wolf To: qemu-block@nongnu.org Subject: [PULL 13/13] iscsi: Don't access non-existent scsi_lba_status_descriptor Date: Mon, 27 Jan 2020 18:55:59 +0100 Message-Id: <20200127175559.18173-14-kwolf@redhat.com> In-Reply-To: <20200127175559.18173-1-kwolf@redhat.com> References: <20200127175559.18173-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-MC-Unique: _jCNf9zHOtqIzkxJRBECfg-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 205.139.110.61 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, peter.maydell@linaro.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" In iscsi_co_block_status(), we may have received num_descriptors =3D=3D 0 from the iscsi server. Therefore, we can't unconditionally access lbas->descriptors[0]. Add the missing check. Signed-off-by: Kevin Wolf Reviewed-by: Felipe Franciosi Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: John Snow Reviewed-by: Peter Lieven --- block/iscsi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/block/iscsi.c b/block/iscsi.c index cbd57294ab..c8feaa2f0e 100644 --- a/block/iscsi.c +++ b/block/iscsi.c @@ -753,7 +753,7 @@ retry: } =20 lbas =3D scsi_datain_unmarshall(iTask.task); - if (lbas =3D=3D NULL) { + if (lbas =3D=3D NULL || lbas->num_descriptors =3D=3D 0) { ret =3D -EIO; goto out_unlock; } --=20 2.20.1