From nobody Sat Oct 25 23:38:22 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1516188751091838.0548462777455; Wed, 17 Jan 2018 03:32:31 -0800 (PST) Received: from localhost ([::1]:56794 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eblxG-00064q-5w for importer@patchew.org; Wed, 17 Jan 2018 06:32:30 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48424) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eblqR-0000S7-Dg for qemu-devel@nongnu.org; Wed, 17 Jan 2018 06:25:35 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eblqO-0003rb-Ur for qemu-devel@nongnu.org; Wed, 17 Jan 2018 06:25:27 -0500 Received: from mail-wr0-x243.google.com ([2a00:1450:400c:c0c::243]:40115) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eblqO-0003qa-8q; Wed, 17 Jan 2018 06:25:24 -0500 Received: by mail-wr0-x243.google.com with SMTP id 100so18446158wrb.7; Wed, 17 Jan 2018 03:25:24 -0800 (PST) Received: from 640k.lan (dynamic-adsl-78-12-229-84.clienti.tiscali.it. [78.12.229.84]) by smtp.gmail.com with ESMTPSA id w11sm2548965wrg.42.2018.01.17.03.25.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Jan 2018 03:25:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=QPOF4HBmmjfJRp/ufxdhWQtpJvfdFfSMZ1bOCntR+uQ=; b=B5pSwUXPru7uXh6cmUjhAj5IPZgQ4kAhoAR0q4JyVgoYVrdnDEOQMTMtIXYgoLYqpb mVGqFcLknPHb8X0ULPEIy3dV48D1dZzMximAcFKjtkRvrUh9hHPzCsjfEIsybqNOrGOw Z7x25P9KN/KSekbxvosVpMBxmhJk4YYCqfkhJTdXMmuZ1LRaY0lyhOPjDczoR9jsOy+j 9JjYEpha2xqnk6Kqe9KVP5ruH2SzWPugfN1v0uIBu8ZMmj1oSgt8aoMQPwtStSW4y5V3 q1wri54RlDvrGuXkOmQkzEQwoCLewYB3bidujpSHPR+F5H8JnmL0iZfRXKNQX0j6AYMl 3rog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=QPOF4HBmmjfJRp/ufxdhWQtpJvfdFfSMZ1bOCntR+uQ=; b=JfYHN//himsy2LiVH7oNIiysrxG6SLeJKmtsutHBRET7tlAUOm/fFm2O02pPPBsFvR aNlYmzJiRVqMxAouAzcmtvThJCfdgQPv4v5a1PtJ7YDfIU0sSLYXbXlMbmuQcJJ+n9kn +zoWsAbZtmF5l0rpdalFRsecXt1nMDHexMoeJezF/UeK0eePFMYOq1PJ/QNk9dZJRmJq PdbAmygnMTHSfKLGfswMAHwN1w3UTsCilFAS6wk+P/tjstBE5cq1Q0i5h6rHBIkPW6rA 7U1mmJXo8U3fdXcemAXJ2g1k7xJfPb9SJ4riSLLxHUK08kDlK/r18j4c5jf/4xLycqB+ YbpA== X-Gm-Message-State: AKwxytcG4jvzNkRhBBuEYQN2BqdzeIig5OaA9NKPzLb1H8MDH5n7KlE1 dX0gZypbKIivjh0+FOTZSJAgqcF4 X-Google-Smtp-Source: ACJfBoupspMZjPc0x1LWpK51dwv9oNGcKPoMOgbr7n0CKUFsonBCoy3U+IwpShKSADld9evXPx7G+w== X-Received: by 10.223.163.205 with SMTP id m13mr2442227wrb.174.1516188322682; Wed, 17 Jan 2018 03:25:22 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Wed, 17 Jan 2018 12:25:06 +0100 Message-Id: <1516188312-29612-2-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1516188312-29612-1-git-send-email-pbonzini@redhat.com> References: <1516188312-29612-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::243 Subject: [Qemu-devel] [PATCH 1/7] block: rename .bdrv_create() to .bdrv_co_create() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Stefan Hajnoczi , qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Stefan Hajnoczi BlockDriver->bdrv_create() has been called from coroutine context since commit 5b7e1542cfa41a281af9629d31cef03704d976e6 ("block: make bdrv_create adopt coroutine"). Make this explicit by renaming to .bdrv_co_create() and add the coroutine_fn annotation. This makes it obvious to block driver authors that they may yield, use CoMutex, or other coroutine_fn APIs. Signed-off-by: Stefan Hajnoczi Message-Id: <20170705102231.20711-2-stefanha@redhat.com> Signed-off-by: Paolo Bonzini --- block.c | 4 ++-- block/crypto.c | 8 ++++---- block/file-posix.c | 15 ++++++++------- block/file-win32.c | 5 +++-- block/gluster.c | 12 ++++++------ block/iscsi.c | 7 ++++--- block/nfs.c | 5 +++-- block/parallels.c | 6 ++++-- block/qcow.c | 5 +++-- block/qcow2.c | 5 +++-- block/qed.c | 6 ++++-- block/raw-format.c | 5 +++-- block/rbd.c | 6 ++++-- block/sheepdog.c | 10 +++++----- block/ssh.c | 5 +++-- block/vdi.c | 5 +++-- block/vhdx.c | 5 +++-- block/vmdk.c | 5 +++-- block/vpc.c | 5 +++-- include/block/block_int.h | 3 ++- 20 files changed, 73 insertions(+), 54 deletions(-) diff --git a/block.c b/block.c index a8da4f2..cf33135 100644 --- a/block.c +++ b/block.c @@ -417,7 +417,7 @@ static void coroutine_fn bdrv_create_co_entry(void *opa= que) CreateCo *cco =3D opaque; assert(cco->drv); =20 - ret =3D cco->drv->bdrv_create(cco->filename, cco->opts, &local_err); + ret =3D cco->drv->bdrv_co_create(cco->filename, cco->opts, &local_err); error_propagate(&cco->err, local_err); cco->ret =3D ret; } @@ -436,7 +436,7 @@ int bdrv_create(BlockDriver *drv, const char* filename, .err =3D NULL, }; =20 - if (!drv->bdrv_create) { + if (!drv->bdrv_co_create) { error_setg(errp, "Driver '%s' does not support image creation", dr= v->format_name); ret =3D -ENOTSUP; goto out; diff --git a/block/crypto.c b/block/crypto.c index 60ddf86..4acff45 100644 --- a/block/crypto.c +++ b/block/crypto.c @@ -554,9 +554,9 @@ static int block_crypto_open_luks(BlockDriverState *bs, bs, options, flags, errp); } =20 -static int block_crypto_create_luks(const char *filename, - QemuOpts *opts, - Error **errp) +static int coroutine_fn block_crypto_co_create_luks(const char *filename, + QemuOpts *opts, + Error **errp) { return block_crypto_create_generic(Q_CRYPTO_BLOCK_FORMAT_LUKS, filename, opts, errp); @@ -616,7 +616,7 @@ BlockDriver bdrv_crypto_luks =3D { .bdrv_open =3D block_crypto_open_luks, .bdrv_close =3D block_crypto_close, .bdrv_child_perm =3D bdrv_format_default_perms, - .bdrv_create =3D block_crypto_create_luks, + .bdrv_co_create =3D block_crypto_co_create_luks, .bdrv_truncate =3D block_crypto_truncate, .create_opts =3D &block_crypto_create_opts_luks, =20 diff --git a/block/file-posix.c b/block/file-posix.c index 36ee89e..39d2795 100644 --- a/block/file-posix.c +++ b/block/file-posix.c @@ -1979,7 +1979,8 @@ static int64_t raw_get_allocated_file_size(BlockDrive= rState *bs) return (int64_t)st.st_blocks * 512; } =20 -static int raw_create(const char *filename, QemuOpts *opts, Error **errp) +static int coroutine_fn raw_co_create(const char *filename, QemuOpts *opts, + Error **errp) { int fd; int result =3D 0; @@ -2278,7 +2279,7 @@ BlockDriver bdrv_file =3D { .bdrv_reopen_commit =3D raw_reopen_commit, .bdrv_reopen_abort =3D raw_reopen_abort, .bdrv_close =3D raw_close, - .bdrv_create =3D raw_create, + .bdrv_co_create =3D raw_co_create, .bdrv_has_zero_init =3D bdrv_has_zero_init_1, .bdrv_co_get_block_status =3D raw_co_get_block_status, .bdrv_co_pwrite_zeroes =3D raw_co_pwrite_zeroes, @@ -2682,8 +2683,8 @@ static coroutine_fn int hdev_co_pwrite_zeroes(BlockDr= iverState *bs, return -ENOTSUP; } =20 -static int hdev_create(const char *filename, QemuOpts *opts, - Error **errp) +static int coroutine_fn hdev_co_create(const char *filename, QemuOpts *opt= s, + Error **errp) { int fd; int ret =3D 0; @@ -2756,7 +2757,7 @@ static BlockDriver bdrv_host_device =3D { .bdrv_reopen_prepare =3D raw_reopen_prepare, .bdrv_reopen_commit =3D raw_reopen_commit, .bdrv_reopen_abort =3D raw_reopen_abort, - .bdrv_create =3D hdev_create, + .bdrv_co_create =3D hdev_co_create, .create_opts =3D &raw_create_opts, .bdrv_co_pwrite_zeroes =3D hdev_co_pwrite_zeroes, =20 @@ -2878,7 +2879,7 @@ static BlockDriver bdrv_host_cdrom =3D { .bdrv_reopen_prepare =3D raw_reopen_prepare, .bdrv_reopen_commit =3D raw_reopen_commit, .bdrv_reopen_abort =3D raw_reopen_abort, - .bdrv_create =3D hdev_create, + .bdrv_co_create =3D hdev_co_create, .create_opts =3D &raw_create_opts, =20 =20 @@ -3009,7 +3010,7 @@ static BlockDriver bdrv_host_cdrom =3D { .bdrv_reopen_prepare =3D raw_reopen_prepare, .bdrv_reopen_commit =3D raw_reopen_commit, .bdrv_reopen_abort =3D raw_reopen_abort, - .bdrv_create =3D hdev_create, + .bdrv_co_create =3D hdev_co_create, .create_opts =3D &raw_create_opts, =20 .bdrv_co_preadv =3D raw_co_preadv, diff --git a/block/file-win32.c b/block/file-win32.c index 9e02214..4d88b14 100644 --- a/block/file-win32.c +++ b/block/file-win32.c @@ -550,7 +550,8 @@ static int64_t raw_get_allocated_file_size(BlockDriverS= tate *bs) return st.st_size; } =20 -static int raw_create(const char *filename, QemuOpts *opts, Error **errp) +static int coroutine_fn raw_co_create(const char *filename, QemuOpts *opts, + Error **errp) { int fd; int64_t total_size =3D 0; @@ -596,7 +597,7 @@ BlockDriver bdrv_file =3D { .bdrv_file_open =3D raw_open, .bdrv_refresh_limits =3D raw_probe_alignment, .bdrv_close =3D raw_close, - .bdrv_create =3D raw_create, + .bdrv_co_create =3D raw_co_create, .bdrv_has_zero_init =3D bdrv_has_zero_init_1, =20 .bdrv_aio_readv =3D raw_aio_readv, diff --git a/block/gluster.c b/block/gluster.c index 0f4265a..9419e0c 100644 --- a/block/gluster.c +++ b/block/gluster.c @@ -962,8 +962,8 @@ static coroutine_fn int qemu_gluster_co_pwrite_zeroes(B= lockDriverState *bs, } #endif =20 -static int qemu_gluster_create(const char *filename, - QemuOpts *opts, Error **errp) +static int coroutine_fn qemu_gluster_co_create(const char *filename, + QemuOpts *opts, Error **err= p) { BlockdevOptionsGluster *gconf; struct glfs *glfs; @@ -1424,7 +1424,7 @@ static BlockDriver bdrv_gluster =3D { .bdrv_reopen_commit =3D qemu_gluster_reopen_commit, .bdrv_reopen_abort =3D qemu_gluster_reopen_abort, .bdrv_close =3D qemu_gluster_close, - .bdrv_create =3D qemu_gluster_create, + .bdrv_co_create =3D qemu_gluster_co_create, .bdrv_getlength =3D qemu_gluster_getlength, .bdrv_get_allocated_file_size =3D qemu_gluster_allocated_file_size, .bdrv_truncate =3D qemu_gluster_truncate, @@ -1452,7 +1452,7 @@ static BlockDriver bdrv_gluster_tcp =3D { .bdrv_reopen_commit =3D qemu_gluster_reopen_commit, .bdrv_reopen_abort =3D qemu_gluster_reopen_abort, .bdrv_close =3D qemu_gluster_close, - .bdrv_create =3D qemu_gluster_create, + .bdrv_co_create =3D qemu_gluster_co_create, .bdrv_getlength =3D qemu_gluster_getlength, .bdrv_get_allocated_file_size =3D qemu_gluster_allocated_file_size, .bdrv_truncate =3D qemu_gluster_truncate, @@ -1480,7 +1480,7 @@ static BlockDriver bdrv_gluster_unix =3D { .bdrv_reopen_commit =3D qemu_gluster_reopen_commit, .bdrv_reopen_abort =3D qemu_gluster_reopen_abort, .bdrv_close =3D qemu_gluster_close, - .bdrv_create =3D qemu_gluster_create, + .bdrv_co_create =3D qemu_gluster_co_create, .bdrv_getlength =3D qemu_gluster_getlength, .bdrv_get_allocated_file_size =3D qemu_gluster_allocated_file_size, .bdrv_truncate =3D qemu_gluster_truncate, @@ -1514,7 +1514,7 @@ static BlockDriver bdrv_gluster_rdma =3D { .bdrv_reopen_commit =3D qemu_gluster_reopen_commit, .bdrv_reopen_abort =3D qemu_gluster_reopen_abort, .bdrv_close =3D qemu_gluster_close, - .bdrv_create =3D qemu_gluster_create, + .bdrv_co_create =3D qemu_gluster_co_create, .bdrv_getlength =3D qemu_gluster_getlength, .bdrv_get_allocated_file_size =3D qemu_gluster_allocated_file_size, .bdrv_truncate =3D qemu_gluster_truncate, diff --git a/block/iscsi.c b/block/iscsi.c index 6a1c537..5f358f9 100644 --- a/block/iscsi.c +++ b/block/iscsi.c @@ -2103,7 +2103,8 @@ static int iscsi_truncate(BlockDriverState *bs, int64= _t offset, return 0; } =20 -static int iscsi_create(const char *filename, QemuOpts *opts, Error **errp) +static int coroutine_fn iscsi_co_create(const char *filename, QemuOpts *op= ts, + Error **errp) { int ret =3D 0; int64_t total_size =3D 0; @@ -2191,7 +2192,7 @@ static BlockDriver bdrv_iscsi =3D { .bdrv_parse_filename =3D iscsi_parse_filename, .bdrv_file_open =3D iscsi_open, .bdrv_close =3D iscsi_close, - .bdrv_create =3D iscsi_create, + .bdrv_co_create =3D iscsi_co_create, .create_opts =3D &iscsi_create_opts, .bdrv_reopen_prepare =3D iscsi_reopen_prepare, .bdrv_reopen_commit =3D iscsi_reopen_commit, @@ -2226,7 +2227,7 @@ static BlockDriver bdrv_iser =3D { .bdrv_parse_filename =3D iscsi_parse_filename, .bdrv_file_open =3D iscsi_open, .bdrv_close =3D iscsi_close, - .bdrv_create =3D iscsi_create, + .bdrv_co_create =3D iscsi_co_create, .create_opts =3D &iscsi_create_opts, .bdrv_reopen_prepare =3D iscsi_reopen_prepare, .bdrv_reopen_commit =3D iscsi_reopen_commit, diff --git a/block/nfs.c b/block/nfs.c index effc871..8029dc2 100644 --- a/block/nfs.c +++ b/block/nfs.c @@ -684,7 +684,8 @@ static QemuOptsList nfs_create_opts =3D { } }; =20 -static int nfs_file_create(const char *url, QemuOpts *opts, Error **errp) +static int coroutine_fn nfs_file_co_create(const char *url, QemuOpts *opts, + Error **errp) { int64_t ret, total_size; NFSClient *client =3D g_new0(NFSClient, 1); @@ -897,7 +898,7 @@ static BlockDriver bdrv_nfs =3D { =20 .bdrv_file_open =3D nfs_file_open, .bdrv_close =3D nfs_file_close, - .bdrv_create =3D nfs_file_create, + .bdrv_co_create =3D nfs_file_co_create, .bdrv_reopen_prepare =3D nfs_reopen_prepare, =20 .bdrv_co_preadv =3D nfs_co_preadv, diff --git a/block/parallels.c b/block/parallels.c index 9545761..5f1497d 100644 --- a/block/parallels.c +++ b/block/parallels.c @@ -479,7 +479,9 @@ static int parallels_check(BlockDriverState *bs, BdrvCh= eckResult *res, } =20 =20 -static int parallels_create(const char *filename, QemuOpts *opts, Error **= errp) +static int coroutine_fn parallels_co_create(const char *filename, + QemuOpts *opts, + Error **errp) { int64_t total_size, cl_size; uint8_t tmp[BDRV_SECTOR_SIZE]; @@ -799,7 +801,7 @@ static BlockDriver bdrv_parallels =3D { .bdrv_co_readv =3D parallels_co_readv, .bdrv_co_writev =3D parallels_co_writev, =20 - .bdrv_create =3D parallels_create, + .bdrv_co_create =3D parallels_co_create, .bdrv_check =3D parallels_check, .create_opts =3D ¶llels_create_opts, }; diff --git a/block/qcow.c b/block/qcow.c index 9569dee..ebb7cea 100644 --- a/block/qcow.c +++ b/block/qcow.c @@ -789,7 +789,8 @@ static void qcow_close(BlockDriverState *bs) error_free(s->migration_blocker); } =20 -static int qcow_create(const char *filename, QemuOpts *opts, Error **errp) +static int coroutine_fn qcow_co_create(const char *filename, QemuOpts *opt= s, + Error **errp) { int header_size, backing_filename_len, l1_size, shift, i; QCowHeader header; @@ -1105,7 +1106,7 @@ static BlockDriver bdrv_qcow =3D { .bdrv_close =3D qcow_close, .bdrv_child_perm =3D bdrv_format_default_perms, .bdrv_reopen_prepare =3D qcow_reopen_prepare, - .bdrv_create =3D qcow_create, + .bdrv_co_create =3D qcow_co_create, .bdrv_has_zero_init =3D bdrv_has_zero_init_1, .supports_backing =3D true, =20 diff --git a/block/qcow2.c b/block/qcow2.c index 4348b2c..be2d485 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -2881,7 +2881,8 @@ out: return ret; } =20 -static int qcow2_create(const char *filename, QemuOpts *opts, Error **errp) +static int coroutine_fn qcow2_co_create(const char *filename, QemuOpts *op= ts, + Error **errp) { char *backing_file =3D NULL; char *backing_fmt =3D NULL; @@ -4318,7 +4319,7 @@ BlockDriver bdrv_qcow2 =3D { .bdrv_reopen_abort =3D qcow2_reopen_abort, .bdrv_join_options =3D qcow2_join_options, .bdrv_child_perm =3D bdrv_format_default_perms, - .bdrv_create =3D qcow2_create, + .bdrv_co_create =3D qcow2_co_create, .bdrv_has_zero_init =3D bdrv_has_zero_init_1, .bdrv_co_get_block_status =3D qcow2_co_get_block_status, =20 diff --git a/block/qed.c b/block/qed.c index 821dcaa..e0e08ce 100644 --- a/block/qed.c +++ b/block/qed.c @@ -638,7 +638,9 @@ out: return ret; } =20 -static int bdrv_qed_create(const char *filename, QemuOpts *opts, Error **e= rrp) +static int coroutine_fn bdrv_qed_co_create(const char *filename, + QemuOpts *opts, + Error **errp) { uint64_t image_size =3D 0; uint32_t cluster_size =3D QED_DEFAULT_CLUSTER_SIZE; @@ -1593,7 +1595,7 @@ static BlockDriver bdrv_qed =3D { .bdrv_close =3D bdrv_qed_close, .bdrv_reopen_prepare =3D bdrv_qed_reopen_prepare, .bdrv_child_perm =3D bdrv_format_default_perms, - .bdrv_create =3D bdrv_qed_create, + .bdrv_co_create =3D bdrv_qed_co_create, .bdrv_has_zero_init =3D bdrv_has_zero_init_1, .bdrv_co_get_block_status =3D bdrv_qed_co_get_block_status, .bdrv_co_readv =3D bdrv_qed_co_readv, diff --git a/block/raw-format.c b/block/raw-format.c index ab552c0..92b4753 100644 --- a/block/raw-format.c +++ b/block/raw-format.c @@ -396,7 +396,8 @@ static int raw_has_zero_init(BlockDriverState *bs) return bdrv_has_zero_init(bs->file->bs); } =20 -static int raw_create(const char *filename, QemuOpts *opts, Error **errp) +static int coroutine_fn raw_co_create(const char *filename, QemuOpts *opts, + Error **errp) { return bdrv_create_file(filename, opts, errp); } @@ -491,7 +492,7 @@ BlockDriver bdrv_raw =3D { .bdrv_open =3D &raw_open, .bdrv_close =3D &raw_close, .bdrv_child_perm =3D bdrv_filter_default_perms, - .bdrv_create =3D &raw_create, + .bdrv_co_create =3D &raw_co_create, .bdrv_co_preadv =3D &raw_co_preadv, .bdrv_co_pwritev =3D &raw_co_pwritev, .bdrv_co_pwrite_zeroes =3D &raw_co_pwrite_zeroes, diff --git a/block/rbd.c b/block/rbd.c index a76a5e8..67ac2ee 100644 --- a/block/rbd.c +++ b/block/rbd.c @@ -348,7 +348,9 @@ static QemuOptsList runtime_opts =3D { }, }; =20 -static int qemu_rbd_create(const char *filename, QemuOpts *opts, Error **e= rrp) +static int coroutine_fn qemu_rbd_co_create(const char *filename, + QemuOpts *opts, + Error **errp) { Error *local_err =3D NULL; int64_t bytes =3D 0; @@ -1129,7 +1131,7 @@ static BlockDriver bdrv_rbd =3D { .bdrv_file_open =3D qemu_rbd_open, .bdrv_close =3D qemu_rbd_close, .bdrv_reopen_prepare =3D qemu_rbd_reopen_prepare, - .bdrv_create =3D qemu_rbd_create, + .bdrv_co_create =3D qemu_rbd_co_create, .bdrv_has_zero_init =3D bdrv_has_zero_init_1, .bdrv_get_info =3D qemu_rbd_getinfo, .create_opts =3D &qemu_rbd_create_opts, diff --git a/block/sheepdog.c b/block/sheepdog.c index f684477..c90bdc3 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -1964,8 +1964,8 @@ static int parse_block_size_shift(BDRVSheepdogState *= s, QemuOpts *opt) return 0; } =20 -static int sd_create(const char *filename, QemuOpts *opts, - Error **errp) +static int coroutine_fn sd_co_create(const char *filename, QemuOpts *opts, + Error **errp) { Error *err =3D NULL; int ret =3D 0; @@ -3086,7 +3086,7 @@ static BlockDriver bdrv_sheepdog =3D { .bdrv_reopen_commit =3D sd_reopen_commit, .bdrv_reopen_abort =3D sd_reopen_abort, .bdrv_close =3D sd_close, - .bdrv_create =3D sd_create, + .bdrv_co_create =3D sd_co_create, .bdrv_has_zero_init =3D bdrv_has_zero_init_1, .bdrv_getlength =3D sd_getlength, .bdrv_get_allocated_file_size =3D sd_get_allocated_file_size, @@ -3122,7 +3122,7 @@ static BlockDriver bdrv_sheepdog_tcp =3D { .bdrv_reopen_commit =3D sd_reopen_commit, .bdrv_reopen_abort =3D sd_reopen_abort, .bdrv_close =3D sd_close, - .bdrv_create =3D sd_create, + .bdrv_co_create =3D sd_co_create, .bdrv_has_zero_init =3D bdrv_has_zero_init_1, .bdrv_getlength =3D sd_getlength, .bdrv_get_allocated_file_size =3D sd_get_allocated_file_size, @@ -3158,7 +3158,7 @@ static BlockDriver bdrv_sheepdog_unix =3D { .bdrv_reopen_commit =3D sd_reopen_commit, .bdrv_reopen_abort =3D sd_reopen_abort, .bdrv_close =3D sd_close, - .bdrv_create =3D sd_create, + .bdrv_co_create =3D sd_co_create, .bdrv_has_zero_init =3D bdrv_has_zero_init_1, .bdrv_getlength =3D sd_getlength, .bdrv_get_allocated_file_size =3D sd_get_allocated_file_size, diff --git a/block/ssh.c b/block/ssh.c index b049a16..72f44ce 100644 --- a/block/ssh.c +++ b/block/ssh.c @@ -813,7 +813,8 @@ static QemuOptsList ssh_create_opts =3D { } }; =20 -static int ssh_create(const char *filename, QemuOpts *opts, Error **errp) +static int coroutine_fn ssh_co_create(const char *filename, QemuOpts *opts, + Error **errp) { int r, ret; int64_t total_size =3D 0; @@ -1201,7 +1202,7 @@ static BlockDriver bdrv_ssh =3D { .instance_size =3D sizeof(BDRVSSHState), .bdrv_parse_filename =3D ssh_parse_filename, .bdrv_file_open =3D ssh_file_open, - .bdrv_create =3D ssh_create, + .bdrv_co_create =3D ssh_co_create, .bdrv_close =3D ssh_close, .bdrv_has_zero_init =3D ssh_has_zero_init, .bdrv_co_readv =3D ssh_co_readv, diff --git a/block/vdi.c b/block/vdi.c index 8da5dfc..01501d7 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -716,7 +716,8 @@ nonallocating_write: return ret; } =20 -static int vdi_create(const char *filename, QemuOpts *opts, Error **errp) +static int coroutine_fn vdi_co_create(const char *filename, QemuOpts *opts, + Error **errp) { int ret =3D 0; uint64_t bytes =3D 0; @@ -894,7 +895,7 @@ static BlockDriver bdrv_vdi =3D { .bdrv_close =3D vdi_close, .bdrv_reopen_prepare =3D vdi_reopen_prepare, .bdrv_child_perm =3D bdrv_format_default_perms, - .bdrv_create =3D vdi_create, + .bdrv_co_create =3D vdi_co_create, .bdrv_has_zero_init =3D bdrv_has_zero_init_1, .bdrv_co_get_block_status =3D vdi_co_get_block_status, .bdrv_make_empty =3D vdi_make_empty, diff --git a/block/vhdx.c b/block/vhdx.c index 9956933..7fad8b2 100644 --- a/block/vhdx.c +++ b/block/vhdx.c @@ -1792,7 +1792,8 @@ exit: * .---- ~ ----------- ~ ------------ ~ ---------------- ~ -----------. * 1MB */ -static int vhdx_create(const char *filename, QemuOpts *opts, Error **errp) +static int coroutine_fn vhdx_co_create(const char *filename, QemuOpts *opt= s, + Error **errp) { int ret =3D 0; uint64_t image_size =3D (uint64_t) 2 * GiB; @@ -2003,7 +2004,7 @@ static BlockDriver bdrv_vhdx =3D { .bdrv_child_perm =3D bdrv_format_default_perms, .bdrv_co_readv =3D vhdx_co_readv, .bdrv_co_writev =3D vhdx_co_writev, - .bdrv_create =3D vhdx_create, + .bdrv_co_create =3D vhdx_co_create, .bdrv_get_info =3D vhdx_get_info, .bdrv_check =3D vhdx_check, .bdrv_has_zero_init =3D bdrv_has_zero_init_1, diff --git a/block/vmdk.c b/block/vmdk.c index c665bcc..d4beb25 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -1875,7 +1875,8 @@ static int filename_decompose(const char *filename, c= har *path, char *prefix, return VMDK_OK; } =20 -static int vmdk_create(const char *filename, QemuOpts *opts, Error **errp) +static int coroutine_fn vmdk_co_create(const char *filename, QemuOpts *opt= s, + Error **errp) { int idx =3D 0; BlockBackend *new_blk =3D NULL; @@ -2391,7 +2392,7 @@ static BlockDriver bdrv_vmdk =3D { .bdrv_co_pwritev_compressed =3D vmdk_co_pwritev_compressed, .bdrv_co_pwrite_zeroes =3D vmdk_co_pwrite_zeroes, .bdrv_close =3D vmdk_close, - .bdrv_create =3D vmdk_create, + .bdrv_co_create =3D vmdk_co_create, .bdrv_co_flush_to_disk =3D vmdk_co_flush, .bdrv_co_get_block_status =3D vmdk_co_get_block_status, .bdrv_get_allocated_file_size =3D vmdk_get_allocated_file_size, diff --git a/block/vpc.c b/block/vpc.c index 1576d7b..1817f72 100644 --- a/block/vpc.c +++ b/block/vpc.c @@ -895,7 +895,8 @@ static int create_fixed_disk(BlockBackend *blk, uint8_t= *buf, return ret; } =20 -static int vpc_create(const char *filename, QemuOpts *opts, Error **errp) +static int coroutine_fn vpc_co_create(const char *filename, QemuOpts *opts, + Error **errp) { uint8_t buf[1024]; VHDFooter *footer =3D (VHDFooter *) buf; @@ -1093,7 +1094,7 @@ static BlockDriver bdrv_vpc =3D { .bdrv_close =3D vpc_close, .bdrv_reopen_prepare =3D vpc_reopen_prepare, .bdrv_child_perm =3D bdrv_format_default_perms, - .bdrv_create =3D vpc_create, + .bdrv_co_create =3D vpc_co_create, =20 .bdrv_co_preadv =3D vpc_co_preadv, .bdrv_co_pwritev =3D vpc_co_pwritev, diff --git a/include/block/block_int.h b/include/block/block_int.h index 29cafa4..05f498f 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -130,7 +130,8 @@ struct BlockDriver { int (*bdrv_file_open)(BlockDriverState *bs, QDict *options, int flags, Error **errp); void (*bdrv_close)(BlockDriverState *bs); - int (*bdrv_create)(const char *filename, QemuOpts *opts, Error **errp); + int coroutine_fn (*bdrv_co_create)(const char *filename, QemuOpts *opt= s, + Error **errp); int (*bdrv_make_empty)(BlockDriverState *bs); =20 void (*bdrv_refresh_filename)(BlockDriverState *bs, QDict *options); --=20 1.8.3.1 From nobody Sat Oct 25 23:38:22 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1516188454892176.55577781789736; Wed, 17 Jan 2018 03:27:34 -0800 (PST) Received: from localhost ([::1]:56675 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eblsR-0001ki-4A for importer@patchew.org; Wed, 17 Jan 2018 06:27:31 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48425) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eblqR-0000S8-Dp for qemu-devel@nongnu.org; Wed, 17 Jan 2018 06:25:28 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eblqQ-0003t2-GQ for qemu-devel@nongnu.org; Wed, 17 Jan 2018 06:25:27 -0500 Received: from mail-wr0-x241.google.com ([2a00:1450:400c:c0c::241]:34487) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eblqQ-0003sF-As; Wed, 17 Jan 2018 06:25:26 -0500 Received: by mail-wr0-x241.google.com with SMTP id 36so18478572wrh.1; Wed, 17 Jan 2018 03:25:26 -0800 (PST) Received: from 640k.lan (dynamic-adsl-78-12-229-84.clienti.tiscali.it. [78.12.229.84]) by smtp.gmail.com with ESMTPSA id w11sm2548965wrg.42.2018.01.17.03.25.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Jan 2018 03:25:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=dfq2b2akh1elQ7l7JMYmwH1vTGFn+7KPU+nR4E79hS0=; b=NXpY0oBKakiawbnnFDYZ1GpRiXjGMjXRPFfC8ylZAzMYYogM22+6C1Me8g20EEkNww /T0CXx1CFUYwhR2GKE4ck1EhYhAZGpNjIZkI7+7TVwo/1UCDn0PZa+OrCKC8Qj5JxJim cjAPXkH7LFPhWgPUfg4gkXoxFR8hI12sIR5HAprwl654KgI2l6ZLKQUWWLLOZU1NdFQs RKLDLHG1BrtOCinVfDQ0jLMZZ+Q1ZuncyXaXPePE0AR/v0yF1pbWzwhnPH8XCzjD4zeI +QkeedaGfNKYHhk9OwdYxkDBfrQDJYjpjTj9rATgWrnYKTDpS7AnPu9fcbyw0k5tUy/j ZWdQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=dfq2b2akh1elQ7l7JMYmwH1vTGFn+7KPU+nR4E79hS0=; b=Qa7N5PcTLBm56v0Ww9XV8+lJsNluH0qdQW1g92wvwPUEmaPFPu2lu6Z4UV1mz5Hjfb 6EMzK/JrfkswyKt40RhqO96swm9gx7IlGDf8lEA3TJMVFmUdtAAUXUG8l9ImTIwNeWVG Yay+E4V4GmwofSOPYNaQ//24y6p0iQob8jtQKjdGJX+BqudIeFu/ddN5PVJ42HL9xhfF KZl5qqxpX1/T+TwLb9uHuh0FvgzfjLuAJDG3rPzB00od3jLb7jzPu6UYUtr/Ec03QS81 zqJKFWQtNFSRY+Y0Pk7KziTBfhN2IU/qo66rWgFJ9ouzPcfnYhp9gqwXAuRtDSl4lqff us2A== X-Gm-Message-State: AKwxytfMMI5EdXVx6x0EHyTli8uHR2nedRCjgzWHJVbGxlUIMEYb5Z4o fopMlw+ZoDSm6am5gQrsxWftiPdi X-Google-Smtp-Source: ACJfBotspu4nm/RYn25LR3Fzw63fCi1Arz6Ct4AfTNdpv1ipDUvAyRFgUNZdFZoKdvWyNCQgSDQhiw== X-Received: by 10.223.199.205 with SMTP id y13mr2177395wrg.114.1516188325013; Wed, 17 Jan 2018 03:25:25 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Wed, 17 Jan 2018 12:25:07 +0100 Message-Id: <1516188312-29612-3-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1516188312-29612-1-git-send-email-pbonzini@redhat.com> References: <1516188312-29612-1-git-send-email-pbonzini@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::241 Subject: [Qemu-devel] [PATCH 2/7] qcow2: make qcow2_co_create2() a coroutine_fn X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Stefan Hajnoczi , qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 From: Stefan Hajnoczi qcow2_create2() calls qemu_co_mutex_lock(). Only a coroutine_fn may call another coroutine_fn. Rename the function (the block layer API is now called .bdrv_co_create()) and add coroutine_fn. It is always called from coroutine context. Reported-by: Marc-Andr=C3=A9 Lureau Signed-off-by: Stefan Hajnoczi Message-Id: <20170705102231.20711-3-stefanha@redhat.com> Signed-off-by: Paolo Bonzini --- block/qcow2.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/block/qcow2.c b/block/qcow2.c index be2d485..fec065b 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -2690,11 +2690,12 @@ static uint64_t qcow2_opt_get_refcount_bits_del(Qem= uOpts *opts, int version, return refcount_bits; } =20 -static int qcow2_create2(const char *filename, int64_t total_size, - const char *backing_file, const char *backing_for= mat, - int flags, size_t cluster_size, PreallocMode prea= lloc, - QemuOpts *opts, int version, int refcount_order, - const char *encryptfmt, Error **errp) +static int coroutine_fn +qcow2_co_create2(const char *filename, int64_t total_size, + const char *backing_file, const char *backing_format, + int flags, size_t cluster_size, PreallocMode prealloc, + QemuOpts *opts, int version, int refcount_order, + const char *encryptfmt, Error **errp) { QDict *options; =20 @@ -2963,9 +2964,9 @@ static int coroutine_fn qcow2_co_create(const char *f= ilename, QemuOpts *opts, =20 refcount_order =3D ctz32(refcount_bits); =20 - ret =3D qcow2_create2(filename, size, backing_file, backing_fmt, flags, - cluster_size, prealloc, opts, version, refcount_or= der, - encryptfmt, &local_err); + ret =3D qcow2_co_create2(filename, size, backing_file, backing_fmt, fl= ags, + cluster_size, prealloc, opts, version, refcount= _order, + encryptfmt, &local_err); error_propagate(errp, local_err); =20 finish: --=20 1.8.3.1 From nobody Sat Oct 25 23:38:22 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1516188463525515.882219594873; Wed, 17 Jan 2018 03:27:43 -0800 (PST) Received: from localhost ([::1]:56676 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eblsZ-0001q9-Bl for importer@patchew.org; Wed, 17 Jan 2018 06:27:39 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48521) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eblqW-0000Vw-Ap for qemu-devel@nongnu.org; Wed, 17 Jan 2018 06:25:34 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eblqS-0003un-5i for qemu-devel@nongnu.org; Wed, 17 Jan 2018 06:25:32 -0500 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]:41400) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eblqR-0003ta-Um; Wed, 17 Jan 2018 06:25:28 -0500 Received: by mail-wm0-x242.google.com with SMTP id f71so14473771wmf.0; Wed, 17 Jan 2018 03:25:27 -0800 (PST) Received: from 640k.lan (dynamic-adsl-78-12-229-84.clienti.tiscali.it. [78.12.229.84]) by smtp.gmail.com with ESMTPSA id w11sm2548965wrg.42.2018.01.17.03.25.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Jan 2018 03:25:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=Snjw5yFk4LpodPvJ+6351EJ2NOr6+utSqeinpdpt5X8=; b=eQ/Rz4ekyHngdDiwY7HtJtFtLOAj7b2R90PtEKivz1939HYF2hVxZLTdM8e8vmjXdS 6W+eDLgCXnCEu/08aIaMuy2sx+wrtOuo2ESOqKJaoGanMCuXhiiZsYayD1JF4+wor50Z JiUPvRgi1ZcCd2w21oajSbSJwdWfXRKHFmD17aFg4ajIohWaZKkx+6l5Uq5qBsgeozf3 f6b84nqpSID2BjkIZBEf+i4cA0/aSyFjZLdgnmSDk53s/LQ44DKkPlqVgWMFicxmF4Lf 7uhcBBq9KR5SSetP9W2ZWSLJfOqS1c5vzp6iPeHfF101WV5I8OBWguzCTVeF2VBwsESG DvhA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=Snjw5yFk4LpodPvJ+6351EJ2NOr6+utSqeinpdpt5X8=; b=Vpba427Xx46+7UjxTZBYeKPBhcSGS+cx9auJlVOaehhi0IHxH/KOlsaWNRc47mGpRo 7MrIQuvSDBxLkg+TVnGodZ0x8+qP2nMZpOnAMO7qjCwpJ93TPjP4ivpF/KwT8XZTx9LX 6Ky/qA0NBIgm2cSRpltsrrXRKPE45JxhZGxs/9yU+auYAyqgn2R1Um80kvMMVIkxflbP cNtBBZisU0V86nn2j7PdWPk43WjUYfwunoL32FI+li9lABui5EcFSe+3qyam0e7SbLxM qNoMLO9ZSXQwmvCwZnVu3pFWCB6piDQ0eEc9BCGXR5JouLgO8CyZQhDwivATwO/620dv XixQ== X-Gm-Message-State: AKwxytdivFgo/EoQ3Vo4OryHWJbKJcyY90rOX1PjwxHNdwo/Xu94SMds eIVG+HgcwI1A3eAY8MLspCGJdUTq X-Google-Smtp-Source: ACJfBotRQe7YYnpwKwGDv08JywLPAZlecMtfPI9+d4h3NVdZ7UVaF7kVkPUrYKKlCBbApqIINBPgpQ== X-Received: by 10.28.127.132 with SMTP id a126mr1797012wmd.37.1516188326589; Wed, 17 Jan 2018 03:25:26 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Wed, 17 Jan 2018 12:25:08 +0100 Message-Id: <1516188312-29612-4-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1516188312-29612-1-git-send-email-pbonzini@redhat.com> References: <1516188312-29612-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::242 Subject: [Qemu-devel] [PATCH 3/7] qcow2: make qcow2_do_open a coroutine_fn X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" It is called from qcow2_invalidate_cache in coroutine context (incoming migration runs in a coroutine), so it's cleaner if metadata is always loaded from a coroutine. Signed-off-by: Paolo Bonzini --- block/qcow2.c | 46 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/block/qcow2.c b/block/qcow2.c index fec065b..7c11516 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -1087,8 +1087,9 @@ static int qcow2_update_options(BlockDriverState *bs,= QDict *options, return ret; } =20 -static int qcow2_do_open(BlockDriverState *bs, QDict *options, int flags, - Error **errp) +/* Called with s->lock held. */ +static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options, + int flags, Error **errp) { BDRVQcow2State *s =3D bs->opaque; unsigned int len, i; @@ -1467,8 +1468,6 @@ static int qcow2_do_open(BlockDriverState *bs, QDict = *options, int flags, } } =20 - /* Initialise locks */ - qemu_co_mutex_init(&s->lock); bs->supported_zero_flags =3D BDRV_REQ_MAY_UNMAP; =20 /* Repair image if dirty */ @@ -1514,16 +1513,53 @@ static int qcow2_do_open(BlockDriverState *bs, QDic= t *options, int flags, return ret; } =20 +typedef struct QCow2OpenCo { + BlockDriverState *bs; + QDict *options; + int flags; + Error **errp; + int ret; +} QCow2OpenCo; + +static void coroutine_fn qcow2_open_entry(void *opaque) +{ + QCow2OpenCo *qoc =3D opaque; + BDRVQcow2State *s =3D qoc->bs->opaque; + + qemu_co_mutex_lock(&s->lock); + qoc->ret =3D qcow2_do_open(qoc->bs, qoc->options, qoc->flags, qoc->err= p); + qemu_co_mutex_unlock(&s->lock); +} + static int qcow2_open(BlockDriverState *bs, QDict *options, int flags, Error **errp) { + BDRVQcow2State *s =3D bs->opaque; + QCow2OpenCo qoc =3D { + .bs =3D bs, + .options =3D options, + .flags =3D flags, + .errp =3D errp, + .ret =3D -EINPROGRESS + }; + bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_file, false, errp); if (!bs->file) { return -EINVAL; } =20 - return qcow2_do_open(bs, options, flags, errp); + /* Initialise locks */ + qemu_co_mutex_init(&s->lock); + + if (qemu_in_coroutine()) { + /* From bdrv_co_create. */ + qcow2_open_entry(&qoc); + } else { + qemu_coroutine_enter(qemu_coroutine_create(qcow2_open_entry, &qoc)= ); + BDRV_POLL_WHILE(bs, qoc.ret =3D=3D -EINPROGRESS); + } + return qoc.ret; } =20 static void qcow2_refresh_limits(BlockDriverState *bs, Error **errp) --=20 1.8.3.1 From nobody Sat Oct 25 23:38:22 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1516188877043906.9526399739192; Wed, 17 Jan 2018 03:34:37 -0800 (PST) Received: from localhost ([::1]:57082 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eblzC-0007XI-VD for importer@patchew.org; Wed, 17 Jan 2018 06:34:31 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48556) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eblqZ-0000YO-1s for qemu-devel@nongnu.org; Wed, 17 Jan 2018 06:25:36 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eblqU-0003xL-J9 for qemu-devel@nongnu.org; Wed, 17 Jan 2018 06:25:35 -0500 Received: from mail-wr0-x244.google.com ([2a00:1450:400c:c0c::244]:35620) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eblqU-0003wI-D5; Wed, 17 Jan 2018 06:25:30 -0500 Received: by mail-wr0-x244.google.com with SMTP id g38so15259191wrd.2; Wed, 17 Jan 2018 03:25:30 -0800 (PST) Received: from 640k.lan (dynamic-adsl-78-12-229-84.clienti.tiscali.it. [78.12.229.84]) by smtp.gmail.com with ESMTPSA id w11sm2548965wrg.42.2018.01.17.03.25.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Jan 2018 03:25:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=BtBXwPrhMMoAWew9YUOVdDsCYAiCHXMMtmqX5jdWZnc=; b=hpTkP+T5/M/dmA4zwYyBnzC5NMCj89kN1mw8q+JC5jlGR5J8cDDVdDZjqushICJkvn n1lssSLg8ccbxNVvQpGd/kBdaN+D67cbq/6lSWh3ChV0G0QTpr2T3idBjigMbhNoaMSI uLoTJ2HcpXmfCs94uzMb2XkCIsSRqOpiOGeVvM4s5Chht3Z2AZCMEFdODZWyLl0vIxmO yHzqzJfOBRUOw1AGXsvCj+WdZbVpVkOQ1NTdeVpfF+9OUufq5nJ6PKsHmadjYsdO7DjW AWIqFoME0yqFS1+O5xIKC+8OOja+GBHdliUeGCW837qv20NsFm2EQAwU5VPZyvZCvXE0 iZRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=BtBXwPrhMMoAWew9YUOVdDsCYAiCHXMMtmqX5jdWZnc=; b=jV3eQW0xdtnXQ12ybcdtOOhUaLPgwZBhz+Ha7qYPrUfBTnvh7MnzKyejNBHm6O7VOg sPQbQ3HRhaoQnybgahHNoGdrjqF7hTftxfWskeC3NFZuVUtjGZ44yUk2O2cm8uoSTxaF DhRjsbHiDNoWA3EJl/qq4XosdUFsT4OSKZaXdIgbcLKguC7eCfgMrhgYfUSpoxv6eZvO m4WBOmkm7IAeTQeU5780X77X8SROKZB/tqkjZ+uz10RPb4WqNLRFHkeMyA0+MiNViGkG u8K9AJgzLKe/YpqXvMnt963HliB88x5wDxpD7MsdB99xDsBsgKIhjwurxUyGe53G7ysp uixQ== X-Gm-Message-State: AKwxytcu2WI3IFFFxrl4W1uU2d2lt94U4iCBdEgQFBnmVMLSooKe1tra 7t24E7YyEtwXZCM79nUlRcJ9+Vr4 X-Google-Smtp-Source: ACJfBosDKYS+EM/ZEEu/fZP3MP9X1xxNiSF6SDOYUc3SSoQlcKeYJnbm7P9xkp8MOcpH1crLO3kMdw== X-Received: by 10.223.152.172 with SMTP id w41mr2399036wrb.12.1516188329103; Wed, 17 Jan 2018 03:25:29 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Wed, 17 Jan 2018 12:25:09 +0100 Message-Id: <1516188312-29612-5-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1516188312-29612-1-git-send-email-pbonzini@redhat.com> References: <1516188312-29612-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::244 Subject: [Qemu-devel] [PATCH 4/7] qed: make bdrv_qed_do_open a coroutine_fn X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" It is called from qcow2_invalidate_cache in coroutine context (incoming migration runs in a coroutine), so it's cleaner if metadata is always loaded from a coroutine. Signed-off-by: Paolo Bonzini --- block/qed.c | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/block/qed.c b/block/qed.c index e0e08ce..3e1f4bc 100644 --- a/block/qed.c +++ b/block/qed.c @@ -381,8 +381,9 @@ static void bdrv_qed_init_state(BlockDriverState *bs) qemu_co_queue_init(&s->allocating_write_reqs); } =20 -static int bdrv_qed_do_open(BlockDriverState *bs, QDict *options, int flag= s, - Error **errp) +/* Called with table_lock held. */ +static int coroutine_fn bdrv_qed_do_open(BlockDriverState *bs, QDict *opti= ons, + int flags, Error **errp) { BDRVQEDState *s =3D bs->opaque; QEDHeader le_header; @@ -513,9 +514,35 @@ out: return ret; } =20 +typedef struct QEDOpenCo { + BlockDriverState *bs; + QDict *options; + int flags; + Error **errp; + int ret; +} QEDOpenCo; + +static void coroutine_fn bdrv_qed_open_entry(void *opaque) +{ + QEDOpenCo *qoc =3D opaque; + BDRVQEDState *s =3D qoc->bs->opaque; + + qemu_co_mutex_lock(&s->table_lock); + qoc->ret =3D bdrv_qed_do_open(qoc->bs, qoc->options, qoc->flags, qoc->= errp); + qemu_co_mutex_unlock(&s->table_lock); +} + static int bdrv_qed_open(BlockDriverState *bs, QDict *options, int flags, Error **errp) { + QEDOpenCo qoc =3D { + .bs =3D bs, + .options =3D options, + .flags =3D flags, + .errp =3D errp, + .ret =3D -EINPROGRESS + }; + bs->file =3D bdrv_open_child(NULL, options, "file", bs, &child_file, false, errp); if (!bs->file) { @@ -523,7 +550,14 @@ static int bdrv_qed_open(BlockDriverState *bs, QDict *= options, int flags, } =20 bdrv_qed_init_state(bs); - return bdrv_qed_do_open(bs, options, flags, errp); + if (qemu_in_coroutine()) { + bdrv_qed_open_entry(&qoc); + } else { + qemu_coroutine_enter(qemu_coroutine_create(bdrv_qed_open_entry, &q= oc)); + BDRV_POLL_WHILE(bs, qoc.ret =3D=3D -EINPROGRESS); + } + BDRV_POLL_WHILE(bs, qoc.ret =3D=3D -EINPROGRESS); + return qoc.ret; } =20 static void bdrv_qed_refresh_limits(BlockDriverState *bs, Error **errp) --=20 1.8.3.1 From nobody Sat Oct 25 23:38:22 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1516188626615944.8983126164966; Wed, 17 Jan 2018 03:30:26 -0800 (PST) Received: from localhost ([::1]:56727 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eblvF-0004J6-3P for importer@patchew.org; Wed, 17 Jan 2018 06:30:25 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48564) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eblqZ-0000Yx-FD for qemu-devel@nongnu.org; Wed, 17 Jan 2018 06:25:37 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eblqY-00040f-1A for qemu-devel@nongnu.org; Wed, 17 Jan 2018 06:25:35 -0500 Received: from mail-wr0-x241.google.com ([2a00:1450:400c:c0c::241]:33635) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eblqX-0003zj-OZ; Wed, 17 Jan 2018 06:25:33 -0500 Received: by mail-wr0-x241.google.com with SMTP id p6so18491235wrd.0; Wed, 17 Jan 2018 03:25:33 -0800 (PST) Received: from 640k.lan (dynamic-adsl-78-12-229-84.clienti.tiscali.it. [78.12.229.84]) by smtp.gmail.com with ESMTPSA id w11sm2548965wrg.42.2018.01.17.03.25.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Jan 2018 03:25:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=rHZ3pOVowV0e4wA8HR7PmHb/nLDCrTpr05YR41QJ9Nc=; b=KFAcOlt9jyvQsTpdIKUBqZBnTYpdQU1dHf0tbMSY0ScMjBV9ixrE3lw0QOUzKMs1NN mzjynujU2FLibv5H4q+E5sxS9gGzGCo6Jjx9zZ2vHui1DgRGCI1ek6Va7cKJdGAJ6eCo P5TxzLKzzJyohPCsO7kkLLidC3Cfk4LZSE33NDrrm9WcKHJCA0nIiobzGi/clW9P3Ods OR4+K0Gl2YLoNFfj3z6ODV295KZxHwurEbN6SOzcTYVoe+dxb3HSkOdMLM2s7ZJP7gPv N4md2542ytObeucDuc/+mqWR+kevNMi9e+t5aHSwzT6pisQyXw8JBGgwi+Vtv6kZMQaX araw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=rHZ3pOVowV0e4wA8HR7PmHb/nLDCrTpr05YR41QJ9Nc=; b=oRDXlRkVKT1fTDh6jwVVxnsRKKYOtQTRm+Uy/89AkAoVkvvSiv93YWn03JuqevnJoT Yl/0RX58bHZqDp5gZgtfVmiRIAiB0KtP38z0oo/4riAYT/If1+I0Pkt2KWBwL1W32Gx8 ai4YOVNSwHUebZLEPhCkrT800yodli1qoJhhIBRFWU9HbTjZHlfI9PacpH3kKBGV6LMq CWO2R00rAgoNf9N5hkSlNLxogeCiwyJLfNZyZdrpIek+H8y50jr08ooP5LQ5D2aM8vV9 ewIDdzGs82adC8DzuJ6rozYr8c0R2o6l37h/fqo+utlBxp+e32LUKGkdfm047Zjwn1x/ 9Igg== X-Gm-Message-State: AKwxytfiMglKXtH/ngWXsOY7+3Eqqxg/G0/RP+fd84EORSRkPz1AEJJ0 StZirBSQQEmlR77T+B5SolXxLMCA X-Google-Smtp-Source: ACJfBosOSq5JC2kdMWIJQyUBdyMFURtt2/TovdBiWES9WK4agclqB1ZCx5S1oZ2oLMCIUg5Sv3HL9g== X-Received: by 10.223.196.211 with SMTP id o19mr2137878wrf.201.1516188332436; Wed, 17 Jan 2018 03:25:32 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Wed, 17 Jan 2018 12:25:10 +0100 Message-Id: <1516188312-29612-6-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1516188312-29612-1-git-send-email-pbonzini@redhat.com> References: <1516188312-29612-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::241 Subject: [Qemu-devel] [PATCH 5/7] block: convert bdrv_invalidate_cache callback to coroutine_fn X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" QED's bdrv_invalidate_cache implementation would like to reuse functions that acquire/release the metadata locks. Call it from coroutine context to simplify the logic. Signed-off-by: Paolo Bonzini --- block.c | 41 +++++++++++++++++++++++++++++++++++++---- block/iscsi.c | 6 +++--- block/nfs.c | 6 +++--- block/qcow2.c | 7 +++++-- block/qed.c | 13 +++++-------- block/rbd.c | 6 +++--- include/block/block_int.h | 3 ++- 7 files changed, 58 insertions(+), 24 deletions(-) diff --git a/block.c b/block.c index cf33135..6ba7471 100644 --- a/block.c +++ b/block.c @@ -4214,7 +4214,8 @@ void bdrv_init_with_whitelist(void) bdrv_init(); } =20 -void bdrv_invalidate_cache(BlockDriverState *bs, Error **errp) +static void coroutine_fn bdrv_co_invalidate_cache(BlockDriverState *bs, + Error **errp) { BdrvChild *child, *parent; uint64_t perm, shared_perm; @@ -4230,7 +4231,7 @@ void bdrv_invalidate_cache(BlockDriverState *bs, Erro= r **errp) } =20 QLIST_FOREACH(child, &bs->children, next) { - bdrv_invalidate_cache(child->bs, &local_err); + bdrv_co_invalidate_cache(child->bs, &local_err); if (local_err) { error_propagate(errp, local_err); return; @@ -4260,8 +4261,8 @@ void bdrv_invalidate_cache(BlockDriverState *bs, Erro= r **errp) } bdrv_set_perm(bs, perm, shared_perm); =20 - if (bs->drv->bdrv_invalidate_cache) { - bs->drv->bdrv_invalidate_cache(bs, &local_err); + if (bs->drv->bdrv_co_invalidate_cache) { + bs->drv->bdrv_co_invalidate_cache(bs, &local_err); if (local_err) { bs->open_flags |=3D BDRV_O_INACTIVE; error_propagate(errp, local_err); @@ -4287,6 +4288,38 @@ void bdrv_invalidate_cache(BlockDriverState *bs, Err= or **errp) } } =20 +typedef struct InvalidateCacheCo { + BlockDriverState *bs; + Error **errp; + bool done; +} InvalidateCacheCo; + +static void coroutine_fn bdrv_invalidate_cache_co_entry(void *opaque) +{ + InvalidateCacheCo *ico =3D opaque; + bdrv_co_invalidate_cache(ico->bs, ico->errp); + ico->done =3D true; +} + +void bdrv_invalidate_cache(BlockDriverState *bs, Error **errp) +{ + Coroutine *co; + InvalidateCacheCo ico =3D { + .bs =3D bs, + .done =3D false, + .errp =3D errp + }; + + if (qemu_in_coroutine()) { + /* Fast-path if already in coroutine context */ + bdrv_invalidate_cache_co_entry(&ico); + } else { + co =3D qemu_coroutine_create(bdrv_invalidate_cache_co_entry, &ico); + qemu_coroutine_enter(co); + BDRV_POLL_WHILE(bs, !ico.done); + } +} + void bdrv_invalidate_cache_all(Error **errp) { BlockDriverState *bs; diff --git a/block/iscsi.c b/block/iscsi.c index 5f358f9..9b70899 100644 --- a/block/iscsi.c +++ b/block/iscsi.c @@ -2164,8 +2164,8 @@ static int iscsi_get_info(BlockDriverState *bs, Block= DriverInfo *bdi) return 0; } =20 -static void iscsi_invalidate_cache(BlockDriverState *bs, - Error **errp) +static void coroutine_fn iscsi_co_invalidate_cache(BlockDriverState *bs, + Error **errp) { IscsiLun *iscsilun =3D bs->opaque; iscsi_allocmap_invalidate(iscsilun); @@ -2196,7 +2196,7 @@ static BlockDriver bdrv_iscsi =3D { .create_opts =3D &iscsi_create_opts, .bdrv_reopen_prepare =3D iscsi_reopen_prepare, .bdrv_reopen_commit =3D iscsi_reopen_commit, - .bdrv_invalidate_cache =3D iscsi_invalidate_cache, + .bdrv_co_invalidate_cache =3D iscsi_co_invalidate_cache, =20 .bdrv_getlength =3D iscsi_getlength, .bdrv_get_info =3D iscsi_get_info, diff --git a/block/nfs.c b/block/nfs.c index 8029dc2..d7f9a6c 100644 --- a/block/nfs.c +++ b/block/nfs.c @@ -876,8 +876,8 @@ static void nfs_refresh_filename(BlockDriverState *bs, = QDict *options) } =20 #ifdef LIBNFS_FEATURE_PAGECACHE -static void nfs_invalidate_cache(BlockDriverState *bs, - Error **errp) +static void coroutine_fn nfs_co_invalidate_cache(BlockDriverState *bs, + Error **errp) { NFSClient *client =3D bs->opaque; nfs_pagecache_invalidate(client->context, client->fh); @@ -910,7 +910,7 @@ static BlockDriver bdrv_nfs =3D { .bdrv_refresh_filename =3D nfs_refresh_filename, =20 #ifdef LIBNFS_FEATURE_PAGECACHE - .bdrv_invalidate_cache =3D nfs_invalidate_cache, + .bdrv_co_invalidate_cache =3D nfs_co_invalidate_cache, #endif }; =20 diff --git a/block/qcow2.c b/block/qcow2.c index 7c11516..e886a44 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -2109,7 +2109,8 @@ static void qcow2_close(BlockDriverState *bs) qcow2_free_snapshots(bs); } =20 -static void qcow2_invalidate_cache(BlockDriverState *bs, Error **errp) +static void coroutine_fn qcow2_co_invalidate_cache(BlockDriverState *bs, + Error **errp) { BDRVQcow2State *s =3D bs->opaque; int flags =3D s->flags; @@ -2132,7 +2133,9 @@ static void qcow2_invalidate_cache(BlockDriverState *= bs, Error **errp) options =3D qdict_clone_shallow(bs->options); =20 flags &=3D ~BDRV_O_INACTIVE; + qemu_co_mutex_lock(&s->lock); ret =3D qcow2_do_open(bs, options, flags, &local_err); + qemu_co_mutex_unlock(&s->lock); QDECREF(options); if (local_err) { error_propagate(errp, local_err); @@ -4386,7 +4389,7 @@ BlockDriver bdrv_qcow2 =3D { .bdrv_change_backing_file =3D qcow2_change_backing_file, =20 .bdrv_refresh_limits =3D qcow2_refresh_limits, - .bdrv_invalidate_cache =3D qcow2_invalidate_cache, + .bdrv_co_invalidate_cache =3D qcow2_co_invalidate_cache, .bdrv_inactivate =3D qcow2_inactivate, =20 .create_opts =3D &qcow2_create_opts, diff --git a/block/qed.c b/block/qed.c index 3e1f4bc..5cf519c 100644 --- a/block/qed.c +++ b/block/qed.c @@ -1550,7 +1550,8 @@ static int bdrv_qed_change_backing_file(BlockDriverSt= ate *bs, return ret; } =20 -static void bdrv_qed_invalidate_cache(BlockDriverState *bs, Error **errp) +static void coroutine_fn bdrv_qed_co_invalidate_cache(BlockDriverState *bs, + Error **errp) { BDRVQEDState *s =3D bs->opaque; Error *local_err =3D NULL; @@ -1559,13 +1560,9 @@ static void bdrv_qed_invalidate_cache(BlockDriverSta= te *bs, Error **errp) bdrv_qed_close(bs); =20 bdrv_qed_init_state(bs); - if (qemu_in_coroutine()) { - qemu_co_mutex_lock(&s->table_lock); - } + qemu_co_mutex_lock(&s->table_lock); ret =3D bdrv_qed_do_open(bs, NULL, bs->open_flags, &local_err); - if (qemu_in_coroutine()) { - qemu_co_mutex_unlock(&s->table_lock); - } + qemu_co_mutex_unlock(&s->table_lock); if (local_err) { error_propagate(errp, local_err); error_prepend(errp, "Could not reopen qed layer: "); @@ -1640,7 +1637,7 @@ static BlockDriver bdrv_qed =3D { .bdrv_get_info =3D bdrv_qed_get_info, .bdrv_refresh_limits =3D bdrv_qed_refresh_limits, .bdrv_change_backing_file =3D bdrv_qed_change_backing_file, - .bdrv_invalidate_cache =3D bdrv_qed_invalidate_cache, + .bdrv_co_invalidate_cache =3D bdrv_qed_co_invalidate_cache, .bdrv_check =3D bdrv_qed_check, .bdrv_detach_aio_context =3D bdrv_qed_detach_aio_context, .bdrv_attach_aio_context =3D bdrv_qed_attach_aio_context, diff --git a/block/rbd.c b/block/rbd.c index 67ac2ee..9632355 100644 --- a/block/rbd.c +++ b/block/rbd.c @@ -1090,8 +1090,8 @@ static BlockAIOCB *qemu_rbd_aio_pdiscard(BlockDriverS= tate *bs, #endif =20 #ifdef LIBRBD_SUPPORTS_INVALIDATE -static void qemu_rbd_invalidate_cache(BlockDriverState *bs, - Error **errp) +static void coroutine_fn qemu_rbd_co_invalidate_cache(BlockDriverState *bs, + Error **errp) { BDRVRBDState *s =3D bs->opaque; int r =3D rbd_invalidate_cache(s->image); @@ -1157,7 +1157,7 @@ static BlockDriver bdrv_rbd =3D { .bdrv_snapshot_list =3D qemu_rbd_snap_list, .bdrv_snapshot_goto =3D qemu_rbd_snap_rollback, #ifdef LIBRBD_SUPPORTS_INVALIDATE - .bdrv_invalidate_cache =3D qemu_rbd_invalidate_cache, + .bdrv_co_invalidate_cache =3D qemu_rbd_co_invalidate_cache, #endif }; =20 diff --git a/include/block/block_int.h b/include/block/block_int.h index 05f498f..3481da1 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -218,7 +218,8 @@ struct BlockDriver { /* * Invalidate any cached meta-data. */ - void (*bdrv_invalidate_cache)(BlockDriverState *bs, Error **errp); + void coroutine_fn (*bdrv_co_invalidate_cache)(BlockDriverState *bs, + Error **errp); int (*bdrv_inactivate)(BlockDriverState *bs); =20 /* --=20 1.8.3.1 From nobody Sat Oct 25 23:38:22 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1516188629192953.9338587637739; Wed, 17 Jan 2018 03:30:29 -0800 (PST) Received: from localhost ([::1]:56728 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eblvI-0004P2-9I for importer@patchew.org; Wed, 17 Jan 2018 06:30:28 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48619) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eblqb-0000b9-HC for qemu-devel@nongnu.org; Wed, 17 Jan 2018 06:25:38 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eblqa-000438-BB for qemu-devel@nongnu.org; Wed, 17 Jan 2018 06:25:37 -0500 Received: from mail-wr0-x244.google.com ([2a00:1450:400c:c0c::244]:45341) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eblqa-000426-3N; Wed, 17 Jan 2018 06:25:36 -0500 Received: by mail-wr0-x244.google.com with SMTP id 16so18453057wry.12; Wed, 17 Jan 2018 03:25:35 -0800 (PST) Received: from 640k.lan (dynamic-adsl-78-12-229-84.clienti.tiscali.it. [78.12.229.84]) by smtp.gmail.com with ESMTPSA id w11sm2548965wrg.42.2018.01.17.03.25.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Jan 2018 03:25:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=QmURZG1y+gTB/C9JXVxccmDWFWmU2/nD/YEkTymeXgk=; b=pi7nNaKo3LarhfByeqckY1kRemBRxj4o3jBaSQdBDJDbpB5IGF/HPtX2htfo/KEx2n xtgvq7dJ2WkTmc053XFMJkJbhvkq/Vmb9KwCAyBt9gT5vK3QPx/F+Fk/wYNOasXSk41J EbYWe4KgTfJDlBqIsOsy4HT17I+Y3jDlc4jthgb0J6Yv5IoUIlDa8yZvj3keqbZ37iwk OEJtdH/5f5AeLfoTydZS8OP8k2A6KMkFzm36g3UXnBUAqr8mRsstkwF/145ae3iropeq A4n976IRGvAvsS/np3oplntGgzR94ca7lF9uq8Jjtcq2LNOsursDIVmG9PU9wzEYnlfT UWlQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=QmURZG1y+gTB/C9JXVxccmDWFWmU2/nD/YEkTymeXgk=; b=led2FzmyRniex2XGihmASrEh6RBpLSqtlU1/PotvI9KD6mW8+INQjs19ayZkb4qbG0 Heyr7wb4+79M+Np6tRIHpm34VsKCf2AfY0sKI2RXe6An1o3KwtCWRfPaqNfPr34VdXss nL0e+41zGoeSM/3fZtiVmCknylUsmND9oRKZ+E8daBg5Etz1rmb3C4crl27Rno10sCua n9ib5N1d4T2ApGDDvm5T/z3lNygmYvr4AI+LnLmSjnZJLbKC7ynWPbNRESKSTyt61O97 w305KDX3qNoOnxFDTzrnmTmOymsFj87omUGTVKF/LMJOaWl4GtOuObYvcgXWR6ScEhcn EfSw== X-Gm-Message-State: AKwxytdUuzOsT6XiF+KsZxr662UFjo4yEOazDFiUGgb9YUr5dJi2EC/3 OL9XxKVGK8501Qc8mjVvbyQpcMTP X-Google-Smtp-Source: ACJfBovLp5WVihMDDg9v7laWS8WzzbfquIlFfRhaRHRG0lZe+7h8G3bn/ktVKgX3zZQqbXLfValKLQ== X-Received: by 10.223.163.205 with SMTP id m13mr2442816wrb.174.1516188334546; Wed, 17 Jan 2018 03:25:34 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Wed, 17 Jan 2018 12:25:11 +0100 Message-Id: <1516188312-29612-7-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1516188312-29612-1-git-send-email-pbonzini@redhat.com> References: <1516188312-29612-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::244 Subject: [Qemu-devel] [PATCH 6/7] qcow2: introduce qcow2_write_caches and qcow2_flush_caches X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Avoid recursively taking s->lock during bdrv_check. Signed-off-by: Paolo Bonzini --- block/qcow2-refcount.c | 28 ++++++++++++++++++++++++++++ block/qcow2.c | 20 ++++---------------- block/qcow2.h | 2 ++ 3 files changed, 34 insertions(+), 16 deletions(-) diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c index 3de1ab5..e0d9dc1 100644 --- a/block/qcow2-refcount.c +++ b/block/qcow2-refcount.c @@ -1172,7 +1172,35 @@ void qcow2_free_any_clusters(BlockDriverState *bs, u= int64_t l2_entry, } } =20 +int coroutine_fn qcow2_write_caches(BlockDriverState *bs) +{ + BDRVQcow2State *s =3D bs->opaque; + int ret; =20 + ret =3D qcow2_cache_write(bs, s->l2_table_cache); + if (ret < 0) { + return ret; + } + + if (qcow2_need_accurate_refcounts(s)) { + ret =3D qcow2_cache_write(bs, s->refcount_block_cache); + if (ret < 0) { + return ret; + } + } + + return 0; +} + +int coroutine_fn qcow2_flush_caches(BlockDriverState *bs) +{ + int ret =3D qcow2_write_caches(bs); + if (ret < 0) { + return ret; + } + + return bdrv_flush(bs->file->bs); +} =20 /*********************************************************/ /* snapshots and image creation */ diff --git a/block/qcow2.c b/block/qcow2.c index e886a44..4a10b55 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -492,7 +492,7 @@ static int qcow2_mark_clean(BlockDriverState *bs) =20 s->incompatible_features &=3D ~QCOW2_INCOMPAT_DIRTY; =20 - ret =3D bdrv_flush(bs); + ret =3D qcow2_flush_caches(bs); if (ret < 0) { return ret; } @@ -522,7 +522,7 @@ int qcow2_mark_consistent(BlockDriverState *bs) BDRVQcow2State *s =3D bs->opaque; =20 if (s->incompatible_features & QCOW2_INCOMPAT_CORRUPT) { - int ret =3D bdrv_flush(bs); + int ret =3D qcow2_flush_caches(bs); if (ret < 0) { return ret; } @@ -3653,22 +3653,10 @@ static coroutine_fn int qcow2_co_flush_to_os(BlockD= riverState *bs) int ret; =20 qemu_co_mutex_lock(&s->lock); - ret =3D qcow2_cache_write(bs, s->l2_table_cache); - if (ret < 0) { - qemu_co_mutex_unlock(&s->lock); - return ret; - } - - if (qcow2_need_accurate_refcounts(s)) { - ret =3D qcow2_cache_write(bs, s->refcount_block_cache); - if (ret < 0) { - qemu_co_mutex_unlock(&s->lock); - return ret; - } - } + ret =3D qcow2_write_caches(bs); qemu_co_mutex_unlock(&s->lock); =20 - return 0; + return ret; } =20 static BlockMeasureInfo *qcow2_measure(QemuOpts *opts, BlockDriverState *i= n_bs, diff --git a/block/qcow2.h b/block/qcow2.h index 46c8cf4..25b50f8 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -570,6 +570,8 @@ void qcow2_free_any_clusters(BlockDriverState *bs, uint= 64_t l2_entry, int qcow2_update_snapshot_refcount(BlockDriverState *bs, int64_t l1_table_offset, int l1_size, int addend); =20 +int coroutine_fn qcow2_flush_caches(BlockDriverState *bs); +int coroutine_fn qcow2_write_caches(BlockDriverState *bs); int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res, BdrvCheckMode fix); =20 --=20 1.8.3.1 From nobody Sat Oct 25 23:38:22 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1516188664112176.42518019350973; Wed, 17 Jan 2018 03:31:04 -0800 (PST) Received: from localhost ([::1]:56737 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eblvr-0004qk-4N for importer@patchew.org; Wed, 17 Jan 2018 06:31:03 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48732) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eblqj-0000jh-Lj for qemu-devel@nongnu.org; Wed, 17 Jan 2018 06:25:47 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eblqe-00048J-NW for qemu-devel@nongnu.org; Wed, 17 Jan 2018 06:25:45 -0500 Received: from mail-wr0-x242.google.com ([2a00:1450:400c:c0c::242]:40116) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eblqe-00047Q-Dk; Wed, 17 Jan 2018 06:25:40 -0500 Received: by mail-wr0-x242.google.com with SMTP id 100so18446894wrb.7; Wed, 17 Jan 2018 03:25:40 -0800 (PST) Received: from 640k.lan (dynamic-adsl-78-12-229-84.clienti.tiscali.it. [78.12.229.84]) by smtp.gmail.com with ESMTPSA id w11sm2548965wrg.42.2018.01.17.03.25.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Jan 2018 03:25:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=GZp3mXKxAfoKlSLy5ydaSObkaFKNLtEeql1l9EJONHU=; b=PA2lTv8Mpd3HXHIArPqUcyQVHyQuic6QLjYWBi3bXe4jkzyFhIf6gCTLXwFw1z5Os5 ej4dMnGBWmxeN4ts7EKjBDLQ7jr7TafjGhuNIbwbvy2M1uqvFqnRLKQYoeCFxtSYXe0b QFiyMCuam6wLfA0uPB5yH6MEfCVgFCtzZQcI7VlgsD64y1eeartDpSwp7NTL/jcz9BO6 NMnAok+WxFw+nL+GuUAHJcQgrW8Yw1m/ng57LMRRzWiFFCMjUOsuZ95rVMX1W4GhNyCk Iu5AkF9udskiFImwMOZ4+8hMdp5KgXckkWi2WMEQGsuV84CN44EMzYhAYVC7bnfla0pl uXtg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=GZp3mXKxAfoKlSLy5ydaSObkaFKNLtEeql1l9EJONHU=; b=ZdFC8gwRSwH03VPBH/tYCzv1vonSv8g7LBNgwvPlU6ikuAuzstPZPCs+liFnKnJyhf wzkrIb20/nYzmc+8r6I5yWnwwVfRkFpz2rp4y/z2CveAcMlBdI/dMO/yw7LVgD6TlUrl t3zC7fnUdZoSENaJQQdC8Bf3R6mBk3VeIUULM8FAQttLYmGMBH05Dr0TuH9Vq0ZzZoxS zIBjEqy9nAovvVe3wWB9FmdPR0NPjJggg6bWFc9VxXHUZXL20RyP6Ns2uNJf26E1b2W7 F18SxviznZq03uCvm4OO84VWQ0ZohVHXpEI67Ijz2v3tQ8MOcMwvSLeJB8SGTKeega+k AePw== X-Gm-Message-State: AKwxytd8Pq5lp2yPqbXN8wHay7SFUp3aN78ErmY3Cx0NV9HNKY+xq269 K5yOrHLVEu1osBUAxFP0jdw72Mpl X-Google-Smtp-Source: ACJfBostzfgQ/EbeDpvNhQEW4dIlCYXpUMRIp0aQrEon+FrhqUQOJxkHMi3rvHNbI0qJ5RqE2aZ6HA== X-Received: by 10.223.160.87 with SMTP id l23mr2165260wrl.51.1516188338909; Wed, 17 Jan 2018 03:25:38 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Wed, 17 Jan 2018 12:25:12 +0100 Message-Id: <1516188312-29612-8-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1516188312-29612-1-git-send-email-pbonzini@redhat.com> References: <1516188312-29612-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c0c::242 Subject: [Qemu-devel] [PATCH 7/7] block: convert bdrv_check callback to coroutine_fn X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Suggested-by: Kevin Wolf Signed-off-by: Paolo Bonzini --- block.c | 43 ++++++++++++++++++++++++++++++++++++++++--- block/parallels.c | 17 +++++++++++------ block/qcow2.c | 23 +++++++++++++++++++---- block/qed-check.c | 1 + block/qed-table.c | 26 +++++++++----------------- block/qed.c | 13 +++++++++---- block/vdi.c | 6 +++--- block/vhdx.c | 7 ++++--- block/vmdk.c | 7 ++++--- include/block/block_int.h | 5 +++-- 10 files changed, 103 insertions(+), 45 deletions(-) diff --git a/block.c b/block.c index 6ba7471..896031b 100644 --- a/block.c +++ b/block.c @@ -3454,17 +3454,54 @@ static void bdrv_delete(BlockDriverState *bs) * free of errors) or -errno when an internal error occurred. The results = of the * check are stored in res. */ -int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res, BdrvCheckMode f= ix) +static int coroutine_fn bdrv_co_check(BlockDriverState *bs, + BdrvCheckResult *res, BdrvCheckMode = fix) { if (bs->drv =3D=3D NULL) { return -ENOMEDIUM; } - if (bs->drv->bdrv_check =3D=3D NULL) { + if (bs->drv->bdrv_co_check =3D=3D NULL) { return -ENOTSUP; } =20 memset(res, 0, sizeof(*res)); - return bs->drv->bdrv_check(bs, res, fix); + return bs->drv->bdrv_co_check(bs, res, fix); +} + +typedef struct CheckCo { + BlockDriverState *bs; + BdrvCheckResult *res; + BdrvCheckMode fix; + int ret; +} CheckCo; + +static void bdrv_check_co_entry(void *opaque) +{ + CheckCo *cco =3D opaque; + cco->ret =3D bdrv_co_check(cco->bs, cco->res, cco->fix); +} + +int bdrv_check(BlockDriverState *bs, + BdrvCheckResult *res, BdrvCheckMode fix) +{ + Coroutine *co; + CheckCo cco =3D { + .bs =3D bs, + .res =3D res, + .ret =3D -EINPROGRESS, + .fix =3D fix, + }; + + if (qemu_in_coroutine()) { + /* Fast-path if already in coroutine context */ + bdrv_check_co_entry(&cco); + } else { + co =3D qemu_coroutine_create(bdrv_check_co_entry, &cco); + qemu_coroutine_enter(co); + BDRV_POLL_WHILE(bs, cco.ret =3D=3D -EINPROGRESS); + } + + return cco.ret; } =20 /* diff --git a/block/parallels.c b/block/parallels.c index 5f1497d..803b063 100644 --- a/block/parallels.c +++ b/block/parallels.c @@ -382,8 +382,9 @@ static coroutine_fn int parallels_co_readv(BlockDriverS= tate *bs, } =20 =20 -static int parallels_check(BlockDriverState *bs, BdrvCheckResult *res, - BdrvCheckMode fix) +static int coroutine_fn parallels_co_check(BlockDriverState *bs, + BdrvCheckResult *res, + BdrvCheckMode fix) { BDRVParallelsState *s =3D bs->opaque; int64_t size, prev_off, high_off; @@ -398,6 +399,7 @@ static int parallels_check(BlockDriverState *bs, BdrvCh= eckResult *res, return size; } =20 + qemu_co_mutex_lock(&s->lock); if (s->header_unclean) { fprintf(stderr, "%s image was not closed correctly\n", fix & BDRV_FIX_ERRORS ? "Repairing" : "ERROR"); @@ -446,11 +448,12 @@ static int parallels_check(BlockDriverState *bs, Bdrv= CheckResult *res, prev_off =3D off; } =20 + ret =3D 0; if (flush_bat) { ret =3D bdrv_pwrite_sync(bs->file, 0, s->header, s->header_size); if (ret < 0) { res->check_errors++; - return ret; + goto out; } } =20 @@ -469,13 +472,15 @@ static int parallels_check(BlockDriverState *bs, Bdrv= CheckResult *res, if (ret < 0) { error_report_err(local_err); res->check_errors++; - return ret; + goto out; } res->leaks_fixed +=3D count; } } =20 - return 0; +out: + qemu_co_mutex_unlock(&s->lock); + return ret; } =20 =20 @@ -802,7 +807,7 @@ static BlockDriver bdrv_parallels =3D { .bdrv_co_writev =3D parallels_co_writev, =20 .bdrv_co_create =3D parallels_co_create, - .bdrv_check =3D parallels_check, + .bdrv_co_check =3D parallels_co_check, .create_opts =3D ¶llels_create_opts, }; =20 diff --git a/block/qcow2.c b/block/qcow2.c index 4a10b55..8f9e37b 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -533,8 +533,9 @@ int qcow2_mark_consistent(BlockDriverState *bs) return 0; } =20 -static int qcow2_check(BlockDriverState *bs, BdrvCheckResult *result, - BdrvCheckMode fix) +static int coroutine_fn qcow2_co_check_locked(BlockDriverState *bs, + BdrvCheckResult *result, + BdrvCheckMode fix) { int ret =3D qcow2_check_refcounts(bs, result, fix); if (ret < 0) { @@ -551,6 +552,19 @@ static int qcow2_check(BlockDriverState *bs, BdrvCheck= Result *result, return ret; } =20 +static int coroutine_fn qcow2_co_check(BlockDriverState *bs, + BdrvCheckResult *result, + BdrvCheckMode fix) +{ + BDRVQcow2State *s =3D bs->opaque; + int ret; + + qemu_co_mutex_lock(&s->lock); + ret =3D qcow2_co_check_locked(bs, result, fix); + qemu_co_mutex_unlock(&s->lock); + return ret; +} + static int validate_table_offset(BlockDriverState *bs, uint64_t offset, uint64_t entries, size_t entry_len) { @@ -1475,7 +1489,8 @@ static int coroutine_fn qcow2_do_open(BlockDriverStat= e *bs, QDict *options, (s->incompatible_features & QCOW2_INCOMPAT_DIRTY)) { BdrvCheckResult result =3D {0}; =20 - ret =3D qcow2_check(bs, &result, BDRV_FIX_ERRORS | BDRV_FIX_LEAKS); + ret =3D qcow2_co_check_locked(bs, &result, + BDRV_FIX_ERRORS | BDRV_FIX_LEAKS); if (ret < 0 || result.check_errors) { if (ret >=3D 0) { ret =3D -EIO; @@ -4381,7 +4396,7 @@ BlockDriver bdrv_qcow2 =3D { .bdrv_inactivate =3D qcow2_inactivate, =20 .create_opts =3D &qcow2_create_opts, - .bdrv_check =3D qcow2_check, + .bdrv_co_check =3D qcow2_co_check, .bdrv_amend_options =3D qcow2_amend_options, =20 .bdrv_detach_aio_context =3D qcow2_detach_aio_context, diff --git a/block/qed-check.c b/block/qed-check.c index dcd4f03..0edac03 100644 --- a/block/qed-check.c +++ b/block/qed-check.c @@ -217,6 +217,7 @@ static void qed_check_mark_clean(BDRVQEDState *s, BdrvC= heckResult *result) qed_write_header_sync(s); } =20 +/* Called with table_lock held. */ int qed_check(BDRVQEDState *s, BdrvCheckResult *result, bool fix) { QEDCheck check =3D { diff --git a/block/qed-table.c b/block/qed-table.c index eead8b0..7df5680 100644 --- a/block/qed-table.c +++ b/block/qed-table.c @@ -18,7 +18,7 @@ #include "qed.h" #include "qemu/bswap.h" =20 -/* Called either from qed_check or with table_lock held. */ +/* Called with table_lock held. */ static int qed_read_table(BDRVQEDState *s, uint64_t offset, QEDTable *tabl= e) { QEMUIOVector qiov; @@ -33,13 +33,9 @@ static int qed_read_table(BDRVQEDState *s, uint64_t offs= et, QEDTable *table) =20 trace_qed_read_table(s, offset, table); =20 - if (qemu_in_coroutine()) { - qemu_co_mutex_unlock(&s->table_lock); - } + qemu_co_mutex_unlock(&s->table_lock); ret =3D bdrv_preadv(s->bs->file, offset, &qiov); - if (qemu_in_coroutine()) { - qemu_co_mutex_lock(&s->table_lock); - } + qemu_co_mutex_lock(&s->table_lock); if (ret < 0) { goto out; } @@ -67,7 +63,7 @@ out: * @n: Number of elements * @flush: Whether or not to sync to disk * - * Called either from qed_check or with table_lock held. + * Called with table_lock held. */ static int qed_write_table(BDRVQEDState *s, uint64_t offset, QEDTable *tab= le, unsigned int index, unsigned int n, bool flush) @@ -104,13 +100,9 @@ static int qed_write_table(BDRVQEDState *s, uint64_t o= ffset, QEDTable *table, /* Adjust for offset into table */ offset +=3D start * sizeof(uint64_t); =20 - if (qemu_in_coroutine()) { - qemu_co_mutex_unlock(&s->table_lock); - } + qemu_co_mutex_unlock(&s->table_lock); ret =3D bdrv_pwritev(s->bs->file, offset, &qiov); - if (qemu_in_coroutine()) { - qemu_co_mutex_lock(&s->table_lock); - } + qemu_co_mutex_lock(&s->table_lock); trace_qed_write_table_cb(s, table, flush, ret); if (ret < 0) { goto out; @@ -134,7 +126,7 @@ int qed_read_l1_table_sync(BDRVQEDState *s) return qed_read_table(s, s->header.l1_table_offset, s->l1_table); } =20 -/* Called either from qed_check or with table_lock held. */ +/* Called with table_lock held. */ int qed_write_l1_table(BDRVQEDState *s, unsigned int index, unsigned int n) { BLKDBG_EVENT(s->bs->file, BLKDBG_L1_UPDATE); @@ -148,7 +140,7 @@ int qed_write_l1_table_sync(BDRVQEDState *s, unsigned i= nt index, return qed_write_l1_table(s, index, n); } =20 -/* Called either from qed_check or with table_lock held. */ +/* Called with table_lock held. */ int qed_read_l2_table(BDRVQEDState *s, QEDRequest *request, uint64_t offse= t) { int ret; @@ -191,7 +183,7 @@ int qed_read_l2_table_sync(BDRVQEDState *s, QEDRequest = *request, uint64_t offset return qed_read_l2_table(s, request, offset); } =20 -/* Called either from qed_check or with table_lock held. */ +/* Called with table_lock held. */ int qed_write_l2_table(BDRVQEDState *s, QEDRequest *request, unsigned int index, unsigned int n, bool flush) { diff --git a/block/qed.c b/block/qed.c index 5cf519c..77c9b10 100644 --- a/block/qed.c +++ b/block/qed.c @@ -1573,12 +1573,17 @@ static void coroutine_fn bdrv_qed_co_invalidate_cac= he(BlockDriverState *bs, } } =20 -static int bdrv_qed_check(BlockDriverState *bs, BdrvCheckResult *result, - BdrvCheckMode fix) +static int bdrv_qed_co_check(BlockDriverState *bs, BdrvCheckResult *result, + BdrvCheckMode fix) { BDRVQEDState *s =3D bs->opaque; + int ret; =20 - return qed_check(s, result, !!fix); + qemu_co_mutex_lock(&s->table_lock); + ret =3D qed_check(s, result, !!fix); + qemu_co_mutex_unlock(&s->table_lock); + + return ret; } =20 static QemuOptsList qed_create_opts =3D { @@ -1638,7 +1643,7 @@ static BlockDriver bdrv_qed =3D { .bdrv_refresh_limits =3D bdrv_qed_refresh_limits, .bdrv_change_backing_file =3D bdrv_qed_change_backing_file, .bdrv_co_invalidate_cache =3D bdrv_qed_co_invalidate_cache, - .bdrv_check =3D bdrv_qed_check, + .bdrv_co_check =3D bdrv_qed_co_check, .bdrv_detach_aio_context =3D bdrv_qed_detach_aio_context, .bdrv_attach_aio_context =3D bdrv_qed_attach_aio_context, .bdrv_co_drain_begin =3D bdrv_qed_co_drain_begin, diff --git a/block/vdi.c b/block/vdi.c index 01501d7..bb505ee 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -258,8 +258,8 @@ static void vdi_header_print(VdiHeader *header) } #endif =20 -static int vdi_check(BlockDriverState *bs, BdrvCheckResult *res, - BdrvCheckMode fix) +static int coroutine_fn vdi_co_check(BlockDriverState *bs, BdrvCheckResult= *res, + BdrvCheckMode fix) { /* TODO: additional checks possible. */ BDRVVdiState *s =3D (BDRVVdiState *)bs->opaque; @@ -908,7 +908,7 @@ static BlockDriver bdrv_vdi =3D { .bdrv_get_info =3D vdi_get_info, =20 .create_opts =3D &vdi_create_opts, - .bdrv_check =3D vdi_check, + .bdrv_co_check =3D vdi_co_check, }; =20 static void bdrv_vdi_init(void) diff --git a/block/vhdx.c b/block/vhdx.c index 7fad8b2..14b33ed 100644 --- a/block/vhdx.c +++ b/block/vhdx.c @@ -1944,8 +1944,9 @@ exit: * r/w and any log has already been replayed, so there is nothing (current= ly) * for us to do here */ -static int vhdx_check(BlockDriverState *bs, BdrvCheckResult *result, - BdrvCheckMode fix) +static int coroutine_fn vhdx_co_check(BlockDriverState *bs, + BdrvCheckResult *result, + BdrvCheckMode fix) { BDRVVHDXState *s =3D bs->opaque; =20 @@ -2006,7 +2007,7 @@ static BlockDriver bdrv_vhdx =3D { .bdrv_co_writev =3D vhdx_co_writev, .bdrv_co_create =3D vhdx_co_create, .bdrv_get_info =3D vhdx_get_info, - .bdrv_check =3D vhdx_check, + .bdrv_co_check =3D vhdx_co_check, .bdrv_has_zero_init =3D bdrv_has_zero_init_1, =20 .create_opts =3D &vhdx_create_opts, diff --git a/block/vmdk.c b/block/vmdk.c index d4beb25..3614728 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -2214,8 +2214,9 @@ static ImageInfo *vmdk_get_extent_info(VmdkExtent *ex= tent) return info; } =20 -static int vmdk_check(BlockDriverState *bs, BdrvCheckResult *result, - BdrvCheckMode fix) +static int coroutine_fn vmdk_co_check(BlockDriverState *bs, + BdrvCheckResult *result, + BdrvCheckMode fix) { BDRVVmdkState *s =3D bs->opaque; VmdkExtent *extent =3D NULL; @@ -2384,7 +2385,7 @@ static BlockDriver bdrv_vmdk =3D { .instance_size =3D sizeof(BDRVVmdkState), .bdrv_probe =3D vmdk_probe, .bdrv_open =3D vmdk_open, - .bdrv_check =3D vmdk_check, + .bdrv_co_check =3D vmdk_co_check, .bdrv_reopen_prepare =3D vmdk_reopen_prepare, .bdrv_child_perm =3D bdrv_format_default_perms, .bdrv_co_preadv =3D vmdk_co_preadv, diff --git a/include/block/block_int.h b/include/block/block_int.h index 3481da1..3e4c93c 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -301,8 +301,9 @@ struct BlockDriver { * Returns 0 for completed check, -errno for internal errors. * The check results are stored in result. */ - int (*bdrv_check)(BlockDriverState *bs, BdrvCheckResult *result, - BdrvCheckMode fix); + int coroutine_fn (*bdrv_co_check)(BlockDriverState *bs, + BdrvCheckResult *result, + BdrvCheckMode fix); =20 int (*bdrv_amend_options)(BlockDriverState *bs, QemuOpts *opts, BlockDriverAmendStatusCB *status_cb, --=20 1.8.3.1