From nobody Mon Feb 9 10:48:36 2026 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=virtuozzo.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1520535030661660.0176145881945; Thu, 8 Mar 2018 10:50:30 -0800 (PST) Received: from localhost ([::1]:40946 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eu0cU-0006dH-E4 for importer@patchew.org; Thu, 08 Mar 2018 13:50:26 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52555) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eu0Yu-0004YR-QZ for qemu-devel@nongnu.org; Thu, 08 Mar 2018 13:46:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eu0Yp-0003JH-TG for qemu-devel@nongnu.org; Thu, 08 Mar 2018 13:46:44 -0500 Received: from relay.sw.ru ([185.231.240.75]:35508) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eu0Yp-0003I1-KI; Thu, 08 Mar 2018 13:46:39 -0500 Received: from msk-vpn.virtuozzo.com ([195.214.232.6] helo=kvm.sw.ru) by relay.sw.ru with esmtp (Exim 4.89) (envelope-from ) id 1eu0Yn-0003rE-Dw; Thu, 08 Mar 2018 21:46:37 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Thu, 8 Mar 2018 21:46:36 +0300 Message-Id: <20180308184636.178534-6-vsementsov@virtuozzo.com> X-Mailer: git-send-email 2.11.1 In-Reply-To: <20180308184636.178534-1-vsementsov@virtuozzo.com> References: <20180308184636.178534-1-vsementsov@virtuozzo.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 185.231.240.75 Subject: [Qemu-devel] [PATCH 5/5] nbd/server: refactor nbd_trip: split out nbd_handle_request 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: pbonzini@redhat.com, vsementsov@virtuozzo.com, den@openvz.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Split out request handling logic. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Eric Blake --- nbd/server.c | 129 +++++++++++++++++++++++++++++++------------------------= ---- 1 file changed, 67 insertions(+), 62 deletions(-) diff --git a/nbd/server.c b/nbd/server.c index a2f5f73d52..7b236f404e 100644 --- a/nbd/server.c +++ b/nbd/server.c @@ -1584,17 +1584,79 @@ static coroutine_fn int nbd_do_cmd_read(NBDClient *= client, NBDRequest *request, } } =20 +/* Handle NBD request. + * Return -errno if sending fails. Other errors are reported directly to t= he + * client as an error reply. */ +static coroutine_fn int nbd_handle_request(NBDClient *client, + NBDRequest *request, + uint8_t *data, Error **errp) +{ + int ret; + int flags; + NBDExport *exp =3D client->exp; + char *msg; + + switch (request->type) { + case NBD_CMD_READ: + return nbd_do_cmd_read(client, request, data, errp); + + case NBD_CMD_WRITE: + flags =3D 0; + if (request->flags & NBD_CMD_FLAG_FUA) { + flags |=3D BDRV_REQ_FUA; + } + ret =3D blk_pwrite(exp->blk, request->from + exp->dev_offset, + data, request->len, flags); + + return nbd_send_generic_reply(client, request->handle, ret, + "writing to file failed", errp); + case NBD_CMD_WRITE_ZEROES: + flags =3D 0; + if (request->flags & NBD_CMD_FLAG_FUA) { + flags |=3D BDRV_REQ_FUA; + } + if (!(request->flags & NBD_CMD_FLAG_NO_HOLE)) { + flags |=3D BDRV_REQ_MAY_UNMAP; + } + ret =3D blk_pwrite_zeroes(exp->blk, request->from + exp->dev_offse= t, + request->len, flags); + + return nbd_send_generic_reply(client, request->handle, ret, + "writing to file failed", errp); + case NBD_CMD_DISC: + /* unreachable, thanks to special case in nbd_co_receive_request()= */ + abort(); + + case NBD_CMD_FLUSH: + ret =3D blk_co_flush(exp->blk); + + return nbd_send_generic_reply(client, request->handle, ret, + "flush failed", errp); + case NBD_CMD_TRIM: + ret =3D blk_co_pdiscard(exp->blk, request->from + exp->dev_offset, + request->len); + + return nbd_send_generic_reply(client, request->handle, ret, + "discard failed", errp); + default: + msg =3D g_strdup_printf("invalid request type (%" PRIu32 ") receiv= ed", + request->type); + ret =3D nbd_send_generic_reply(client, request->handle, -EINVAL, m= sg, + errp); + g_free(msg); + + return ret; + } +} + /* Owns a reference to the NBDClient passed as opaque. */ static coroutine_fn void nbd_trip(void *opaque) { NBDClient *client =3D opaque; - NBDExport *exp =3D client->exp; NBDRequestData *req; NBDRequest request =3D { 0 }; /* GCC thinks it can be used uninitia= lized */ int ret; - int flags; Error *local_err =3D NULL; - char *msg =3D NULL; =20 trace_nbd_trip(); if (client->closing) { @@ -1627,66 +1689,9 @@ static coroutine_fn void nbd_trip(void *opaque) ret =3D nbd_send_generic_reply(client, request.handle, -EINVAL, error_get_pretty(export_err), &local_= err); error_free(export_err); - - goto replied; - } - - switch (request.type) { - case NBD_CMD_READ: - ret =3D nbd_do_cmd_read(client, &request, req->data, &local_err); - - break; - case NBD_CMD_WRITE: - flags =3D 0; - if (request.flags & NBD_CMD_FLAG_FUA) { - flags |=3D BDRV_REQ_FUA; - } - ret =3D blk_pwrite(exp->blk, request.from + exp->dev_offset, - req->data, request.len, flags); - ret =3D nbd_send_generic_reply(client, request.handle, ret, - "writing to file failed", &local_err); - - break; - case NBD_CMD_WRITE_ZEROES: - flags =3D 0; - if (request.flags & NBD_CMD_FLAG_FUA) { - flags |=3D BDRV_REQ_FUA; - } - if (!(request.flags & NBD_CMD_FLAG_NO_HOLE)) { - flags |=3D BDRV_REQ_MAY_UNMAP; - } - ret =3D blk_pwrite_zeroes(exp->blk, request.from + exp->dev_offset, - request.len, flags); - ret =3D nbd_send_generic_reply(client, request.handle, ret, - "writing to file failed", &local_err); - - break; - case NBD_CMD_DISC: - /* unreachable, thanks to special case in nbd_co_receive_request()= */ - abort(); - - case NBD_CMD_FLUSH: - ret =3D blk_co_flush(exp->blk); - ret =3D nbd_send_generic_reply(client, request.handle, ret, - "flush failed", &local_err); - - break; - case NBD_CMD_TRIM: - ret =3D blk_co_pdiscard(exp->blk, request.from + exp->dev_offset, - request.len); - ret =3D nbd_send_generic_reply(client, request.handle, ret, - "discard failed", &local_err); - - break; - default: - msg =3D g_strdup_printf("invalid request type (%" PRIu32 ") receiv= ed", - request.type); - ret =3D nbd_send_generic_reply(client, request.handle, -EINVAL, ms= g, - &local_err); - g_free(msg); + } else { + ret =3D nbd_handle_request(client, &request, req->data, &local_err= ); } - -replied: if (ret < 0) { error_prepend(&local_err, "Failed to send reply: "); goto disconnect; --=20 2.11.1