From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:50897) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Re72u-0001SH-US for qemu-devel@nongnu.org; Fri, 23 Dec 2011 10:28:33 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Re72q-0006aQ-OC for qemu-devel@nongnu.org; Fri, 23 Dec 2011 10:28:32 -0500 Received: from mail-iy0-f173.google.com ([209.85.210.173]:65051) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Re72q-0006XR-Ab for qemu-devel@nongnu.org; Fri, 23 Dec 2011 10:28:28 -0500 Received: by mail-iy0-f173.google.com with SMTP id j37so17392251iag.4 for ; Fri, 23 Dec 2011 07:28:28 -0800 (PST) Sender: Paolo Bonzini From: Paolo Bonzini Date: Fri, 23 Dec 2011 16:26:14 +0100 Message-Id: <1324653990-20074-11-git-send-email-pbonzini@redhat.com> In-Reply-To: <1324653990-20074-1-git-send-email-pbonzini@redhat.com> References: <1324653990-20074-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 10/26] Update ioctl order in nbd_init() to detect EBUSY List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Chunyan Liu From: Chunyan Liu 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 Signed-off-by: Paolo Bonzini --- nbd.c | 27 +++++++++------------------ 1 files changed, 9 insertions(+), 18 deletions(-) diff --git a/nbd.c b/nbd.c index 7ab1b1f..73fedeb 100644 --- a/nbd.c +++ b/nbd.c @@ -358,6 +358,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) { @@ -396,24 +405,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.7.1