From nobody Wed Apr 16 12:21:31 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; 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 1544622285287202.83598312383913; Wed, 12 Dec 2018 05:44:45 -0800 (PST) Received: from localhost ([::1]:44988 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gX4oe-0007eQ-6U for importer@patchew.org; Wed, 12 Dec 2018 08:44:44 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46410) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gX4Yw-00037E-M7 for qemu-devel@nongnu.org; Wed, 12 Dec 2018 08:28:33 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gX4Yv-0001VE-Ks for qemu-devel@nongnu.org; Wed, 12 Dec 2018 08:28:30 -0500 Received: from mx1.redhat.com ([209.132.183.28]:54039) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gX4Yt-0001S5-Ir; Wed, 12 Dec 2018 08:28:27 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E64013086259; Wed, 12 Dec 2018 13:28:26 +0000 (UTC) Received: from linux.fritz.box.com (ovpn-117-245.ams2.redhat.com [10.36.117.245]) by smtp.corp.redhat.com (Postfix) with ESMTP id D79C460C44; Wed, 12 Dec 2018 13:28:25 +0000 (UTC) From: Kevin Wolf To: qemu-block@nongnu.org Date: Wed, 12 Dec 2018 14:27:15 +0100 Message-Id: <20181212132735.16080-22-kwolf@redhat.com> In-Reply-To: <20181212132735.16080-1-kwolf@redhat.com> References: <20181212132735.16080-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.49]); Wed, 12 Dec 2018 13:28:26 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PULL 21/41] file-posix: Move read/write operation logic out of aio_worker() 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, peter.maydell@linaro.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" aio_worker() for reads and writes isn't boring enough yet. It still does some postprocessing for handling short reads and turning the result into the right return value. However, there is no reason why handle_aiocb_rw() couldn't do the same, and even without duplicating code between the read and write path. So move the code there. Signed-off-by: Kevin Wolf --- block/file-posix.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/block/file-posix.c b/block/file-posix.c index 4a94597b80..877c0700e1 100644 --- a/block/file-posix.c +++ b/block/file-posix.c @@ -1311,7 +1311,8 @@ static ssize_t handle_aiocb_rw(RawPosixAIOData *aiocb) * we can just use plain pread/pwrite without any problems. */ if (aiocb->io.niov =3D=3D 1) { - return handle_aiocb_rw_linear(aiocb, aiocb->io.iov->iov_base); + nbytes =3D handle_aiocb_rw_linear(aiocb, aiocb->io.iov->iov_ba= se); + goto out; } /* * We have more than one iovec, and all are properly aligned. @@ -1323,7 +1324,7 @@ static ssize_t handle_aiocb_rw(RawPosixAIOData *aiocb) nbytes =3D handle_aiocb_rw_vector(aiocb); if (nbytes =3D=3D aiocb->aio_nbytes || (nbytes < 0 && nbytes !=3D -ENOSYS)) { - return nbytes; + goto out; } preadv_present =3D false; } @@ -1341,7 +1342,8 @@ static ssize_t handle_aiocb_rw(RawPosixAIOData *aiocb) */ buf =3D qemu_try_blockalign(aiocb->bs, aiocb->aio_nbytes); if (buf =3D=3D NULL) { - return -ENOMEM; + nbytes =3D -ENOMEM; + goto out; } =20 if (aiocb->aio_type & QEMU_AIO_WRITE) { @@ -1375,7 +1377,21 @@ static ssize_t handle_aiocb_rw(RawPosixAIOData *aioc= b) } qemu_vfree(buf); =20 - return nbytes; +out: + if (nbytes =3D=3D aiocb->aio_nbytes) { + return 0; + } else if (nbytes >=3D 0 && nbytes < aiocb->aio_nbytes) { + if (aiocb->aio_type & QEMU_AIO_WRITE) { + return -EINVAL; + } else { + iov_memset(aiocb->io.iov, aiocb->io.niov, nbytes, + 0, aiocb->aio_nbytes - nbytes); + return 0; + } + } else { + assert(nbytes < 0); + return nbytes; + } } =20 #ifdef CONFIG_XFS @@ -1779,25 +1795,9 @@ static int aio_worker(void *arg) switch (aiocb->aio_type & QEMU_AIO_TYPE_MASK) { case QEMU_AIO_READ: ret =3D handle_aiocb_rw(aiocb); - if (ret >=3D 0 && ret < aiocb->aio_nbytes) { - iov_memset(aiocb->io.iov, aiocb->io.niov, ret, - 0, aiocb->aio_nbytes - ret); - - ret =3D aiocb->aio_nbytes; - } - if (ret =3D=3D aiocb->aio_nbytes) { - ret =3D 0; - } else if (ret >=3D 0 && ret < aiocb->aio_nbytes) { - ret =3D -EINVAL; - } break; case QEMU_AIO_WRITE: ret =3D handle_aiocb_rw(aiocb); - if (ret =3D=3D aiocb->aio_nbytes) { - ret =3D 0; - } else if (ret >=3D 0 && ret < aiocb->aio_nbytes) { - ret =3D -EINVAL; - } break; case QEMU_AIO_IOCTL: ret =3D handle_aiocb_ioctl(aiocb); --=20 2.19.2