From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:51386) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TYDak-0001F8-VG for qemu-devel@nongnu.org; Tue, 13 Nov 2012 05:19:41 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TYDah-0004QJ-Si for qemu-devel@nongnu.org; Tue, 13 Nov 2012 05:19:38 -0500 Received: from mail-pb0-f45.google.com ([209.85.160.45]:35917) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TYDah-0004Q9-MP for qemu-devel@nongnu.org; Tue, 13 Nov 2012 05:19:35 -0500 Received: by mail-pb0-f45.google.com with SMTP id mc8so2289356pbc.4 for ; Tue, 13 Nov 2012 02:19:34 -0800 (PST) Sender: Paolo Bonzini From: Paolo Bonzini Date: Tue, 13 Nov 2012 11:19:21 +0100 Message-Id: <1352801961-9868-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH] nbd: fixes to read-only handling List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: serge.hallyn@canonical.com We do not need BLKROSET if the kernel supports setting flags. Also, always do BLKROSET even for a read-write export, otherwise the read-only state remains "sticky" after the invocation of "qemu-nbd -r". Signed-off-by: Paolo Bonzini --- nbd.c | 25 ++++++++++++------------- 1 file modificato, 12 inserzioni(+), 13 rimozioni(-) diff --git a/nbd.c b/nbd.c index cec5a94..97a5914 100644 --- a/nbd.c +++ b/nbd.c @@ -596,24 +596,23 @@ int nbd_init(int fd, int csock, uint32_t flags, off_t size, size_t blocksize) return -serrno; } - if (flags & NBD_FLAG_READ_ONLY) { - int read_only = 1; - TRACE("Setting readonly attribute"); - - if (ioctl(fd, BLKROSET, (unsigned long) &read_only) < 0) { + if (ioctl(fd, NBD_SET_FLAGS, flags) < 0) { + if (errno == ENOTTY) { + int read_only = (flags & NBD_FLAG_READ_ONLY) != 0; + TRACE("Setting readonly attribute"); + + if (ioctl(fd, BLKROSET, (unsigned long) &read_only) < 0) { + int serrno = errno; + LOG("Failed setting read-only attribute"); + return -serrno; + } + } else { int serrno = errno; - LOG("Failed setting read-only attribute"); + LOG("Failed setting flags"); return -serrno; } } - if (ioctl(fd, NBD_SET_FLAGS, flags) < 0 - && errno != ENOTTY) { - int serrno = errno; - LOG("Failed setting flags"); - return -serrno; - } - TRACE("Negotiation ended"); return 0; -- 1.7.12.1