From nobody Sun May 19 17:22:32 2024 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 1520535174438981.6676476370886; Thu, 8 Mar 2018 10:52:54 -0800 (PST) Received: from localhost ([::1]:40960 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eu0er-0008Vi-MY for importer@patchew.org; Thu, 08 Mar 2018 13:52:53 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52550) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eu0Yu-0004YQ-Q5 for qemu-devel@nongnu.org; Thu, 08 Mar 2018 13:46:45 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eu0Yp-0003JE-So for qemu-devel@nongnu.org; Thu, 08 Mar 2018 13:46:44 -0500 Received: from relay.sw.ru ([185.231.240.75]:35506) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eu0Yp-0003Hz-KC; 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 1eu0Ym-0003rE-Lm; Thu, 08 Mar 2018 21:46:36 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Thu, 8 Mar 2018 21:46:32 +0300 Message-Id: <20180308184636.178534-2-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 1/5] nbd/server: move nbd_co_send_structured_error up 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" To be reused in nbd_co_send_sparse_read() in the following patch. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Eric Blake --- nbd/server.c | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/nbd/server.c b/nbd/server.c index 4990a5826e..c406b0656d 100644 --- a/nbd/server.c +++ b/nbd/server.c @@ -1341,6 +1341,30 @@ static int coroutine_fn nbd_co_send_structured_read(= NBDClient *client, return nbd_co_send_iov(client, iov, 2, errp); } =20 +static int coroutine_fn nbd_co_send_structured_error(NBDClient *client, + uint64_t handle, + uint32_t error, + const char *msg, + Error **errp) +{ + NBDStructuredError chunk; + int nbd_err =3D system_errno_to_nbd_errno(error); + struct iovec iov[] =3D { + {.iov_base =3D &chunk, .iov_len =3D sizeof(chunk)}, + {.iov_base =3D (char *)msg, .iov_len =3D msg ? strlen(msg) : 0}, + }; + + assert(nbd_err); + trace_nbd_co_send_structured_error(handle, nbd_err, + nbd_err_lookup(nbd_err), msg ? msg = : ""); + set_be_chunk(&chunk.h, NBD_REPLY_FLAG_DONE, NBD_REPLY_TYPE_ERROR, hand= le, + sizeof(chunk) - sizeof(chunk.h) + iov[1].iov_len); + stl_be_p(&chunk.error, nbd_err); + stw_be_p(&chunk.message_length, iov[1].iov_len); + + return nbd_co_send_iov(client, iov, 1 + !!iov[1].iov_len, errp); +} + static int coroutine_fn nbd_co_send_sparse_read(NBDClient *client, uint64_t handle, uint64_t offset, @@ -1400,30 +1424,6 @@ static int coroutine_fn nbd_co_send_sparse_read(NBDC= lient *client, return ret; } =20 -static int coroutine_fn nbd_co_send_structured_error(NBDClient *client, - uint64_t handle, - uint32_t error, - const char *msg, - Error **errp) -{ - NBDStructuredError chunk; - int nbd_err =3D system_errno_to_nbd_errno(error); - struct iovec iov[] =3D { - {.iov_base =3D &chunk, .iov_len =3D sizeof(chunk)}, - {.iov_base =3D (char *)msg, .iov_len =3D msg ? strlen(msg) : 0}, - }; - - assert(nbd_err); - trace_nbd_co_send_structured_error(handle, nbd_err, - nbd_err_lookup(nbd_err), msg ? msg = : ""); - set_be_chunk(&chunk.h, NBD_REPLY_FLAG_DONE, NBD_REPLY_TYPE_ERROR, hand= le, - sizeof(chunk) - sizeof(chunk.h) + iov[1].iov_len); - stl_be_p(&chunk.error, nbd_err); - stw_be_p(&chunk.message_length, iov[1].iov_len); - - return nbd_co_send_iov(client, iov, 1 + !!iov[1].iov_len, errp); -} - /* nbd_co_receive_request * Collect a client request. Return 0 if request looks valid, -EIO to drop * connection right away, and any other negative value to report an error = to --=20 2.11.1 From nobody Sun May 19 17:22:32 2024 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 1520535030607206.60055013375256; Thu, 8 Mar 2018 10:50:30 -0800 (PST) Received: from localhost ([::1]:40947 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eu0cU-0006dM-IH for importer@patchew.org; Thu, 08 Mar 2018 13:50:26 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52546) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eu0Yu-0004YO-Pe 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-0003J1-SG for qemu-devel@nongnu.org; Thu, 08 Mar 2018 13:46:44 -0500 Received: from relay.sw.ru ([185.231.240.75]:35516) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eu0Yp-0003I0-KE; 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 1eu0Ym-0003rE-SH; Thu, 08 Mar 2018 21:46:36 +0300 From: Vladimir Sementsov-Ogievskiy To: qemu-devel@nongnu.org, qemu-block@nongnu.org Date: Thu, 8 Mar 2018 21:46:33 +0300 Message-Id: <20180308184636.178534-3-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 v2 2/5] nbd/server: fix sparse read 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" In case of io error in nbd_co_send_sparse_read we should not "goto reply:", as it is fatal error and common behavior is disconnect in this case. We should not try to send client an error reply, representing channel-io error on previous try to send a reply. Fix this by handle block-status error in nbd_co_send_sparse_read, so nbd_co_send_sparse_read fails only on io error. Then just skip common "reply:" code path in nbd_trip. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Eric Blake data, request= .len, &local_err); if (ret < 0) { - goto reply; + goto replied; } goto done; } @@ -1664,6 +1673,8 @@ reply: req->data, reply_data_len, &local_e= rr); } g_free(msg); + +replied: if (ret < 0) { error_prepend(&local_err, "Failed to send reply: "); goto disconnect; --=20 2.11.1 From nobody Sun May 19 17:22:32 2024 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 1520534908793548.0867771275718; Thu, 8 Mar 2018 10:48:28 -0800 (PST) Received: from localhost ([::1]:40941 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eu0aV-0005NW-8j for importer@patchew.org; Thu, 08 Mar 2018 13:48:23 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52549) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eu0Yu-0004YP-Pf for qemu-devel@nongnu.org; Thu, 08 Mar 2018 13:46:45 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eu0Yp-0003J6-S6 for qemu-devel@nongnu.org; Thu, 08 Mar 2018 13:46:44 -0500 Received: from relay.sw.ru ([185.231.240.75]:35526) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eu0Yp-0003I3-KG; 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-0u; 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:34 +0300 Message-Id: <20180308184636.178534-4-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 3/5] nbd/server: fix: check client->closing before reply sending 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" Signed-off-by: Vladimir Sementsov-Ogievskiy --- It's like an RFC. I'm not sure, but this place looks like a bug. Shouldn't we chack client-closing even before nbd_client_receive_next_request() call? nbd/server.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nbd/server.c b/nbd/server.c index e0de431e10..97b45a21fa 100644 --- a/nbd/server.c +++ b/nbd/server.c @@ -1547,10 +1547,6 @@ static coroutine_fn void nbd_trip(void *opaque) goto disconnect; } =20 - if (ret < 0) { - goto reply; - } - if (client->closing) { /* * The client may be closed when we are blocked in @@ -1559,6 +1555,10 @@ static coroutine_fn void nbd_trip(void *opaque) goto done; } =20 + if (ret < 0) { + goto reply; + } + switch (request.type) { case NBD_CMD_READ: /* XXX: NBD Protocol only documents use of FUA with WRITE */ --=20 2.11.1 From nobody Sun May 19 17:22:32 2024 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 1520535173399195.62409484766044; Thu, 8 Mar 2018 10:52:53 -0800 (PST) Received: from localhost ([::1]:40959 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eu0eq-0008V0-IQ for importer@patchew.org; Thu, 08 Mar 2018 13:52:52 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52547) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eu0Yu-0004YN-Pd 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-0003JR-Vg for qemu-devel@nongnu.org; Thu, 08 Mar 2018 13:46:44 -0500 Received: from relay.sw.ru ([185.231.240.75]:35524) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eu0Yp-0003I4-K3; 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-7y; 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:35 +0300 Message-Id: <20180308184636.178534-5-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 4/5] nbd/server: refactor nbd_trip: cmd_read and generic reply 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" nbd_trip has difficult logic of sending reply: it tries to use one code path for all replies. It is ok for simple replies, but is not comfortable for structured replies. Also, two types of error (and corresponding message in local_err) - fatal (leading to disconnect) and not-fatal (just to be sent to the client) are difficult to follow. To make things a bit clearer, the following is done: - split CMD_READ logic to separate function. It is the most difficult command for now, and it is definitely cramped inside nbd_trip. Also, it is difficult to follow CMD_READ logic, shared between "case NBD_CMD_READ" and "if"s under "reply:" label. - create separate helper function nbd_send_generic_reply() and use it both in new nbd_do_cmd_read and for other command in nbd_trip instead of common code-path under "reply:" label in nbd_trip. The helper supports error message, so logic with local_err in nbd_trip is simplified. Signed-off-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Eric Blake --- nbd/server.c | 164 ++++++++++++++++++++++++++++++++-----------------------= ---- 1 file changed, 88 insertions(+), 76 deletions(-) diff --git a/nbd/server.c b/nbd/server.c index 97b45a21fa..a2f5f73d52 100644 --- a/nbd/server.c +++ b/nbd/server.c @@ -1520,6 +1520,70 @@ static int nbd_co_receive_request(NBDRequestData *re= q, NBDRequest *request, return 0; } =20 +/* Send simple reply without a payload or structured error + * @error_msg is ignored if @ret >=3D 0 */ +static coroutine_fn int nbd_send_generic_reply(NBDClient *client, + uint64_t handle, + int ret, + const char *error_msg, + Error **errp) +{ + if (client->structured_reply && ret < 0) { + return nbd_co_send_structured_error(client, handle, -ret, error_ms= g, + errp); + } else { + return nbd_co_send_simple_reply(client, handle, ret < 0 ? -ret : 0, + NULL, 0, errp); + } +} + +/* Handle NBD_CMD_READ request. + * Return -errno if sending fails. Other errors are reported directly to t= he + * client as an error reply. */ +static coroutine_fn int nbd_do_cmd_read(NBDClient *client, NBDRequest *req= uest, + uint8_t *data, Error **errp) +{ + int ret; + NBDExport *exp =3D client->exp; + + assert(request->type =3D=3D NBD_CMD_READ); + + /* XXX: NBD Protocol only documents use of FUA with WRITE */ + if (request->flags & NBD_CMD_FLAG_FUA) { + ret =3D blk_co_flush(exp->blk); + if (ret < 0) { + return nbd_send_generic_reply(client, request->handle, ret, + "flush failed", errp); + } + } + + if (client->structured_reply && !(request->flags & NBD_CMD_FLAG_DF) && + request->len) { + return nbd_co_send_sparse_read(client, request->handle, request->f= rom, + data, request->len, errp); + } + + ret =3D blk_pread(exp->blk, request->from + exp->dev_offset, data, + request->len); + if (ret < 0) { + return nbd_send_generic_reply(client, request->handle, ret, + "reading from file failed", errp); + } + + if (client->structured_reply) { + if (request->len) { + return nbd_co_send_structured_read(client, request->handle, + request->from, data, + request->len, true, errp); + } else { + return nbd_co_send_structured_done(client, request->handle, er= rp); + } + } else { + return nbd_co_send_simple_reply(client, request->handle, 0, + data, request->len, errp); + } +} + /* Owns a reference to the NBDClient passed as opaque. */ static coroutine_fn void nbd_trip(void *opaque) { @@ -1529,7 +1593,6 @@ static coroutine_fn void nbd_trip(void *opaque) NBDRequest request =3D { 0 }; /* GCC thinks it can be used uninitia= lized */ int ret; int flags; - int reply_data_len =3D 0; Error *local_err =3D NULL; char *msg =3D NULL; =20 @@ -1556,39 +1619,21 @@ static coroutine_fn void nbd_trip(void *opaque) } =20 if (ret < 0) { - goto reply; + /* It's not a -EIO, so, accordingly to nbd_co_receive_request() + * semantics, we should return the error to the client. */ + Error *export_err =3D local_err; + + local_err =3D NULL; + ret =3D nbd_send_generic_reply(client, request.handle, -EINVAL, + error_get_pretty(export_err), &local_= err); + error_free(export_err); + + goto replied; } =20 switch (request.type) { case NBD_CMD_READ: - /* XXX: NBD Protocol only documents use of FUA with WRITE */ - if (request.flags & NBD_CMD_FLAG_FUA) { - ret =3D blk_co_flush(exp->blk); - if (ret < 0) { - error_setg_errno(&local_err, -ret, "flush failed"); - break; - } - } - - if (client->structured_reply && !(request.flags & NBD_CMD_FLAG_DF)= && - request.len) { - ret =3D nbd_co_send_sparse_read(req->client, request.handle, - request.from, req->data, request= .len, - &local_err); - if (ret < 0) { - goto replied; - } - goto done; - } - - ret =3D blk_pread(exp->blk, request.from + exp->dev_offset, - req->data, request.len); - if (ret < 0) { - error_setg_errno(&local_err, -ret, "reading from file failed"); - break; - } - - reply_data_len =3D request.len; + ret =3D nbd_do_cmd_read(client, &request, req->data, &local_err); =20 break; case NBD_CMD_WRITE: @@ -1598,9 +1643,8 @@ static coroutine_fn void nbd_trip(void *opaque) } ret =3D blk_pwrite(exp->blk, request.from + exp->dev_offset, req->data, request.len, flags); - if (ret < 0) { - error_setg_errno(&local_err, -ret, "writing to file failed"); - } + ret =3D nbd_send_generic_reply(client, request.handle, ret, + "writing to file failed", &local_err); =20 break; case NBD_CMD_WRITE_ZEROES: @@ -1613,9 +1657,8 @@ static coroutine_fn void nbd_trip(void *opaque) } ret =3D blk_pwrite_zeroes(exp->blk, request.from + exp->dev_offset, request.len, flags); - if (ret < 0) { - error_setg_errno(&local_err, -ret, "writing to file failed"); - } + ret =3D nbd_send_generic_reply(client, request.handle, ret, + "writing to file failed", &local_err); =20 break; case NBD_CMD_DISC: @@ -1624,56 +1667,25 @@ static coroutine_fn void nbd_trip(void *opaque) =20 case NBD_CMD_FLUSH: ret =3D blk_co_flush(exp->blk); - if (ret < 0) { - error_setg_errno(&local_err, -ret, "flush failed"); - } + ret =3D nbd_send_generic_reply(client, request.handle, ret, + "flush failed", &local_err); =20 break; case NBD_CMD_TRIM: ret =3D blk_co_pdiscard(exp->blk, request.from + exp->dev_offset, request.len); - if (ret < 0) { - error_setg_errno(&local_err, -ret, "discard failed"); - } + ret =3D nbd_send_generic_reply(client, request.handle, ret, + "discard failed", &local_err); =20 break; default: - error_setg(&local_err, "invalid request type (%" PRIu32 ") receive= d", - request.type); - ret =3D -EINVAL; - } - -reply: - if (local_err) { - /* If we get here, local_err was not a fatal error, and should be = sent - * to the client. */ - assert(ret < 0); - msg =3D g_strdup(error_get_pretty(local_err)); - error_report_err(local_err); - local_err =3D NULL; + 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); } =20 - if (client->structured_reply && - (ret < 0 || request.type =3D=3D NBD_CMD_READ)) { - if (ret < 0) { - ret =3D nbd_co_send_structured_error(req->client, request.hand= le, - -ret, msg, &local_err); - } else if (reply_data_len) { - ret =3D nbd_co_send_structured_read(req->client, request.handl= e, - request.from, req->data, - reply_data_len, true, - &local_err); - } else { - ret =3D nbd_co_send_structured_done(req->client, request.handl= e, - &local_err); - } - } else { - ret =3D nbd_co_send_simple_reply(req->client, request.handle, - ret < 0 ? -ret : 0, - req->data, reply_data_len, &local_e= rr); - } - g_free(msg); - replied: if (ret < 0) { error_prepend(&local_err, "Failed to send reply: "); --=20 2.11.1 From nobody Sun May 19 17:22:32 2024 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