From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:59270) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RWV1o-00035d-1e for qemu-devel@nongnu.org; Fri, 02 Dec 2011 10:27:57 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RWV1j-0002UL-Uq for qemu-devel@nongnu.org; Fri, 02 Dec 2011 10:27:56 -0500 Received: from victor.provo.novell.com ([137.65.250.26]:39611) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RWV1j-0002Tp-O8 for qemu-devel@nongnu.org; Fri, 02 Dec 2011 10:27:51 -0500 From: Chunyan Liu Date: Fri, 2 Dec 2011 23:27:54 +0800 Message-Id: <1322839676-7559-1-git-send-email-cyliu@suse.com> Subject: [Qemu-devel] [PATCH v4 1/3] Update ioctl order in nbd_init() to detect EBUSY List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: stefanha@gmail.com Cc: qemu-devel@nongnu.org Update ioctl(s) in nbd_init() to detect device busy early. Current nbd_init() issues NBD_CLEAR_SOCKET before NBD_SET_SOCKET, if issuing "qemu-nbd -c /dev/nbd0 disk.img" twice, the second time won't detect EBUSY in nbd_init(), but in nbd_client will report EBUSY and do clear socket (the 1st time command will be affacted too because of no socket any more.) No change to previous version. Signed-off-by: Chunyan Liu --- nbd.c | 27 +++++++++------------------ 1 files changed, 9 insertions(+), 18 deletions(-) diff --git a/nbd.c b/nbd.c index e6c931c..4184614 100644 --- a/nbd.c +++ b/nbd.c @@ -348,6 +348,15 @@ int nbd_receive_negotiate(int csock, const char *name, uint32_t *flags, #ifdef __linux__ int nbd_init(int fd, int csock, uint32_t flags, off_t size, size_t blocksize) { + TRACE("Setting NBD socket"); + + if (ioctl(fd, NBD_SET_SOCK, csock) == -1) { + int serrno = errno; + LOG("Failed to set NBD socket"); + errno = serrno; + return -1; + } + TRACE("Setting block size to %lu", (unsigned long)blocksize); if (ioctl(fd, NBD_SET_BLKSIZE, blocksize) == -1) { @@ -386,24 +395,6 @@ int nbd_init(int fd, int csock, uint32_t flags, off_t size, size_t blocksize) return -1; } - TRACE("Clearing NBD socket"); - - if (ioctl(fd, NBD_CLEAR_SOCK) == -1) { - int serrno = errno; - LOG("Failed clearing NBD socket"); - errno = serrno; - return -1; - } - - TRACE("Setting NBD socket"); - - if (ioctl(fd, NBD_SET_SOCK, csock) == -1) { - int serrno = errno; - LOG("Failed to set NBD socket"); - errno = serrno; - return -1; - } - TRACE("Negotiation ended"); return 0; -- 1.7.3.4