On 8/29/19 10:08 PM, Eric Blake wrote:
Similar to the previous patch in caching size, we want to avoid
calling into the plugin more than once per connection on any of the
flag determination callbacks.
+++ b/server/protocol-handshake.c
@@ -51,87 +51,72 @@ protocol_compute_eflags (struct connection *conn, uint16_t *flags)
{
uint16_t eflags = NBD_FLAG_HAS_FLAGS;
int fl;
+ bool can_write = true;
fl = backend_can_write (backend, conn);
if (fl == -1)
return -1;
if (readonly || !fl) {
eflags |= NBD_FLAG_READ_ONLY;
- conn->readonly = true;
+ can_write = false;
The old code set conn->readonly=false if either the command line -r was
present or if the backend failed .can_write...
+++ b/server/protocol.c
@@ -64,14 +64,19 @@ validate_request (struct connection *conn,
uint16_t cmd, uint16_t flags, uint64_t offset, uint32_t count,
uint32_t *error)
{
+ int r;
+
/* Readonly connection? */
- if (conn->readonly &&
- (cmd == NBD_CMD_WRITE || cmd == NBD_CMD_TRIM ||
- cmd == NBD_CMD_WRITE_ZEROES)) {
- nbdkit_error ("invalid request: %s: write request on readonly
connection",
- name_of_nbd_cmd (cmd));
- *error = EROFS;
- return false;
+ if (cmd == NBD_CMD_WRITE || cmd == NBD_CMD_TRIM ||
+ cmd == NBD_CMD_WRITE_ZEROES) {
+ r = backend_can_write (backend, conn);
...but the new code is only checking if the backend supports .can_write
(if the backend says yes, then this permits a broken client to write in
spite of the -r command line flag). I'll fix that.
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3226
Virtualization:
qemu.org |
libvirt.org