From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:54976) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RXwx7-0002lt-Dt for qemu-devel@nongnu.org; Tue, 06 Dec 2011 10:29:09 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RXwx1-0000YM-1T for qemu-devel@nongnu.org; Tue, 06 Dec 2011 10:29:05 -0500 Received: from mail-ey0-f173.google.com ([209.85.215.173]:55812) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RXwx0-0000FN-IB for qemu-devel@nongnu.org; Tue, 06 Dec 2011 10:28:58 -0500 Received: by mail-ey0-f173.google.com with SMTP id i10so5955043eaa.4 for ; Tue, 06 Dec 2011 07:28:58 -0800 (PST) Sender: Paolo Bonzini From: Paolo Bonzini Date: Tue, 6 Dec 2011 16:27:41 +0100 Message-Id: <1323185272-2610-15-git-send-email-pbonzini@redhat.com> In-Reply-To: <1323185272-2610-1-git-send-email-pbonzini@redhat.com> References: <1323185272-2610-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 14/25] qemu-nbd: simplify nbd_trip List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Use TCP_CORK to remove a violation of encapsulation, that would later require nbd_trip to know too much about an NBD reply. We could also switch to sendmsg (qemu_co_sendv) later, it is even easier once coroutines are in. Signed-off-by: Paolo Bonzini --- nbd.c | 25 ++++++++----------------- 1 files changed, 8 insertions(+), 17 deletions(-) diff --git a/nbd.c b/nbd.c index 2380960..71447cd 100644 --- a/nbd.c +++ b/nbd.c @@ -596,9 +596,9 @@ int nbd_trip(BlockDriverState *bs, int csock, off_t size, if (nbd_receive_request(csock, &request) == -1) return -1; - if (request.len + NBD_REPLY_SIZE > NBD_BUFFER_SIZE) { + if (request.len > NBD_BUFFER_SIZE) { LOG("len (%u) is larger than max len (%u)", - request.len + NBD_REPLY_SIZE, NBD_BUFFER_SIZE); + request.len, NBD_BUFFER_SIZE); errno = EINVAL; return -1; } @@ -629,8 +629,7 @@ int nbd_trip(BlockDriverState *bs, int csock, off_t size, TRACE("Request type is READ"); ret = bdrv_read(bs, (request.from + dev_offset) / 512, - data + NBD_REPLY_SIZE, - request.len / 512); + data, request.len / 512); if (ret < 0) { LOG("reading from file failed"); reply.error = -ret; @@ -638,26 +637,18 @@ int nbd_trip(BlockDriverState *bs, int csock, off_t size, } TRACE("Read %u byte(s)", request.len); - - /* Reply - [ 0 .. 3] magic (NBD_REPLY_MAGIC) - [ 4 .. 7] error (0 == no error) - [ 7 .. 15] handle - */ - - cpu_to_be32w((uint32_t*)data, NBD_REPLY_MAGIC); - cpu_to_be32w((uint32_t*)(data + 4), reply.error); - cpu_to_be64w((uint64_t*)(data + 8), reply.handle); + socket_set_cork(csock, 1); + if (nbd_send_reply(csock, &reply) == -1) + return -1; TRACE("Sending data to client"); - if (write_sync(csock, data, - request.len + NBD_REPLY_SIZE) != - request.len + NBD_REPLY_SIZE) { + if (write_sync(csock, data, request.len) != request.len) { LOG("writing to socket failed"); errno = EINVAL; return -1; } + socket_set_cork(csock, 0); break; case NBD_CMD_WRITE: TRACE("Request type is WRITE"); -- 1.7.7.1