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.

Reply via email to