From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:42169) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WsJkv-0004YU-IX for qemu-devel@nongnu.org; Wed, 04 Jun 2014 18:34:07 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WsJkp-0004aF-Jm for qemu-devel@nongnu.org; Wed, 04 Jun 2014 18:34:01 -0400 Received: from mail-wi0-x22e.google.com ([2a00:1450:400c:c05::22e]:37899) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WsJkp-0004a8-C5 for qemu-devel@nongnu.org; Wed, 04 Jun 2014 18:33:55 -0400 Received: by mail-wi0-f174.google.com with SMTP id r20so9403039wiv.7 for ; Wed, 04 Jun 2014 15:33:54 -0700 (PDT) Date: Wed, 4 Jun 2014 23:33:46 +0100 From: Hani Benhabiles Message-ID: <20140604222806.GA7620@Inspiron-3521> References: <1401572382-11667-1-git-send-email-kroosec@gmail.com> <1401572382-11667-4-git-send-email-kroosec@gmail.com> <538DB295.2020508@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <538DB295.2020508@redhat.com> Subject: Re: [Qemu-devel] [PATCH 3/3] nbd: Shutdown socket before closing. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: kwolf@redhat.com, famz@redhat.com, qemu-devel@nongnu.org, stefanha@redhat.com, mreitz@redhat.com On Tue, Jun 03, 2014 at 01:33:41PM +0200, Paolo Bonzini wrote: > Il 31/05/2014 23:39, Hani Benhabiles ha scritto: > >This forces finishing data sending to client before closing the socket like in > >exports listing or replying with NBD_REP_ERR_UNSUP cases. > > > >Signed-off-by: Hani Benhabiles > >--- > > blockdev-nbd.c | 1 + > > qemu-nbd.c | 1 + > > 2 files changed, 2 insertions(+) > > > >diff --git a/blockdev-nbd.c b/blockdev-nbd.c > >index b60b66d..e609f66 100644 > >--- a/blockdev-nbd.c > >+++ b/blockdev-nbd.c > >@@ -28,6 +28,7 @@ static void nbd_accept(void *opaque) > > > > int fd = accept(server_fd, (struct sockaddr *)&addr, &addr_len); > > if (fd >= 0 && !nbd_client_new(NULL, fd, nbd_client_put)) { > >+ shutdown(fd, SHUT_RDWR); > > close(fd); > > } > > } > >diff --git a/qemu-nbd.c b/qemu-nbd.c > >index ba60436..bf42861 100644 > >--- a/qemu-nbd.c > >+++ b/qemu-nbd.c > >@@ -372,6 +372,7 @@ static void nbd_accept(void *opaque) > > if (nbd_client_new(exp, fd, nbd_client_closed)) { > > nb_fds++; > > } else { > >+ shutdown(fd, SHUT_RDWR); > > close(fd); > > } > > } > > > > IIUC, what this does is ensure that the other side gets a FIN before it gets > a RST. Is this correct? Yes. Without shutdown(), this could be reproduced (unreliably) on multiple tries. This is done in nbd_client_close() too, for the same reasons AFAICT.