From nobody Fri Oct 24 09:58:53 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; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1519922665574613.378879284727; Thu, 1 Mar 2018 08:44:25 -0800 (PST) Received: from localhost ([::1]:58032 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erRJg-0004Ip-CR for importer@patchew.org; Thu, 01 Mar 2018 11:44:24 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45608) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erRC6-0006Wa-2c for qemu-devel@nongnu.org; Thu, 01 Mar 2018 11:36:42 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1erRC3-0002fK-26 for qemu-devel@nongnu.org; Thu, 01 Mar 2018 11:36:34 -0500 Received: from mail-wr0-x241.google.com ([2a00:1450:400c:c0c::241]:39637) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1erRC2-0002dm-MK; Thu, 01 Mar 2018 11:36:31 -0500 Received: by mail-wr0-x241.google.com with SMTP id w77so7233581wrc.6; Thu, 01 Mar 2018 08:36:30 -0800 (PST) Received: from donizetti.lan (94-36-191-219.adsl-ull.clienti.tiscali.it. [94.36.191.219]) by smtp.gmail.com with ESMTPSA id a14sm4187152wrf.22.2018.03.01.08.36.25 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 01 Mar 2018 08:36: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=/jsWhHf81eeDJmKk910PLBxbADT88QAODkrMuluLqrQ=; b=FU1ntoTvvR/y33k9VPwueDcEmXdi3VrF5m2MvBzdH7qTUB2ZcPU+Vq+oKHX8boKINN DSm7pVEpAgLMCobS8ZCzl+FEwvQPUI4SPUNRrEYQa704+2fCQ1KAGkMZ6rbBYX0/QZ6a q/RmUDNjueQbW9Cs1TtxfazZqDpYKsOSGTJ88zf04nG8gNS9kizIJsqVNW9wgxXqBHcX tdXXp4fdu01NlKalC52LtGO0kmEG7tkQFV/xxFH5jG7N50teQ2ukBcCGV6mb5dO/hrn/ Wr1una6vxKb8Q4yyYJUCDm3EwvLPKzexyGbFHYcU6bW88SBuc47tYb9LBIlMnfVZsW+1 DiOA== 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=/jsWhHf81eeDJmKk910PLBxbADT88QAODkrMuluLqrQ=; b=iawkrYhCZdhxs2bO+O38lVJbF3yigppYhdjXRk7/8HNwNHNbzfZ+t2DgHM/myKqs1e uGNg/i10Lvcfyfhv25rKrAxrQ6BGNOxv4Rtipko+WDYByeA7mxMrKF7US4U8qmQvGEP8 +Qq/+K8aWlw2UKKoB2QHPLZRLNEzWBiyzFIlnNL9zWK+Qbrg3fLImMt/YDSH2KQ53OwM Hf0iLiWiSy4Akgny+TvMVPPZbewtk8Wi/AwVdJgdOHrhXmR9ImJ0o++4uxNsU++DWiCS D4GMANjbSppk8jXaQ2PjJIlaaNC9ZTxp+d3RsLNBHGwHvjUb/tR3Qrt3PWDw5duHl8p4 mhOQ== X-Gm-Message-State: APf1xPDQWjJF4c1FSinuSN3XAiG3BwwXjqaqofLRBhre/M36ehXQYEYG 7SILB5rn+3muli3zAnsKP5RSW1mG X-Google-Smtp-Source: AG47ELsK3ycE8V0LdiOD3HvbIeMqaocerpIcwe7rLbeaN8tO1I9kB1tUr8dOghhSj0AMrJctfQHW0Q== X-Received: by 10.223.179.211 with SMTP id x19mr2319178wrd.175.1519922189004; Thu, 01 Mar 2018 08:36:29 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 1 Mar 2018 17:36:12 +0100 Message-Id: <20180301163619.21072-2-pbonzini@redhat.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180301163619.21072-1-pbonzini@redhat.com> References: <20180301163619.21072-1-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 1/8] block: rename .bdrv_create() to .bdrv_co_create_opts() 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 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_opts() 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. bdrv_co_create is reserved for the QAPI-based version that Kevin is working on. Signed-off-by: Stefan Hajnoczi Message-Id: <20170705102231.20711-2-stefanha@redhat.com> Signed-off-by: Paolo Bonzini Message-Id: <1516279431-30424-2-git-send-email-pbonzini@redhat.com> Signed-off-by: Paolo Bonzini Reviewed-by: Eric Blake --- 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 | 7 +++++-- 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, 74 insertions(+), 54 deletions(-) diff --git a/block.c b/block.c index 814e5a02da..e713fe3d00 100644 --- a/block.c +++ b/block.c @@ -420,7 +420,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_opts(cco->filename, cco->opts, &local= _err); error_propagate(&cco->err, local_err); cco->ret =3D ret; } @@ -439,7 +439,7 @@ int bdrv_create(BlockDriver *drv, const char* filename, .err =3D NULL, }; =20 - if (!drv->bdrv_create) { + if (!drv->bdrv_co_create_opts) { 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 3df66947c5..2ea116e6db 100644 --- a/block/crypto.c +++ b/block/crypto.c @@ -556,9 +556,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_opts_luks(const char *filen= ame, + QemuOpts *opts, + Error **errp) { return block_crypto_create_generic(Q_CRYPTO_BLOCK_FORMAT_LUKS, filename, opts, errp); @@ -617,7 +617,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_opts =3D block_crypto_co_create_opts_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 ca49c1a98a..c775bf9272 100644 --- a/block/file-posix.c +++ b/block/file-posix.c @@ -1982,7 +1982,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_opts(const char *filename, QemuOpts = *opts, + Error **errp) { int fd; int result =3D 0; @@ -2280,7 +2281,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_opts =3D raw_co_create_opts, .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, @@ -2684,8 +2685,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_opts(const char *filename, QemuOpts= *opts, + Error **errp) { int fd; int ret =3D 0; @@ -2758,7 +2759,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_opts =3D hdev_co_create_opts, .create_opts =3D &raw_create_opts, .bdrv_co_pwrite_zeroes =3D hdev_co_pwrite_zeroes, =20 @@ -2880,7 +2881,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_opts =3D hdev_co_create_opts, .create_opts =3D &raw_create_opts, =20 =20 @@ -3011,7 +3012,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_opts =3D hdev_co_create_opts, .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 f24c7bb92c..4a430d45f1 100644 --- a/block/file-win32.c +++ b/block/file-win32.c @@ -553,7 +553,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_opts(const char *filename, QemuOpts = *opts, + Error **errp) { int fd; int64_t total_size =3D 0; @@ -599,7 +600,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_opts =3D raw_co_create_opts, .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 d8decc41ad..133d9f1d2e 100644 --- a/block/gluster.c +++ b/block/gluster.c @@ -965,8 +965,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_opts(const char *filename, + QemuOpts *opts, Error = **errp) { BlockdevOptionsGluster *gconf; struct glfs *glfs; @@ -1427,7 +1427,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_opts =3D qemu_gluster_co_create_opts, .bdrv_getlength =3D qemu_gluster_getlength, .bdrv_get_allocated_file_size =3D qemu_gluster_allocated_file_size, .bdrv_truncate =3D qemu_gluster_truncate, @@ -1455,7 +1455,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_opts =3D qemu_gluster_co_create_opts, .bdrv_getlength =3D qemu_gluster_getlength, .bdrv_get_allocated_file_size =3D qemu_gluster_allocated_file_size, .bdrv_truncate =3D qemu_gluster_truncate, @@ -1483,7 +1483,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_opts =3D qemu_gluster_co_create_opts, .bdrv_getlength =3D qemu_gluster_getlength, .bdrv_get_allocated_file_size =3D qemu_gluster_allocated_file_size, .bdrv_truncate =3D qemu_gluster_truncate, @@ -1517,7 +1517,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_opts =3D qemu_gluster_co_create_opts, .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 421983dd6f..662f441997 100644 --- a/block/iscsi.c +++ b/block/iscsi.c @@ -2108,7 +2108,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_opts(const char *filename, QemuOpt= s *opts, + Error **errp) { int ret =3D 0; int64_t total_size =3D 0; @@ -2195,7 +2196,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_opts =3D iscsi_co_create_opts, .create_opts =3D &iscsi_create_opts, .bdrv_reopen_prepare =3D iscsi_reopen_prepare, .bdrv_reopen_commit =3D iscsi_reopen_commit, @@ -2230,7 +2231,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_opts =3D iscsi_co_create_opts, .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 6576a73d6e..ce6e195a41 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_opts(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_opts =3D nfs_file_co_create_opts, .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 e1e3d80c88..c3095bd9c0 100644 --- a/block/parallels.c +++ b/block/parallels.c @@ -467,7 +467,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_opts(const char *filename, + QemuOpts *opts, + Error **errp) { int64_t total_size, cl_size; uint8_t tmp[BDRV_SECTOR_SIZE]; @@ -788,7 +790,8 @@ static BlockDriver bdrv_parallels =3D { .bdrv_co_readv =3D parallels_co_readv, .bdrv_co_writev =3D parallels_co_writev, .supports_backing =3D true, - .bdrv_create =3D parallels_create, + + .bdrv_co_create_opts =3D parallels_co_create_opts, .bdrv_check =3D parallels_check, .create_opts =3D ¶llels_create_opts, }; diff --git a/block/qcow.c b/block/qcow.c index 8631155ac8..186316edd0 100644 --- a/block/qcow.c +++ b/block/qcow.c @@ -805,7 +805,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_opts(const char *filename, QemuOpts= *opts, + Error **errp) { int header_size, backing_filename_len, l1_size, shift, i; QCowHeader header; @@ -1122,7 +1123,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_opts =3D qcow_co_create_opts, .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 801e29fc56..d62705d9aa 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -2891,7 +2891,8 @@ out: return ret; } =20 -static int qcow2_create(const char *filename, QemuOpts *opts, Error **errp) +static int coroutine_fn qcow2_co_create_opts(const char *filename, QemuOpt= s *opts, + Error **errp) { char *backing_file =3D NULL; char *backing_fmt =3D NULL; @@ -4327,7 +4328,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_opts =3D qcow2_co_create_opts, .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 c6ff3ab015..dd31c5046e 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_opts(const char *filename, + QemuOpts *opts, + Error **errp) { uint64_t image_size =3D 0; uint32_t cluster_size =3D QED_DEFAULT_CLUSTER_SIZE; @@ -1592,7 +1594,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_opts =3D bdrv_qed_co_create_opts, .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 ab552c0954..e0debbdc8b 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_opts(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_opts =3D &raw_co_create_opts, .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 8474b0ba11..c7dd32e213 100644 --- a/block/rbd.c +++ b/block/rbd.c @@ -351,7 +351,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_opts(const char *filename, + QemuOpts *opts, + Error **errp) { Error *local_err =3D NULL; int64_t bytes =3D 0; @@ -1132,7 +1134,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_opts =3D qemu_rbd_co_create_opts, .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 af125a2c8d..4fab125578 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -1965,8 +1965,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_opts(const char *filename, QemuOpts *= opts, + Error **errp) { Error *err =3D NULL; int ret =3D 0; @@ -3087,7 +3087,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_opts =3D sd_co_create_opts, .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, @@ -3123,7 +3123,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_opts =3D sd_co_create_opts, .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, @@ -3159,7 +3159,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_opts =3D sd_co_create_opts, .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 b63addcf94..36d5d888d5 100644 --- a/block/ssh.c +++ b/block/ssh.c @@ -816,7 +816,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_opts(const char *filename, QemuOpts = *opts, + Error **errp) { int r, ret; int64_t total_size =3D 0; @@ -1204,7 +1205,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_opts =3D ssh_co_create_opts, .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 fc1c614cb1..0fa98d5ffe 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -717,7 +717,8 @@ nonallocating_write: return ret; } =20 -static int vdi_create(const char *filename, QemuOpts *opts, Error **errp) +static int coroutine_fn vdi_co_create_opts(const char *filename, QemuOpts = *opts, + Error **errp) { int ret =3D 0; uint64_t bytes =3D 0; @@ -895,7 +896,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_opts =3D vdi_co_create_opts, .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 c449c5dcfd..3fbff5048b 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_opts(const char *filename, QemuOpts= *opts, + 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_opts =3D vhdx_co_create_opts, .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 ef15ddbfd3..a3f7610082 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -1892,7 +1892,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_opts(const char *filename, QemuOpts= *opts, + Error **errp) { int idx =3D 0; BlockBackend *new_blk =3D NULL; @@ -2408,7 +2409,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_opts =3D vmdk_co_create_opts, .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 cfa5144e86..9e53c47d60 100644 --- a/block/vpc.c +++ b/block/vpc.c @@ -896,7 +896,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_opts(const char *filename, QemuOpts = *opts, + Error **errp) { uint8_t buf[1024]; VHDFooter *footer =3D (VHDFooter *) buf; @@ -1094,7 +1095,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_opts =3D vpc_co_create_opts, =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 5ea63f8fa8..f80683ded2 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -128,7 +128,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_opts)(const char *filename, QemuOpts= *opts, + Error **errp); int (*bdrv_make_empty)(BlockDriverState *bs); =20 void (*bdrv_refresh_filename)(BlockDriverState *bs, QDict *options); --=20 2.14.3 From nobody Fri Oct 24 09:58:53 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; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1519922319201709.7099991231315; Thu, 1 Mar 2018 08:38:39 -0800 (PST) Received: from localhost ([::1]:57989 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erRE6-0007nA-5h for importer@patchew.org; Thu, 01 Mar 2018 11:38:38 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45593) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erRC5-0006WC-Lg for qemu-devel@nongnu.org; Thu, 01 Mar 2018 11:36:35 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1erRC4-0002hK-ED for qemu-devel@nongnu.org; Thu, 01 Mar 2018 11:36:33 -0500 Received: from mail-wr0-x241.google.com ([2a00:1450:400c:c0c::241]:41584) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1erRC4-0002g9-6x; Thu, 01 Mar 2018 11:36:32 -0500 Received: by mail-wr0-x241.google.com with SMTP id f14so7220900wre.8; Thu, 01 Mar 2018 08:36:32 -0800 (PST) Received: from donizetti.lan (94-36-191-219.adsl-ull.clienti.tiscali.it. [94.36.191.219]) by smtp.gmail.com with ESMTPSA id a14sm4187152wrf.22.2018.03.01.08.36.29 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 01 Mar 2018 08:36:30 -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=XbPZ3fRZvxsXKcxJChiXiTp7JVinI8vYVhCzotn0YW8=; b=HvWYtmWewkPnn57esnNJpBaRgT+OFwHc2idPnOuocFtAe9gIQwS9+zNJZJpESP2Tg8 n2NheInmD0delLC+kWt4XJsDanx4Vy7zQg80KQudOA5cYkf+VaZxNBanty1OzX2RLMEf Bju0TWuleYDWQv1d86rkgclVPgN83fqeMCBmWY/90NuOysXucwBP+x1iuQDGTYv1aPPS Na4tyCD0cn3YBO0J3DpYPwN6jgrh9Y6woqVCqYUkO+qTLxD4LTVDgWAvorW+VMgrRzpO qvXwsw7WZ6AOLcwy8W6BiyaBwpqPgo8SvvWC/EyfAlrMJl8etEQ7zFvNI9VObVaZ2Qzy zw5w== 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=XbPZ3fRZvxsXKcxJChiXiTp7JVinI8vYVhCzotn0YW8=; b=eFkblXYwmZvOx1tQlIU6o7H0kzDFGsQ4bxR6U2H6LMJoOqNLzzMZyVYiwV6OWQrcVW 1LzI3TINvmvqcL0AVFgo360v9+bj9LT1fx9RyA7/AlpYZeBg/qJxOvkwxWHkQ1df7WUC fNby5NCmhC02CXI2h0lpUw5yIojPahNoeoCSy9EiaKWSLL+QR1Bnxq8e7y29jAU7AVYf R/L/vLkC+2en4IkoRXMfnGFGfWWrsQntflgpW6YMvDR4JLoRHMtLWR5idl18Yy0QirlR yhZgOw1eT2eMK+c0ecJzI3oYiRj2pET3dksJ6mRZ2+WerrSzMf3K1almYCtY7oiUWDsd QSOQ== X-Gm-Message-State: APf1xPDX4rLmEhbO41+cCQAZYOAV+SCPZ+0JvzVKPdGyChvzGO0bs2Jt cgLdcLypHRh3//my9e6n+FqMRM/u X-Google-Smtp-Source: AG47ELtj9ARagtPN0nHP2QlDBfBME5txr/rcVvU3k6fORJkBLKPV3pg5Hoiu4cRO1gCWrMYdruvtQA== X-Received: by 10.223.130.194 with SMTP id 60mr2470174wrc.209.1519922190872; Thu, 01 Mar 2018 08:36:30 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 1 Mar 2018 17:36:13 +0100 Message-Id: <20180301163619.21072-3-pbonzini@redhat.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180301163619.21072-1-pbonzini@redhat.com> References: <20180301163619.21072-1-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/8] 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 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. In fact, qcow2_create2 is always called from coroutine context. Rename the function to add the "co" moniker and add coroutine_fn. 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 Message-Id: <1516279431-30424-3-git-send-email-pbonzini@redhat.com> Signed-off-by: Paolo Bonzini Reviewed-by: Eric Blake --- block/qcow2.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/block/qcow2.c b/block/qcow2.c index d62705d9aa..24edbb431b 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -2700,11 +2700,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 @@ -2973,9 +2974,9 @@ static int coroutine_fn qcow2_co_create_opts(const ch= ar *filename, QemuOpts *opt =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 2.14.3 From nobody Fri Oct 24 09:58:53 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; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1519922493511151.2124969021329; Thu, 1 Mar 2018 08:41:33 -0800 (PST) Received: from localhost ([::1]:58009 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erRGu-0001sV-Fn for importer@patchew.org; Thu, 01 Mar 2018 11:41:32 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45669) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erRC7-0006YG-UA for qemu-devel@nongnu.org; Thu, 01 Mar 2018 11:36:37 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1erRC6-0002l0-Ju for qemu-devel@nongnu.org; Thu, 01 Mar 2018 11:36:35 -0500 Received: from mail-wr0-x244.google.com ([2a00:1450:400c:c0c::244]:34901) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1erRC6-0002jW-Ci; Thu, 01 Mar 2018 11:36:34 -0500 Received: by mail-wr0-x244.google.com with SMTP id l43so7256825wrc.2; Thu, 01 Mar 2018 08:36:34 -0800 (PST) Received: from donizetti.lan (94-36-191-219.adsl-ull.clienti.tiscali.it. [94.36.191.219]) by smtp.gmail.com with ESMTPSA id a14sm4187152wrf.22.2018.03.01.08.36.31 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 01 Mar 2018 08:36:32 -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=xf1G+oSOpKjXF12itEa1eNn8xO93J7w6XWhz+lITvLg=; b=ocCSwymb0j3gL+Nvv/mQkzKWDyvZC88T0KqqmNIlvfyqTImp74Mr2ohvcD3hEcToZ4 JRd1j4q1HwNIxYlWEKQGgwGao63uW/gyE5uYZbbJsm0PT6wR/x91Z9ATuwzC80EGyLwp rzH1Jd0IkEAM37u+3QJ83DFg+osq7gYbxTu/svCJ7KyxtVoYiJUvVFi0KnT4FVwTVnbl hpdUya4JOYZTaiAO4U7mvYnnDr7k1Tszx033+exGIm0G6xvLrmZ1uIzpp/8PVPikxOhh yxJNCnFOWgtsAmP1NjAF5JIgG6eCS1ObpYpJ1o6G7DZ8bwOOVDYcmKf5hjTRO6/rvWDW bdpw== 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=xf1G+oSOpKjXF12itEa1eNn8xO93J7w6XWhz+lITvLg=; b=r9+8itXzasxcxcSjPiW4wsffRWpP35wPU2Yg1bNCIuhrmi+7DBKxfwbU8QUVAWZFO6 4mkbDwuQ5kBZJYv1iMrG8vUIO7aBR4MEuONMJNLbmUT0/B01iOsc52A4tVypKbNQnOfc aIo8F7aRshRYcjPWYyDUF1fPR8izOkBjLXHyt75rcW5IPUPFexj3pXa8r7+IgY4jdeTm JfuyIkpybfN4ObbPuGQVeID2XoQbI/TbFVWZ9GnCN2mtQftYsEFp8MLadW1KNuFcTvvy oQHobSwwGHFi76aFWhjB2pDlvoyoFpPnXdRIAAw/M9JvF0sTEWH42EbtUwJ2V6RWsLZF e0UQ== X-Gm-Message-State: APf1xPDoCfGx/BhSBYIZhfGBO7UrzjME/RgxZnyfifSCBPoHkZj0s4so cYcyT1JdZKNdVOuD7Zcg/gpcw0UQ X-Google-Smtp-Source: AG47ELscojqqtDTpnoNJTs+uuXWi5yIcmm6aZ/XPSs2QtNPEYi9uO9am7qwvpJxhkl037E4ZIy6Vdg== X-Received: by 10.223.158.196 with SMTP id b4mr2291880wrf.112.1519922192926; Thu, 01 Mar 2018 08:36:32 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 1 Mar 2018 17:36:14 +0100 Message-Id: <20180301163619.21072-4-pbonzini@redhat.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180301163619.21072-1-pbonzini@redhat.com> References: <20180301163619.21072-1-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 3/8] 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 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" They will be used to avoid recursively taking s->lock during bdrv_open or bdrv_check. Signed-off-by: Paolo Bonzini Message-Id: <1516279431-30424-7-git-send-email-pbonzini@redhat.com> Signed-off-by: Paolo Bonzini Reviewed-by: Eric Blake --- 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 92701ab7af..6482ade7fa 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 24edbb431b..4c216ecd63 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -502,7 +502,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; } @@ -532,7 +532,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; } @@ -3624,22 +3624,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 46c8cf44ec..25b50f8c01 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 2.14.3 From nobody Fri Oct 24 09:58:53 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; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1519922856621927.0014106556229; Thu, 1 Mar 2018 08:47:36 -0800 (PST) Received: from localhost ([::1]:58067 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erRMl-0006ye-Hh for importer@patchew.org; Thu, 01 Mar 2018 11:47:35 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45910) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erRCG-0006h3-VC for qemu-devel@nongnu.org; Thu, 01 Mar 2018 11:36:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1erRCE-0002tv-ME for qemu-devel@nongnu.org; Thu, 01 Mar 2018 11:36:44 -0500 Received: from mail-wr0-x244.google.com ([2a00:1450:400c:c0c::244]:38572) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1erRCE-0002tA-Cj; Thu, 01 Mar 2018 11:36:42 -0500 Received: by mail-wr0-x244.google.com with SMTP id n7so7230815wrn.5; Thu, 01 Mar 2018 08:36:42 -0800 (PST) Received: from donizetti.lan (94-36-191-219.adsl-ull.clienti.tiscali.it. [94.36.191.219]) by smtp.gmail.com with ESMTPSA id a14sm4187152wrf.22.2018.03.01.08.36.33 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 01 Mar 2018 08:36:34 -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=cgfAZrQh44wlcFYUgH10YxDyEqk2e5XHQINoefUSSEA=; b=jvdPxZ4qug7HF+KiVB4XnQTIGPPDmvR/LO3UTha7BNfrCSITwW3CZqns6MU9PV14Mq Sctktgc0nOn1m6iUGA0iclIRSiw4PmTBhSHSjvaFcyCpNOnqCZ6PLMmkncZmO/ODwpfR Md3Qq1DFXFTa10sXSchpvUVLgNZ+mWiNaaVdD3CRGVirW5LBFIxSoqJzp7GdIzUpcw9K MX8QZ2bqvGZ2FKBoYaCV4zL7ZK/bKXMakJ1Dfl8lauCmlZYeC6KPenmsF0gezoo7/YkB D/pNkNj0IfjYGqwZqUteF0yf+b4etbhe+jC57EVJvZO6JvKLogSI/6kk8sgCMOBv81Q8 ndFA== 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=cgfAZrQh44wlcFYUgH10YxDyEqk2e5XHQINoefUSSEA=; b=FsmgwTeM07m1VW0jXxtra10NfIF/6l6/+EaEeIwW/7Ui4odX6HKnm/7f4BdBuCEifk xxoJpjiOX5CFpDlRTAoJ23QCRDiIzSUe5h8JMPqjkIw1GIS58jgle6pInFCn6lHHE9SL J7w6kPpakRARif0KZc2ZBxkXhSOHXZQQCiAaRewK6Xng58lJn9sDMNolsFPYLNdZXrSy XbZfRtw8vsYCFWQNMrdmg+/hWFIJ8CcJijc+JmM1h5c6VSsvDMYJdHVjsPP11YSuCo5l R8xrPZOQX70A0ZMVuizxbfKarMEiSjaXnhpiCuwQOMPHrUHEv0GymcxtDSRN34y7+y4T QTVA== X-Gm-Message-State: APf1xPAD5rLqkD6uywqnSMjkUnihyp7nIU+ATZtaH6cUxUMV5yW3UXoR bMSHcm/ew0hgqgbrfViRaC3gTu4M X-Google-Smtp-Source: AG47ELvANp0rAA4QIHfrRW2PvP2ovlQz+tf9y+IHoXS/BuH1rb9c0ZI7CTxxNkV/jnLTPXkFUPh/Mw== X-Received: by 10.223.136.72 with SMTP id e8mr2218475wre.163.1519922195066; Thu, 01 Mar 2018 08:36:35 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 1 Mar 2018 17:36:15 +0100 Message-Id: <20180301163619.21072-5-pbonzini@redhat.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180301163619.21072-1-pbonzini@redhat.com> References: <20180301163619.21072-1-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/8] qcow2: fix flushing after dirty bitmap metadata writes 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 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" update_header_sync itself does not need to flush the caches to disk. The only paths that allocate clusters are: - bitmap_list_store with in_place=3Dfalse, called by update_ext_header_and_= dir - store_bitmap_data, called by store_bitmap - store_bitmap, called by qcow2_store_persistent_dirty_bitmaps and followed by update_ext_header_and_dir So in the end the central place where we need to flush the caches is update_ext_header_and_dir. Signed-off-by: Paolo Bonzini --- block/qcow2-bitmap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/block/qcow2-bitmap.c b/block/qcow2-bitmap.c index efa10c6663..a2dbd9fab4 100644 --- a/block/qcow2-bitmap.c +++ b/block/qcow2-bitmap.c @@ -110,7 +110,7 @@ static int update_header_sync(BlockDriverState *bs) return ret; } =20 - return bdrv_flush(bs); + return bdrv_flush(bs->file->bs); } =20 static inline void bitmap_table_to_be(uint64_t *bitmap_table, size_t size) @@ -882,7 +882,7 @@ static int update_ext_header_and_dir(BlockDriverState *= bs, return ret; } =20 - ret =3D bdrv_flush(bs->file->bs); + ret =3D qcow2_flush_caches(bs); if (ret < 0) { goto fail; } --=20 2.14.3 From nobody Fri Oct 24 09:58:53 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; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1519922338631641.1286448167763; Thu, 1 Mar 2018 08:38:58 -0800 (PST) Received: from localhost ([::1]:57991 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erREP-00081o-Mr for importer@patchew.org; Thu, 01 Mar 2018 11:38:57 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45962) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erRCI-0006ig-M7 for qemu-devel@nongnu.org; Thu, 01 Mar 2018 11:36:50 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1erRCG-0002vB-Lz for qemu-devel@nongnu.org; Thu, 01 Mar 2018 11:36:46 -0500 Received: from mail-wr0-x241.google.com ([2a00:1450:400c:c0c::241]:42637) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1erRCG-0002uE-2H; Thu, 01 Mar 2018 11:36:44 -0500 Received: by mail-wr0-x241.google.com with SMTP id k9so7212540wre.9; Thu, 01 Mar 2018 08:36:43 -0800 (PST) Received: from donizetti.lan (94-36-191-219.adsl-ull.clienti.tiscali.it. [94.36.191.219]) by smtp.gmail.com with ESMTPSA id a14sm4187152wrf.22.2018.03.01.08.36.40 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 01 Mar 2018 08:36:41 -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=3RfQlj/dzTi8O+iknT/js0OrjwXiC3gbbtwbMp7sTs8=; b=QwkqIGFhLlLa8UW+hUy1SHFnIY7awKzr4x7CqHjBKnDeZyzMCa0EJRG5VTuQxl9QoY QjHN6NxWGMX8fTriR0QlmLzxmSnWpTJeyNxCcZGo/ROo1/tS2tceFP8JkvRIRLL3oIQc h2yoHlPKetTsFIRXFKGYqTfVp/xSxN768CS2QBAEsqxcBpt8qVLocgZR0KfJ/Ym3gu5O YZIrqQbAEkQT3uNaXOqnsvAPNmrke610S+yoOHgKkxPFEB9lDLzOzQOEfG2PZ0sfBErX k3t/PgVngn7+s0/8D5gAoE1T1DRmeBFMNmzw/vh4Y2+u9mzMZBQaM8W5RP1w3FDWUIGL 5zRw== 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=3RfQlj/dzTi8O+iknT/js0OrjwXiC3gbbtwbMp7sTs8=; b=frw37FoFzqYOd8xX6QwnoUzXh7oVaAxQ9p0KyVKnkcu8TWeVFvzFw39MbPKj0gRCKg v0TnPEq08Hur2PDW/OaNl7eiBIJkheEGb9mbeOc1SBfNXlQY8MkLp+LsdKkOfqTE0H2w BbrKDYVn+U67amaJXDarocOWrsSmB+eU6cfrn+Qdn2cS8wNLBFyYxLLkOteR7O02NizC FFJRGjC/sHvsd+Obsrx7c99I0AfwA3eZ52Rryv0PywvlTB7s9peJKz0oMbguA0BqZoJd QOI7YxIahzGasNWUHCkuL0m1dvKVVOpp5zj1sx+I+ErF2nfMORkjQpCaGMq5EeOn5bs9 fYMQ== X-Gm-Message-State: APf1xPBrbsRkMjT8kmZbW0BEJkVlBj0+tc0MCL5GBBeUTT9KcRvSmOzz L4YOJ9v+OaKakUJfl7e0EjEgNjhY X-Google-Smtp-Source: AG47ELsvTtV3IYE5h4QlbhOKF0NRzAj4NhmdoecN+glRB9QCDTXCvcy2PwAbBF1gE5WU4zTzbN4zqg== X-Received: by 10.223.168.111 with SMTP id l102mr2530807wrc.84.1519922202562; Thu, 01 Mar 2018 08:36:42 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 1 Mar 2018 17:36:16 +0100 Message-Id: <20180301163619.21072-6-pbonzini@redhat.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180301163619.21072-1-pbonzini@redhat.com> References: <20180301163619.21072-1-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/8] 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 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 Message-Id: <1516279431-30424-4-git-send-email-pbonzini@redhat.com> 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 4c216ecd63..b5410c5b00 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -1097,8 +1097,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; @@ -1477,8 +1478,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 header.version >=3D 3 ? BDRV_REQ_MAY_UNMA= P : 0; =20 /* Repair image if dirty */ @@ -1524,16 +1523,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 2.14.3 From nobody Fri Oct 24 09:58:53 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; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1519922642422715.7667760840467; Thu, 1 Mar 2018 08:44:02 -0800 (PST) Received: from localhost ([::1]:58030 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erRJF-0003wZ-4n for importer@patchew.org; Thu, 01 Mar 2018 11:43:57 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46006) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erRCJ-0006jN-JS for qemu-devel@nongnu.org; Thu, 01 Mar 2018 11:36:50 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1erRCH-0002wD-Hi for qemu-devel@nongnu.org; Thu, 01 Mar 2018 11:36:47 -0500 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]:50310) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1erRCH-0002v7-6N; Thu, 01 Mar 2018 11:36:45 -0500 Received: by mail-wm0-x242.google.com with SMTP id w128so13410127wmw.0; Thu, 01 Mar 2018 08:36:45 -0800 (PST) Received: from donizetti.lan (94-36-191-219.adsl-ull.clienti.tiscali.it. [94.36.191.219]) by smtp.gmail.com with ESMTPSA id a14sm4187152wrf.22.2018.03.01.08.36.42 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 01 Mar 2018 08:36:42 -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=St1PuUguZbmMkN9L21Dlcjj8WJIP8O3mx03xlKZx5BA=; b=XFtJ9ydkP5+Z7gS/Wf8ZuI5+kfAP/ZM/oKjioVGFFyrcPw77VfZofsDIjFD/BsGnkA 649EgmXe6y3XWeVyVlPWXnUCceFEMzYYytrIQsB+MvG1gKkusyXgWWJPOUyE4eH9EYSZ 0Ij1a4c+6pd8OmAddKEJ/NPLpsjj2bA3YF1twZEAe1EyRQpVxHUGy1K41A7x8qESUmUA Mbyz7eLFbMN6wUXxOQgr/d1O6j589YC7leyVlEuPtnrAPod6UIfLS2roCUhio9gDgEpd yFLVTWHqq7GWDtnpSMjtBU/i3KlX5yx13BKw46FZ/hNluyQBKemwsn8xPzHmzwpeGNoC 4vhg== 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=St1PuUguZbmMkN9L21Dlcjj8WJIP8O3mx03xlKZx5BA=; b=TPNT/CSfr0k1dQRsMKdHSHqzbGMgfYXQW4NFlDEPHCoxTpZ+0qwzlqoe6pItxYcBfR ZQtRYbW3AhRZXzgCy19biM9mDOKT4OHeF+1q/ATvAgADsVyv200s6C9DqMcPEiGm2JPB wgLJIPlQEl6lGIPY8tFCzXqCL+P16oGelsNrPgx+vJ/Gmt3YqRgqa0bTY1x8mr1DdLDY xDT/3O3h7KyjsmV6opXrt+oZAm1ADxKsg5FX2MNSOxisK3WWDG8J9N8qcNQE20O+R10Y dzcG2OU7r0ycT7CWzlXl6HWPoj0GbpqIm4qR8QHOOzuBKa0qJee3aI9jCEExqQET3qKa g0lg== X-Gm-Message-State: AElRT7EsH8cUbe9VimatH8RJt4y27xs9yaoMcABikl3MI2QMyA+1eDXV XOfMCHxHc8c0+5n1VDrOUBo/t77V X-Google-Smtp-Source: AG47ELt6sxufEmGblq/zDFlkJpOomayMOlKVrY8CgLOAlKdvkJQDV6ZS38sLhM5F0R9ERTTM9OlPew== X-Received: by 10.28.113.205 with SMTP id d74mr2609018wmi.3.1519922203685; Thu, 01 Mar 2018 08:36:43 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 1 Mar 2018 17:36:17 +0100 Message-Id: <20180301163619.21072-7-pbonzini@redhat.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180301163619.21072-1-pbonzini@redhat.com> References: <20180301163619.21072-1-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 6/8] 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 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 qed_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 Message-Id: <1516279431-30424-5-git-send-email-pbonzini@redhat.com> 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 dd31c5046e..d379c8c2f0 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 2.14.3 From nobody Fri Oct 24 09:58:53 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; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1519922526438468.62279930772286; Thu, 1 Mar 2018 08:42:06 -0800 (PST) Received: from localhost ([::1]:58011 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erRHR-0002Hl-Ar for importer@patchew.org; Thu, 01 Mar 2018 11:42:05 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46077) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erRCN-0006mg-BF for qemu-devel@nongnu.org; Thu, 01 Mar 2018 11:36:55 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1erRCL-00031B-RS for qemu-devel@nongnu.org; Thu, 01 Mar 2018 11:36:51 -0500 Received: from mail-wm0-x242.google.com ([2a00:1450:400c:c09::242]:53237) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1erRCL-0002zg-I0; Thu, 01 Mar 2018 11:36:49 -0500 Received: by mail-wm0-x242.google.com with SMTP id t3so13291482wmc.2; Thu, 01 Mar 2018 08:36:49 -0800 (PST) Received: from donizetti.lan (94-36-191-219.adsl-ull.clienti.tiscali.it. [94.36.191.219]) by smtp.gmail.com with ESMTPSA id a14sm4187152wrf.22.2018.03.01.08.36.43 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 01 Mar 2018 08:36:44 -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=A7mtfWu3Bq94OhPM5CAG/le/1fc175Y8u+eiHHP+5HA=; b=ITk3zaU2bhTrlscamtMp1oyhm56wSicuoIF7K9z6WTRlQwvwVksCAFqiqmYUagI0T6 I0wR0U+VrdpSPiWw95+KpoOc4E///34D9LUVm/msQxdO9OZ6loN+Q0rxG+G4Gz7lWmaV aj1psgpUq1Fu1RCxJWsZzKP4pXqLaN0+oyYYWZS0FDxKwmL87c9mOr9tFVM87k4KHBuZ B8CgauTgCo87cyw7kAJMaZKXELlebfaUsREY+T9lhSyWQ3Pk7ZA2nbyyzJjx7cLwD7d8 iUSbDYTehjcX7VEtqxijF2zEok8+QYnuEAN6JeAorJ6gkVZUslLEFDM5b1Eo7R1sT0og PY6g== 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=A7mtfWu3Bq94OhPM5CAG/le/1fc175Y8u+eiHHP+5HA=; b=Kw8CaECZQ9y4cSwKPOmzhH2e4ulLbbS2xGGURexYwfUY5XvGLQpLLanSjs89vyjtuG 4VV2lKriyrSjVmu2dGhqvPmaS5N3ivXqB8iZwHlw/irfXA2VcaEgKp+8YyINq928JRc3 rwx9TmvCR8jWroFbpYrVVW4LAI6wwxkqF4EJ0FqGfMqH6hc34+qZmDvZUTL+SzExI6xz Zezo40JYFwYDFo0Ojkg+dD7j7qCADHOtRP+hM5N5OCzY+PZ79MFbDfVRm5E9PY32oazf wlfp9mDR7tEwN5BS0M2IGgYdwfb3jNjcsu9SYLBuLDgQHSxruf9pTWkieH9GZjGxTaOS 97hA== X-Gm-Message-State: APf1xPDPsA68UDaHbV/mtdvdVHMUDFCn8Of/GHUBI2OOfg16I7svlcUE Zbhl7zVYAPgX6BOQSFEIcp1P53gE X-Google-Smtp-Source: AG47ELvH20bY6R+AduAPSPL1oRDIOieACDuBjoZ0dXW7kMsud1huIApHXqurfxc/Adqe+KoTkEdIag== X-Received: by 10.28.74.199 with SMTP id n68mr2233994wmi.83.1519922208004; Thu, 01 Mar 2018 08:36:48 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 1 Mar 2018 17:36:18 +0100 Message-Id: <20180301163619.21072-8-pbonzini@redhat.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180301163619.21072-1-pbonzini@redhat.com> References: <20180301163619.21072-1-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 7/8] 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 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 Message-Id: <1516279431-30424-6-git-send-email-pbonzini@redhat.com> 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 e713fe3d00..b72ed976fd 100644 --- a/block.c +++ b/block.c @@ -4211,7 +4211,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; @@ -4227,7 +4228,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; @@ -4257,8 +4258,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); @@ -4284,6 +4285,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 662f441997..10e2eef03c 100644 --- a/block/iscsi.c +++ b/block/iscsi.c @@ -2168,8 +2168,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); @@ -2200,7 +2200,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 ce6e195a41..68d822b6ff 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 b5410c5b00..33e260a381 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -2119,7 +2119,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; @@ -2142,7 +2143,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); @@ -4383,7 +4386,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 d379c8c2f0..7da553035e 100644 --- a/block/qed.c +++ b/block/qed.c @@ -1549,7 +1549,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; @@ -1558,13 +1559,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: "); @@ -1639,7 +1636,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 c7dd32e213..c1275c1ec9 100644 --- a/block/rbd.c +++ b/block/rbd.c @@ -1093,8 +1093,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); @@ -1160,7 +1160,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 f80683ded2..10064d2a2f 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -216,7 +216,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 2.14.3 From nobody Fri Oct 24 09:58:53 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; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1519922816024575.8271369870084; Thu, 1 Mar 2018 08:46:56 -0800 (PST) Received: from localhost ([::1]:58060 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erRM7-0006Sd-12 for importer@patchew.org; Thu, 01 Mar 2018 11:46:55 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46106) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1erRCS-0006rR-0m for qemu-devel@nongnu.org; Thu, 01 Mar 2018 11:36:58 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1erRCN-00032j-LX for qemu-devel@nongnu.org; Thu, 01 Mar 2018 11:36:56 -0500 Received: from mail-wm0-x241.google.com ([2a00:1450:400c:c09::241]:54683) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1erRCN-00031V-C0; Thu, 01 Mar 2018 11:36:51 -0500 Received: by mail-wm0-x241.google.com with SMTP id z81so13260457wmb.4; Thu, 01 Mar 2018 08:36:51 -0800 (PST) Received: from donizetti.lan (94-36-191-219.adsl-ull.clienti.tiscali.it. [94.36.191.219]) by smtp.gmail.com with ESMTPSA id a14sm4187152wrf.22.2018.03.01.08.36.48 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 01 Mar 2018 08:36:48 -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=ziziMAg5KPz5FQ1EfHC2hdDYRxcOleLtt5QgzFMkt0c=; b=BiwqmJdsCQkUNHyMhRPuibYkmkGL6ld7Ek96SRk82ZoBRUDi6QhjY0nqsGCmLKFKOW oKZWYExt9nvwwkNFIVMnaXs07533YN23ZuR91gNAVNcr7N7l6q0A17d22lOleOPDdu2h vRgPsL9N2HgaLfXmJQzb6UMALSSFTvXTB2FSdn+Siou6isvexNzhCT4a4Fg9k+Kl9u49 yuxWq8R4lVvTeDxPQdBQJrw3Wc+W69XSpkiUDhqwaWslXaH9lomwQtgu3dnJUcYAgiOe cj0XfPkpV5E8DsDYT6ZZw+hkjoqDfz2Kpllg2Jw4ELIHzHtTCvpcmrZyDzEvpMPlyGX2 hD5w== 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=ziziMAg5KPz5FQ1EfHC2hdDYRxcOleLtt5QgzFMkt0c=; b=rfg31CXAmynBv2ZKq+oDfWnpYolOu0twjKgri6bPLB8a2ixT1y/jyF+CeNKMlk/0Wi PL24JZ0J/8YoxgOVlCNt0sRuLzkS0+F0KBUkShdPQbzy03jCSuRkDRSOyBkxSoi3l7Or 7NM2MCIAyRyHa8KFYb6alPd1gpTojK0hy+kBHcRnIilR2v7UbbcNIYhZx2MhbvpC2QrC tLA1rZhTb+HBNM5JnRB5ZwrXEHLaJyPPN7bewEJyQ8E3/c02dc5thdExieyhx1ejRGHC a441xhGcEjU/4GN0zLnbwBzVuJ/DQ+NuVTxqi+oGeqn+Ie4lK1rGCf3Vl2E9oWFLlQ0T oMGQ== X-Gm-Message-State: APf1xPB9ta9/0M/a+2UQN4QCCD8IYuyzkKk5JU5mhfXO41YWkCrxw874 O1imZS7KXVmS2DgcrO6647HIivvv X-Google-Smtp-Source: AG47ELv7xQcjZc5fH8uRwqKS6tM32PP0eJatJJ5WNWXE3mKnuHUGX+vFaW9YSGHQIeQtCGLF8BruEQ== X-Received: by 10.28.225.66 with SMTP id y63mr2206451wmg.148.1519922209598; Thu, 01 Mar 2018 08:36:49 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 1 Mar 2018 17:36:19 +0100 Message-Id: <20180301163619.21072-9-pbonzini@redhat.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180301163619.21072-1-pbonzini@redhat.com> References: <20180301163619.21072-1-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:400c:c09::241 Subject: [Qemu-devel] [PATCH 8/8] 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 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 Message-Id: <1516279431-30424-8-git-send-email-pbonzini@redhat.com> 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 b72ed976fd..944423f7f7 100644 --- a/block.c +++ b/block.c @@ -3457,17 +3457,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 c3095bd9c0..390216c25d 100644 --- a/block/parallels.c +++ b/block/parallels.c @@ -370,8 +370,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; @@ -386,6 +387,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"); @@ -434,11 +436,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 @@ -457,13 +460,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 @@ -792,7 +797,7 @@ static BlockDriver bdrv_parallels =3D { .supports_backing =3D true, =20 .bdrv_co_create_opts =3D parallels_co_create_opts, - .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 33e260a381..39a3415c99 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -543,8 +543,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) { @@ -561,6 +562,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) { @@ -1485,7 +1499,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; @@ -4390,7 +4405,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 dcd4f036b8..0edac03159 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 eead8b0fc7..7df5680adb 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 7da553035e..c655f139a2 100644 --- a/block/qed.c +++ b/block/qed.c @@ -1572,12 +1572,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 { @@ -1637,7 +1642,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 0fa98d5ffe..a7fa62fa3c 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -259,8 +259,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; @@ -909,7 +909,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 3fbff5048b..d82350d07c 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_opts =3D vhdx_co_create_opts, .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 a3f7610082..264d855ec1 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -2231,8 +2231,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; @@ -2401,7 +2402,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 10064d2a2f..c8d208620e 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -299,8 +299,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 2.14.3