On 10/31/2016 09:37 AM, Paolo Bonzini wrote: > From: Eric Blake > > NBD commit 6d34500b clarified how clients and servers are supposed > to behave before closing a connection. It added NBD_REP_ERR_SHUTDOWN > (for the server to announce it is about to go away during option > haggling, so the client should quit sending NBD_OPT_* other than > NBD_OPT_ABORT) and ESHUTDOWN (for the server to announce it is about > to go away during transmission, so the client should quit sending > NBD_CMD_* other than NBD_CMD_DISC). It also clarified that > NBD_OPT_ABORT gets a reply, while NBD_CMD_DISC does not. > > This patch merely adds the missing reply to NBD_OPT_ABORT and teaches > the client to recognize server errors. Actually teaching the server > to send NBD_REP_ERR_SHUTDOWN or ESHUTDOWN would require knowing that > the server has been requested to shut down soon (maybe we could do > that by installing a SIGINT handler in qemu-nbd, which transitions > from RUNNING to a new state that waits for the client to react, > rather than just out-right quitting - but that's a bigger task for > another day). > > Signed-off-by: Eric Blake > Message-Id: <1476469998-28592-15-git-send-email-eblake@redhat.com> > [Move dummy ESHUTDOWN to include/qemu/osdep.h. - Paolo] > Signed-off-by: Paolo Bonzini > --- > +++ b/include/qemu/osdep.h > @@ -128,6 +128,9 @@ extern int daemon(int, int); > #if !defined(EMEDIUMTYPE) > #define EMEDIUMTYPE 4098 > #endif > +#if !defined(ESHUTDOWN) > +#define ESHUTDOWN 4099 > +#endif Technically, with this code in place... > +++ b/nbd/server.c > @@ -39,6 +39,10 @@ static int system_errno_to_nbd_errno(int err) > case EFBIG: > case ENOSPC: > return NBD_ENOSPC; > +#ifdef ESHUTDOWN > + case ESHUTDOWN: > + return NBD_ESHUTDOWN; > +#endif ...the #ifdef here is pointless. Can be cleaned up in a followup, so should not stop the pull request. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org