diff options
author | 2012-11-13 10:34:17 +0100 | |
---|---|---|
committer | 2012-12-13 15:31:59 -0600 | |
commit | 7a58cd059b0cb3e42484009d9fb00bb29f105fc8 (patch) | |
tree | adcf52c6c60503ec7fd2bc89754095e4d5a35cda | |
parent | m68k: Return semihosting errno values correctly (diff) | |
download | qemu-kvm-7a58cd059b0cb3e42484009d9fb00bb29f105fc8.tar.gz qemu-kvm-7a58cd059b0cb3e42484009d9fb00bb29f105fc8.tar.bz2 qemu-kvm-7a58cd059b0cb3e42484009d9fb00bb29f105fc8.zip |
nbd: fixes to read-only handling
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 <pbonzini@redhat.com>
(cherry picked from commit c8969eded252058e90e91f12f75f32aceae46ec9)
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
(cherry picked from commit 879c2648038863c30587411f90b142de05e12a3b)
-rw-r--r-- | nbd.c | 25 |
1 files changed, 12 insertions, 13 deletions
@@ -399,24 +399,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; |