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 <h...@linux.com> > >--- > > 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.