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 c8969eded2
)
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
This commit is contained in:
parent
382a582c1f
commit
879c264803
23
nbd.c
23
nbd.c
|
@ -399,24 +399,23 @@ int nbd_init(int fd, int csock, uint32_t flags, off_t size, size_t blocksize)
|
||||||
return -serrno;
|
return -serrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & NBD_FLAG_READ_ONLY) {
|
if (ioctl(fd, NBD_SET_FLAGS, flags) < 0) {
|
||||||
int read_only = 1;
|
if (errno == ENOTTY) {
|
||||||
TRACE("Setting readonly attribute");
|
int read_only = (flags & NBD_FLAG_READ_ONLY) != 0;
|
||||||
|
TRACE("Setting readonly attribute");
|
||||||
|
|
||||||
if (ioctl(fd, BLKROSET, (unsigned long) &read_only) < 0) {
|
if (ioctl(fd, BLKROSET, (unsigned long) &read_only) < 0) {
|
||||||
|
int serrno = errno;
|
||||||
|
LOG("Failed setting read-only attribute");
|
||||||
|
return -serrno;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
int serrno = errno;
|
int serrno = errno;
|
||||||
LOG("Failed setting read-only attribute");
|
LOG("Failed setting flags");
|
||||||
return -serrno;
|
return -serrno;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ioctl(fd, NBD_SET_FLAGS, flags) < 0
|
|
||||||
&& errno != ENOTTY) {
|
|
||||||
int serrno = errno;
|
|
||||||
LOG("Failed setting flags");
|
|
||||||
return -serrno;
|
|
||||||
}
|
|
||||||
|
|
||||||
TRACE("Negotiation ended");
|
TRACE("Negotiation ended");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue