From nobody Sat Oct 25 21:46:18 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 1516280002505865.6647402026539; Thu, 18 Jan 2018 04:53:22 -0800 (PST) Received: from localhost ([::1]:56968 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ec9gt-0000OP-Pv for importer@patchew.org; Thu, 18 Jan 2018 07:53:11 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40022) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ec9Xz-0001E5-SA for qemu-devel@nongnu.org; Thu, 18 Jan 2018 07:44:07 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ec9Xx-0004WV-An for qemu-devel@nongnu.org; Thu, 18 Jan 2018 07:43:59 -0500 Received: from mail-wr0-x244.google.com ([2a00:1450:400c:c0c::244]:43774) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ec9Xw-0004Vj-VT; Thu, 18 Jan 2018 07:43:57 -0500 Received: by mail-wr0-x244.google.com with SMTP id t16so8739512wrc.10; Thu, 18 Jan 2018 04:43:56 -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 t51sm13006472wrc.21.2018.01.18.04.43.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 18 Jan 2018 04:43:54 -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=M5Q9/+LHNNuHEaQ5fS0WpZReJfLU7dSBz5P2q5+Y/FY=; b=JjlpbBdtgUTbsjWkCvXnP/p4zHPCviTFk/sKqNWdJ/byAoO/OnufBtDkZ/hW6rF2ML 29NDhyISA0PuGC5wDMdz3clr9DKJ3yyr7YKoTxKZZNoE0FCM2fL/bLdDWRR/Om6dOGMA shVmQ9K3vgosSKW+/CGBmpC99kCUEY0h8cpRo2OwW5dYeLS/RkoYdOjEzLJwa7RDHoto yOQCWAee0eam+36x4s3O1w6ECX8FvsngfpTXB9GCbTTeC8aFg8tA9I/wFNerGPZQXu8A 1PjPgWvSwkS9f++lRmi6TOR4WRtlNYMLFqMv+rdRmYMXIKY0Migk4Kr4+5Uml0CddY3o Mt3Q== 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=M5Q9/+LHNNuHEaQ5fS0WpZReJfLU7dSBz5P2q5+Y/FY=; b=J9LiqVrmUDOVHQedycxTj6pjJTROjpVLIn2yaciv+I8OdYhaBOCotZNM+Lz81RvL6S mKKYflfM/rQnxtsPeQ1Qx3zp+ZLKnlGS1hghaKjXhNhiVu4Kzxk6DG8Vedt5tMgBL88J cC+W8jURh3W3/hmeiVf0LfG69AP+xVblBbWvuZju62Exs+SC4uwfS75iYh5kmk7kgmHx skykpafdnA1f8h8tnJfeNX5k++TQhPSmcY1IJoD0WG6NB8XxPZpop49qS0t+Bbx099kK +f9iYXSL2wAH7DcfQ0ChJpyAALKDgZNokBzMY6uKOqFdv6NR9OqZoswf4CyJFAcGQDni ZYng== X-Gm-Message-State: AKwxytdI/cO+lhlfipFwowTKYXaH6VfsO8Q5xnzV1MdGJ497JlTLVFl5 tPieVXdI8sObI37ZVAzL+iv/0BTp X-Google-Smtp-Source: ACJfBosPTrW3u7MWpgbR5SWX/Q+lp9Oz//AY11uQnploudvH0PFfEZ8XLUNsbtV2KwxxhF1H8rbMzg== X-Received: by 10.223.161.150 with SMTP id u22mr6540154wru.251.1516279435284; Thu, 18 Jan 2018 04:43:55 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 18 Jan 2018 13:43:45 +0100 Message-Id: <1516279431-30424-2-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1516279431-30424-1-git-send-email-pbonzini@redhat.com> References: <1516279431-30424-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 1/7] 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, 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_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 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 | 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_opts(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_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 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_opts_luks(const char *filen= ame, + 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_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 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_opts(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_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, @@ -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_opts(const char *filename, QemuOpts= *opts, + 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_opts =3D hdev_co_create_opts, .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_opts =3D hdev_co_create_opts, .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_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 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_opts(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_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 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_opts(const char *filename, + QemuOpts *opts, Error = **errp) { 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_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, @@ -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_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, @@ -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_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, @@ -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_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 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_opts(const char *filename, QemuOpt= s *opts, + 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_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, @@ -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_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 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_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 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_opts(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_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 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_opts(const char *filename, QemuOpts= *opts, + 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_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 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_opts(const char *filename, QemuOpt= s *opts, + 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_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 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_opts(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_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 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_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 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_opts(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_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 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_opts(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_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, @@ -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_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, @@ -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_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 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_opts(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_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 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_opts(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_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 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_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 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_opts(const char *filename, QemuOpts= *opts, + 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_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 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_opts(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_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 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_opts)(const char *filename, QemuOpts= *opts, + 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 21:46:18 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 151627991388313.561223209461787; Thu, 18 Jan 2018 04:51:53 -0800 (PST) Received: from localhost ([::1]:56953 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ec9fc-0007qB-SS for importer@patchew.org; Thu, 18 Jan 2018 07:51:52 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40016) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ec9Xz-0001Dm-Ho for qemu-devel@nongnu.org; Thu, 18 Jan 2018 07:44:00 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ec9Xy-0004Wp-5d for qemu-devel@nongnu.org; Thu, 18 Jan 2018 07:43:59 -0500 Received: from mail-wr0-x244.google.com ([2a00:1450:400c:c0c::244]:35034) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ec9Xx-0004WZ-UJ; Thu, 18 Jan 2018 07:43:58 -0500 Received: by mail-wr0-x244.google.com with SMTP id g38so19205844wrd.2; Thu, 18 Jan 2018 04:43:57 -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 t51sm13006472wrc.21.2018.01.18.04.43.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 18 Jan 2018 04:43:55 -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=Y1L8IHI11QecjqL/YZfNecRZyKoC5SoS8DJg/mA4eV0=; b=BU4xxICBPl3N1eLpLmvZoE6UXlFXAVMeu2L17h2cHw+sYVf9WfjrL7f/5nTZrmHJzw 50A0OQzCJgCOZ6hvM51YcutXt9pOMt7oqTJ5r/Z7unWqYhGfGbvB/YYTCb50PhodB8FU bBR47yMn3wPRg2pWbnmdqHwid3FklHhvjdBGu0cr0o49N1wLuWDEewLOtHpu0uYjTPtq 0l8yxM4cOrbukYLA5Poyx6kPViSIme8xsR4ZLGBoP+Old4ozYeDVZ/pT/a8n77jdPto0 vS0q2n4Oo3Mt5Jc025ZqaPXruWc6G+uQwcGOD2d6p4pCVACvC4reCWsmgPvvDH2JY6ip ZXjw== 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=Y1L8IHI11QecjqL/YZfNecRZyKoC5SoS8DJg/mA4eV0=; b=VMZJ6BVbWU8CcG/S+YfkGhUI+01Sxnkv9CFyyfP/0HzOnOqc8r++0SDbiFYUlJz9TF 6ADm1Wzji91yc1gIcN2DVD3SdMzlOh8EdKPDesT+YMTc+lCgO7jULmxQZ8pXNQ2bFmNT vAimSzoY6py51HIGkTZENDxLGJtbZ23LCvhSNdcEMwaUlZ/ZQoDFec+iJtqVeMwS1y2Z ey9fd9JIL/8pLdhSXSckk89phFWgtDKV3yhhBn9aYxP7Nflaz1Tn7nTDTRSmH7LTA5i4 K33phRWRh75X/xOw7UmAzN9SdxcyGCjZGqK9k7D9ww58Mj2G306bF1LoFTncS231h5CR PhDQ== X-Gm-Message-State: AKwxytepFjxXN4ZgKMTsokF6YTMZGW5ot1RYB1k+nc/geg2nt0+eZT+E 7PAdFrLJdoD/IDtvyct3+Jo1DU+K X-Google-Smtp-Source: ACJfBosjyalBnzfhMagq01Xw8eOiqObL+C2iiqO08GbD/XhVm9Ss29mP5e0hvwAUE2yowui7TzXj2A== X-Received: by 10.223.175.220 with SMTP id y28mr5566255wrd.263.1516279436556; Thu, 18 Jan 2018 04:43:56 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 18 Jan 2018 13:43:46 +0100 Message-Id: <1516279431-30424-3-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1516279431-30424-1-git-send-email-pbonzini@redhat.com> References: <1516279431-30424-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::244 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. 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 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 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 21:46:18 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 1516279579198262.69993596423933; Thu, 18 Jan 2018 04:46:19 -0800 (PST) Received: from localhost ([::1]:56648 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ec9a6-0002nN-R7 for importer@patchew.org; Thu, 18 Jan 2018 07:46:10 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40041) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ec9Y0-0001Et-Nu for qemu-devel@nongnu.org; Thu, 18 Jan 2018 07:44:02 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ec9Xz-0004XV-Ac for qemu-devel@nongnu.org; Thu, 18 Jan 2018 07:44:00 -0500 Received: from mail-wm0-x243.google.com ([2a00:1450:400c:c09::243]:40240) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ec9Xz-0004XB-3t; Thu, 18 Jan 2018 07:43:59 -0500 Received: by mail-wm0-x243.google.com with SMTP id v123so22651188wmd.5; Thu, 18 Jan 2018 04:43:58 -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 t51sm13006472wrc.21.2018.01.18.04.43.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 18 Jan 2018 04:43:57 -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=Cidya6VF22F+jwQQ+ltOiiPQVA/Td4uNmy4RAaeMsgnpEeIR/Se+zJyj48OUM13ocC tkQte2ELaa+eCplldJdLwuxY4O9m3WunHN9RqywheFyWnH/R1OOL6KuJBW+EVFZ+nmrT FFKm2EMK5dTHbfsLSR1RHVZ4hdLOai8fIA9vKor9aEP2KRcjC38Ktdo3B+hMDceexrix q2fP6EZuAJoRAa7LsjDwISTMp/cQnQGCFhxHbm96/PgXRLHpDAtQYZdhQ5ywASMomZIn bGdnvdH8vCvdY7NfIynVHE1jUJUn5bqfD+5GraWzhghAygkeuccFvLY+b5ufnz+9Sd2G U+tQ== 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=LC/REByWzoqcnw2sjzhq4CWsIu1esmW5cGNzQJ1A3APOfYXzmRXsxn0PIZQsyv4Vyo Jl7BBExDPhLR/unJlchuukWgn+TFYGkM15Wj2jlIGzp+z/v+535vGZz4VmdGZxN8v9qb rAACEN83tQKY8zWRJ41GrCtGJ/GwDQMxfPe6Vr5nxuBnJb0DLOE6XsmnRQhw+tnDKdZJ zBR5t2x3HOFYpa2jcDmoy1e5Z4dliYL3JqGf66zWyyl+00bKgcIrBd0ndWx/PmZ/PXr3 /B0CEscCPFqyskXLRRt0Q2CujlnBFxurKmbvFL2jGK84O1zREAhpu3UWnIZSQUxF82bR yang== X-Gm-Message-State: AKwxyteRRZuXpeyXIeoXYOw22tyejEUsxhynBlT0oZMzbcnX8gvkHvOs LEmAggrycuFQkt6hJqtwiW8HDsNh X-Google-Smtp-Source: ACJfBotcUzEACeXSmZBE952Z6lD0WYG7zJc0508guWQ4Ixlf4c+KLcmfv5Xg0AvUymaEMQ9+x96C0w== X-Received: by 10.28.238.202 with SMTP id j71mr4904196wmi.34.1516279437666; Thu, 18 Jan 2018 04:43:57 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 18 Jan 2018 13:43:47 +0100 Message-Id: <1516279431-30424-4-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1516279431-30424-1-git-send-email-pbonzini@redhat.com> References: <1516279431-30424-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::243 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 Reviewed-by: Eric Blake --- 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 21:46:18 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 1516279839034631.825960382884; Thu, 18 Jan 2018 04:50:39 -0800 (PST) Received: from localhost ([::1]:56884 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ec9eQ-0006dO-7t for importer@patchew.org; Thu, 18 Jan 2018 07:50:38 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40055) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ec9Y1-0001FP-AW for qemu-devel@nongnu.org; Thu, 18 Jan 2018 07:44:02 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ec9Y0-0004YF-Cp for qemu-devel@nongnu.org; Thu, 18 Jan 2018 07:44:01 -0500 Received: from mail-wm0-x243.google.com ([2a00:1450:400c:c09::243]:34056) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ec9Y0-0004Xe-5d; Thu, 18 Jan 2018 07:44:00 -0500 Received: by mail-wm0-x243.google.com with SMTP id 81so2581207wmb.1; Thu, 18 Jan 2018 04:44:00 -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 t51sm13006472wrc.21.2018.01.18.04.43.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 18 Jan 2018 04:43:58 -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=V3DY5yj683PJrN+zLvw9KS+dGRThuw1A99KyLXkWlAgppUSFlgWsZXw7eJ0adR3tpA ziz/eLZaprbILz7X6TAmjnTlDEIubOnBHt+WAjx/ZipeNAeP+UejLhI3Bp/H/vkTIxGM 85BCjbPKBOd09gDvDgFeFyxi/DyBnNTYavR1OMRPCQR7B+ceFrJg/di5/yNtngQnzRz+ aWUdkfTjAywK2GSBHv8EVSt7x6C5y3vFf8VOmkplzok6wg7zQXtTMfZw4283clN9hgpx Fbj0jItehWOb8jw2geMMHjf5IbrhHlXNLEocV0pMyFWUEKKa5uIQXg627woPfTWG5lBC 6Pjg== 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=UwNXjctDi72o2Tvvm5kSY28qth3ytVw6DoaVpfhOeK47TWSxIejaXFccY4afCPXI4c 10lnC8GkhcBxMLCoLMExMLvr1QonKhC8QcfDyte1qT+zsvDadXMp7vakRgp6aKTvOK3O x4cZscRgGaE8yC4/ytg8ckbREwCL4NVEqEr3O/BkAWeIPC2KptzsQKDiQqdIcT7LmXfP 9WI0XOVKFIPsWkDKNl+JvoZ9SMXA7HSMzbx2Lu39pQ2a91WxOe6OIvVfcB4OwgCz4bTq UzilwcQn8rxd5OOA/2zIfX43QYKiGy18ArGfIC/x/eZU+nM28Ef73gxhohEba9xCNopB Z8EA== X-Gm-Message-State: AKwxytejmgAZ/VV8T6O5Ib7GMtQNrUYRMXGHTnHcm3pcdHz/GZgr9jUw e3SYhJnsgGmQqa7eRvZzkrnn43IK X-Google-Smtp-Source: ACJfBotLKQ3mqhSM4S6C96bdsoRi0YxyS1hkJaWp6Z91T2BMxwRjpVd09B9vxRY5d2DON+35U+xM9A== X-Received: by 10.28.131.17 with SMTP id f17mr4808589wmd.139.1516279438745; Thu, 18 Jan 2018 04:43:58 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 18 Jan 2018 13:43:48 +0100 Message-Id: <1516279431-30424-5-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1516279431-30424-1-git-send-email-pbonzini@redhat.com> References: <1516279431-30424-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::243 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 Reviewed-by: Eric Blake --- 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 21:46:18 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 1516279946382552.5197280848006; Thu, 18 Jan 2018 04:52:26 -0800 (PST) Received: from localhost ([::1]:56956 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ec9g9-0008Ft-EH for importer@patchew.org; Thu, 18 Jan 2018 07:52:25 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40133) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ec9Y8-0001Ms-Cp for qemu-devel@nongnu.org; Thu, 18 Jan 2018 07:44:10 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ec9Y1-0004ZO-UK for qemu-devel@nongnu.org; Thu, 18 Jan 2018 07:44:08 -0500 Received: from mail-wr0-x242.google.com ([2a00:1450:400c:c0c::242]:36149) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ec9Y1-0004Ys-LL; Thu, 18 Jan 2018 07:44:01 -0500 Received: by mail-wr0-x242.google.com with SMTP id d9so22403098wre.3; Thu, 18 Jan 2018 04:44:01 -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 t51sm13006472wrc.21.2018.01.18.04.43.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 18 Jan 2018 04:43:59 -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=rOKuMcPW8P8SwqLkUZRi7/mQQOzy+qt6TxF/8nQt9Tv9SY2bZhA2Vgz7jgz6adYvrr 0nEyy2x6ZLjjIWRFT293flaSUSfiNh6/YAyzY+/HATLNnX0r5M8bRGeiXm6jF1tIkjbc MChJmhIGs20Q6P3CXRY+coz+lfFIv9u4RWj8GiMprtF6KdXEK3j/JMwF4WkEziLk2Zwd Np4x2aOFd7MEcWt5mHIqCjiSadKqaTpf4iBZ3Y8J0n6og0ciVeigJIoScFVack5ezv0X 53NIG/iVLmckkupiQ6qQgC3jYkf6VzpFHuEfCqIU7SBfghiDyxxdcLaRieQPpTV/wBaw 31sA== 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=AWum/rDFg4921LwSGYuh+s11VNm9Pw/LEmUvXDP1GH/0OB9qH3FSoMqVsODpkwzo44 VrkqWZtUyyAG6ac91KL8ASyT/gUVRui+GuRHdpTT0Hr3oMB6WS3tPbfpT1nJN0oznBiE nep2f74ybORiwaf/S/O+u4coe+SENVyL45aHIp3x7N3N1wY1xDi+g2ysPvs6DkpB/YVj TbkOQrL9cwyLe65aoK23NetqMrdXWl4CcuDiAdrrHNid44hOFEa2soaZhPzwZ02tlZtz jwXO5JcMhGVjtfsWz0/nT+0OzYx/+lArpm9+9rXGoIBoMZQQR1iO01BkdGTTP48rGxRP gqxA== X-Gm-Message-State: AKwxytdwusgzo+EIMvnL8HlJYM0uok4ufXc2wbXcBTZ2Thk7jfSh6/Vf 9VxO/4W8FFlimxsiYlHgvLXPd2me X-Google-Smtp-Source: ACJfBot/c3mCsDxJ+GCyXPdHXYP2TDN0AYnUAEiWEzVyJza8vPMYxkpsGcPI1PUgjg9sD56CgnNZMQ== X-Received: by 10.223.142.56 with SMTP id n53mr5612867wrb.54.1516279440182; Thu, 18 Jan 2018 04:44:00 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 18 Jan 2018 13:43:49 +0100 Message-Id: <1516279431-30424-6-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1516279431-30424-1-git-send-email-pbonzini@redhat.com> References: <1516279431-30424-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 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 Reviewed-by: Eric Blake --- 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 21:46:18 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 1516280091078311.5888781307044; Thu, 18 Jan 2018 04:54:51 -0800 (PST) Received: from localhost ([::1]:57112 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ec9iU-0001r5-0T for importer@patchew.org; Thu, 18 Jan 2018 07:54:50 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40119) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ec9Y6-0001L6-P7 for qemu-devel@nongnu.org; Thu, 18 Jan 2018 07:44:10 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ec9Y2-0004aC-SI for qemu-devel@nongnu.org; Thu, 18 Jan 2018 07:44:06 -0500 Received: from mail-wr0-x243.google.com ([2a00:1450:400c:c0c::243]:36150) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ec9Y2-0004ZW-ME; Thu, 18 Jan 2018 07:44:02 -0500 Received: by mail-wr0-x243.google.com with SMTP id d9so22403142wre.3; Thu, 18 Jan 2018 04:44:02 -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 t51sm13006472wrc.21.2018.01.18.04.44.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 18 Jan 2018 04:44:00 -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=Jv6Y4dhqjZMjDiuIV3Ei+jb7asYw9jhJ9cpizvBu0sECxgJ18SZYnA22S3b5j4sNKC IUUqIEzenfCromdKaQ8X9DXj6XWiqxSNbSL8v1M1RPF7wzo0IcF89ZfBvMUfp1f0kl0I X9roIqIjFa8YKDtWxAFV+j2Vd59veFtPp1+cgiyfhMUmhb1ULbWTq+P/t24qD6sLHkiz YEzSqW/fKS2TuaGTJyvzb1US9qd0WF+rY3X/0cbJp2IXHA6EeLUMAnkOb/p3fRA05sg5 63AQfeqtCUdWyOTnufcbKo1rZeZa6wNMdTrLBQJ8WIVz+WtcNx1xgRr5DU97JekACdtX 06IA== 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=tvlFTqWnO21vs2ZzwpPekLcLl1P+sfNQLRR6KNSyNz8QgJbi1jFH7PRJPhGN5SLJZf ecjv426zMvwk8Cf585oLh586tjRgzA1DC9DN0ca9NRs0EUdPjotuIAC6OEkZX/1cfwkH Rfx75jH8fndeUfsHg7EOhKZMxEYKP0cMGQt8e6Cem5m22w9P7l89z0Tk5ztJVxdzrv2x YzUQXZQ+mw1C02T1zuw7aYXgbGMaBUKVUO110H+yPNGHO/D/VC+jDUAgccaRKs1nj1LR rMLS2JHXIM7N1KutVhyCJbFUbxzhlMG5S2h+hx9I0yLmPgJPtmBRQOBMXSTEDupmf5wH 0hsQ== X-Gm-Message-State: AKwxytdu5Clw5g3HwQH05qHm18FlqJJNUo9IHk5qojkbBOK+EAjehPJ3 +tScHPcaFKEXhOlzmXbIFe6mL//R X-Google-Smtp-Source: ACJfBosqRiavjNEKRw8t/7ErHhNAk8G8w/VEOz4yDKOonEeowv9aqDzWfyRrcPbp3cvHgypm6ZCwqQ== X-Received: by 10.223.173.165 with SMTP id w34mr6187622wrc.75.1516279441263; Thu, 18 Jan 2018 04:44:01 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 18 Jan 2018 13:43:50 +0100 Message-Id: <1516279431-30424-7-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1516279431-30424-1-git-send-email-pbonzini@redhat.com> References: <1516279431-30424-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 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 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 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 21:46:18 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 151627977888175.30532124865147; Thu, 18 Jan 2018 04:49:38 -0800 (PST) Received: from localhost ([::1]:56734 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ec9dP-0005eT-Uf for importer@patchew.org; Thu, 18 Jan 2018 07:49:36 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40117) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ec9Y6-0001Kl-IA for qemu-devel@nongnu.org; Thu, 18 Jan 2018 07:44:10 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ec9Y4-0004b1-MY for qemu-devel@nongnu.org; Thu, 18 Jan 2018 07:44:06 -0500 Received: from mail-wr0-x242.google.com ([2a00:1450:400c:c0c::242]:37894) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ec9Y4-0004ad-Bh; Thu, 18 Jan 2018 07:44:04 -0500 Received: by mail-wr0-x242.google.com with SMTP id x1so18224711wrb.5; Thu, 18 Jan 2018 04:44:04 -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 t51sm13006472wrc.21.2018.01.18.04.44.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 18 Jan 2018 04:44:02 -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=Klg7rBSCVE5kKZgPt34+bUxc9QLp3tuZJ5EVgr6UKkc=; b=RiufCziQAfvyG93lR8RzRHxJWQjUzcro1icZPPfRJFLA9YyuHmyPGhGKHo5kJsmUon MhyJvCiW4XPjTNr6lhIILwDvXbnDkkAaYR6Mhk/B9fes+yXky9ZFlrdXGj3BY9kIirYW GUXuQnCqF2XahBPlNtn28Lbu1B7Z7YoW3hvC1V+ks/R1ELXVhx7+Vq4yRWUWF+DfrHiL On4j3Q2+DXise2Dpo9I8qDFRnADw7vHyP2cV8aRjvDcorIsTHq5KAuql7QBR1p+GSELs cRD+DHZXa+jwGGjvxGVbfBr8p6HMfFbpJoOGpeHIbqxOJFY+qR30EwQxp+BafsXccH31 7LLA== 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=Klg7rBSCVE5kKZgPt34+bUxc9QLp3tuZJ5EVgr6UKkc=; b=EGtIBvCVwLAQTJrc23ggTmdhsvizqyhsxqvytHVwfrsIwSOh1mZ1mixdc/5eokrzIT tkWkSf8UFyEkBFyef/EIG3PuiRz4Iv3V2StL8cAo/Q3RppbmVYl2KBL9yWS6Ll26+ZjE YbYttuwttDja0Iww8COGsd9Vm2JiWSrHIvN+5g97lPgzzAw/Zy157GteksfawBQo+fBy bnSJtKWP0NMvMB3gLE8wYbG+3Ww3FVzdST437qvAkRAhPddnxb3+97SY+REFplqBVsa0 0LKs55XYdhyArxfY2TKTjOTTA+1MGT5nIp+tmqEBVtVqSbC5xlApFsFRmmyTKmt1JXut c0nA== X-Gm-Message-State: AKwxytclDmjQVWPXt03Os+pcasBIlzgyMMT539gh/zgSYLPd4WLG1lWc ivHGdi6zMqudREawjNjXNmaoNTcC X-Google-Smtp-Source: ACJfBovLSZ4FZMY3PCiepQejNu50+MSxdOfrz41xEQXX1AUiuqnjq8Av0AYsbfCZRqaA88fD/r7zmA== X-Received: by 10.223.164.86 with SMTP id e22mr5830030wra.19.1516279442838; Thu, 18 Jan 2018 04:44:02 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 18 Jan 2018 13:43:51 +0100 Message-Id: <1516279431-30424-8-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1516279431-30424-1-git-send-email-pbonzini@redhat.com> References: <1516279431-30424-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 Reviewed-by: Eric Blake --- 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_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 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_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 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