All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PULL 0/5] NBD changes for 2014-06-27
@ 2014-06-27 14:11 Paolo Bonzini
  2014-06-27 14:11 ` [Qemu-devel] [PULL 1/5] nbd: Don't export a block device with no medium Paolo Bonzini
                   ` (5 more replies)
  0 siblings, 6 replies; 9+ messages in thread
From: Paolo Bonzini @ 2014-06-27 14:11 UTC (permalink / raw)
  To: qemu-devel

The following changes since commit d4cba13bdf251baeedb36b87c1e9f6766773e380:

  tcg/ppc: Fix failure in tcg_out_mem_long (2014-06-27 13:23:41 +0100)

are available in the git repository at:

  git://github.com/bonzini/qemu.git nbd-next

for you to fetch changes up to 34bf23a5e0e878e3cd650c47d670b881f9f61475:

  nbd: Handle NBD_OPT_LIST option. (2014-06-27 16:06:48 +0200)

Three bugfixes, and a new feature.
----------------------------------------------------------------
Hani Benhabiles (5):
      nbd: Don't export a block device with no medium.
      nbd: Don't validate from and len in NBD_CMD_DISC.
      nbd: Shutdown socket before closing.
      nbd: Handle fixed new-style clients.
      nbd: Handle NBD_OPT_LIST option.

 blockdev-nbd.c      |   5 ++
 include/block/nbd.h |  12 +++
 nbd.c               | 217 ++++++++++++++++++++++++++++++++++++++++------------
 qemu-nbd.c          |   1 +
 4 files changed, 186 insertions(+), 49 deletions(-)
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Qemu-devel] [PULL 1/5] nbd: Don't export a block device with no medium.
  2014-06-27 14:11 [Qemu-devel] [PULL 0/5] NBD changes for 2014-06-27 Paolo Bonzini
@ 2014-06-27 14:11 ` Paolo Bonzini
  2014-06-27 14:11 ` [Qemu-devel] [PULL 2/5] nbd: Don't validate from and len in NBD_CMD_DISC Paolo Bonzini
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Paolo Bonzini @ 2014-06-27 14:11 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-stable, Hani Benhabiles

From: Hani Benhabiles <kroosec@gmail.com>

The device is exported with erroneous values and can't be read.

Before the patch:
$ sudo nbd-client localhost -p 10809 /dev/nbd0 -name floppy0
Negotiation: ..size = 17592186044415MB
bs=1024, sz=18446744073709547520 bytes

$ sudo mount /dev/nbd0 /mnt/tmp/
mount: block device /dev/nbd0 is write-protected, mounting read-only
mount: /dev/nbd0: can't read superblock

After the patch:
(qemu) nbd_server_add ide0-hd0
(qemu) nbd_server_add floppy0
Device 'floppy0' has no medium

Signed-off-by: Hani Benhabiles <kroosec@gmail.com>
Cc: qemu-stable@nongnu.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 blockdev-nbd.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/blockdev-nbd.c b/blockdev-nbd.c
index b60b66d..18dc528 100644
--- a/blockdev-nbd.c
+++ b/blockdev-nbd.c
@@ -91,6 +91,10 @@ void qmp_nbd_server_add(const char *device, bool has_writable, bool writable,
         error_set(errp, QERR_DEVICE_NOT_FOUND, device);
         return;
     }
+    if (!bdrv_is_inserted(bs)) {
+        error_set(errp, QERR_DEVICE_HAS_NO_MEDIUM, device);
+        return;
+    }
 
     if (!has_writable) {
         writable = false;
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [Qemu-devel] [PULL 2/5] nbd: Don't validate from and len in NBD_CMD_DISC.
  2014-06-27 14:11 [Qemu-devel] [PULL 0/5] NBD changes for 2014-06-27 Paolo Bonzini
  2014-06-27 14:11 ` [Qemu-devel] [PULL 1/5] nbd: Don't export a block device with no medium Paolo Bonzini
@ 2014-06-27 14:11 ` Paolo Bonzini
  2014-06-27 14:11 ` [Qemu-devel] [PULL 3/5] nbd: Shutdown socket before closing Paolo Bonzini
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Paolo Bonzini @ 2014-06-27 14:11 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-stable, Hani Benhabiles

From: Hani Benhabiles <kroosec@gmail.com>

These values aren't used in this case.

Currently, the from field in the request sent by the nbd kernel module leading
to a false error message when ending the connection with the client.

$ qemu-nbd some.img -v
// After nbd-client -d /dev/nbd0
nbd.c:nbd_trip():L1031: From: 18446744073709551104, Len: 0, Size: 20971520,
Offset: 0
nbd.c:nbd_trip():L1032: requested operation past EOF--bad client?
nbd.c:nbd_receive_request():L638: read failed

Signed-off-by: Hani Benhabiles <kroosec@gmail.com>
Cc: qemu-stable@nongnu.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 nbd.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/nbd.c b/nbd.c
index e0d032c..8d8bc40 100644
--- a/nbd.c
+++ b/nbd.c
@@ -1001,6 +1001,7 @@ static void nbd_trip(void *opaque)
     struct nbd_request request;
     struct nbd_reply reply;
     ssize_t ret;
+    uint32_t command;
 
     TRACE("Reading request.");
     if (client->closing) {
@@ -1023,8 +1024,8 @@ static void nbd_trip(void *opaque)
         reply.error = -ret;
         goto error_reply;
     }
-
-    if ((request.from + request.len) > exp->size) {
+    command = request.type & NBD_CMD_MASK_COMMAND;
+    if (command != NBD_CMD_DISC && (request.from + request.len) > exp->size) {
             LOG("From: %" PRIu64 ", Len: %u, Size: %" PRIu64
             ", Offset: %" PRIu64 "\n",
                     request.from, request.len,
@@ -1033,7 +1034,7 @@ static void nbd_trip(void *opaque)
         goto invalid_request;
     }
 
-    switch (request.type & NBD_CMD_MASK_COMMAND) {
+    switch (command) {
     case NBD_CMD_READ:
         TRACE("Request type is READ");
 
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [Qemu-devel] [PULL 3/5] nbd: Shutdown socket before closing.
  2014-06-27 14:11 [Qemu-devel] [PULL 0/5] NBD changes for 2014-06-27 Paolo Bonzini
  2014-06-27 14:11 ` [Qemu-devel] [PULL 1/5] nbd: Don't export a block device with no medium Paolo Bonzini
  2014-06-27 14:11 ` [Qemu-devel] [PULL 2/5] nbd: Don't validate from and len in NBD_CMD_DISC Paolo Bonzini
@ 2014-06-27 14:11 ` Paolo Bonzini
  2014-06-27 14:11 ` [Qemu-devel] [PULL 4/5] nbd: Handle fixed new-style clients Paolo Bonzini
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Paolo Bonzini @ 2014-06-27 14:11 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-stable, Hani Benhabiles

From: Hani Benhabiles <kroosec@gmail.com>

This forces finishing data sending to client before closing the socket like in
exports listing or replying with NBD_REP_ERR_UNSUP cases.

Signed-off-by: Hani Benhabiles <kroosec@gmail.com>
Cc: qemu-stable@nongnu.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 blockdev-nbd.c | 1 +
 qemu-nbd.c     | 1 +
 2 files changed, 2 insertions(+)

diff --git a/blockdev-nbd.c b/blockdev-nbd.c
index 18dc528..69adf26 100644
--- a/blockdev-nbd.c
+++ b/blockdev-nbd.c
@@ -28,6 +28,7 @@ static void nbd_accept(void *opaque)
 
     int fd = accept(server_fd, (struct sockaddr *)&addr, &addr_len);
     if (fd >= 0 && !nbd_client_new(NULL, fd, nbd_client_put)) {
+        shutdown(fd, SHUT_RDWR);
         close(fd);
     }
 }
diff --git a/qemu-nbd.c b/qemu-nbd.c
index ba60436..bf42861 100644
--- a/qemu-nbd.c
+++ b/qemu-nbd.c
@@ -372,6 +372,7 @@ static void nbd_accept(void *opaque)
     if (nbd_client_new(exp, fd, nbd_client_closed)) {
         nb_fds++;
     } else {
+        shutdown(fd, SHUT_RDWR);
         close(fd);
     }
 }
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [Qemu-devel] [PULL 4/5] nbd: Handle fixed new-style clients.
  2014-06-27 14:11 [Qemu-devel] [PULL 0/5] NBD changes for 2014-06-27 Paolo Bonzini
                   ` (2 preceding siblings ...)
  2014-06-27 14:11 ` [Qemu-devel] [PULL 3/5] nbd: Shutdown socket before closing Paolo Bonzini
@ 2014-06-27 14:11 ` Paolo Bonzini
  2014-06-27 14:11 ` [Qemu-devel] [PULL 5/5] nbd: Handle NBD_OPT_LIST option Paolo Bonzini
  2014-06-29 11:45 ` [Qemu-devel] [PULL 0/5] NBD changes for 2014-06-27 Peter Maydell
  5 siblings, 0 replies; 9+ messages in thread
From: Paolo Bonzini @ 2014-06-27 14:11 UTC (permalink / raw)
  To: qemu-devel; +Cc: Hani Benhabiles

From: Hani Benhabiles <kroosec@gmail.com>

When this flag is set, the server tells the client that it can send another
option if the server received a request with an option that it doesn't
understand instead of directly closing the connection.

Also add link to the most up-to-date documentation.

Signed-off-by: Hani Benhabiles <kroosec@gmail.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 include/block/nbd.h |   9 ++++
 nbd.c               | 151 +++++++++++++++++++++++++++++++++++-----------------
 2 files changed, 111 insertions(+), 49 deletions(-)

diff --git a/include/block/nbd.h b/include/block/nbd.h
index 79502a0..561b70c 100644
--- a/include/block/nbd.h
+++ b/include/block/nbd.h
@@ -45,6 +45,15 @@ struct nbd_reply {
 #define NBD_FLAG_ROTATIONAL     (1 << 4)        /* Use elevator algorithm - rotational media */
 #define NBD_FLAG_SEND_TRIM      (1 << 5)        /* Send TRIM (discard) */
 
+/* New-style global flags. */
+#define NBD_FLAG_FIXED_NEWSTYLE     (1 << 0)    /* Fixed newstyle protocol. */
+
+/* New-style client flags. */
+#define NBD_FLAG_C_FIXED_NEWSTYLE   (1 << 0)    /* Fixed newstyle protocol. */
+
+/* Reply types. */
+#define NBD_REP_ERR_UNSUP       ((1 << 31) | 1) /* Unknown option. */
+
 #define NBD_CMD_MASK_COMMAND	0x0000ffff
 #define NBD_CMD_FLAG_FUA	(1 << 16)
 
diff --git a/nbd.c b/nbd.c
index 8d8bc40..a579e01 100644
--- a/nbd.c
+++ b/nbd.c
@@ -56,7 +56,11 @@
             __FILE__, __FUNCTION__, __LINE__, ## __VA_ARGS__); \
 } while(0)
 
-/* This is all part of the "official" NBD API */
+/* This is all part of the "official" NBD API.
+ *
+ * The most up-to-date documentation is available at:
+ * https://github.com/yoe/nbd/blob/master/doc/proto.txt
+ */
 
 #define NBD_REQUEST_SIZE        (4 + 4 + 8 + 8 + 4)
 #define NBD_REPLY_SIZE          (4 + 4 + 8)
@@ -64,6 +68,7 @@
 #define NBD_REPLY_MAGIC         0x67446698
 #define NBD_OPTS_MAGIC          0x49484156454F5054LL
 #define NBD_CLIENT_MAGIC        0x0000420281861253LL
+#define NBD_REP_MAGIC           0x3e889045565a9LL
 
 #define NBD_SET_SOCK            _IO(0xab, 0)
 #define NBD_SET_BLKSIZE         _IO(0xab, 1)
@@ -77,7 +82,8 @@
 #define NBD_SET_TIMEOUT         _IO(0xab, 9)
 #define NBD_SET_FLAGS           _IO(0xab, 10)
 
-#define NBD_OPT_EXPORT_NAME     (1 << 0)
+#define NBD_OPT_EXPORT_NAME     (1)
+#define NBD_OPT_ABORT           (2)
 
 /* Definitions for opaque data types */
 
@@ -215,59 +221,43 @@ static ssize_t write_sync(int fd, void *buffer, size_t size)
 
 */
 
-static int nbd_receive_options(NBDClient *client)
+static int nbd_send_rep(int csock, uint32_t type, uint32_t opt)
 {
-    int csock = client->sock;
-    char name[256];
-    uint32_t tmp, length;
     uint64_t magic;
-    int rc;
-
-    /* Client sends:
-        [ 0 ..   3]   reserved (0)
-        [ 4 ..  11]   NBD_OPTS_MAGIC
-        [12 ..  15]   NBD_OPT_EXPORT_NAME
-        [16 ..  19]   length
-        [20 ..  xx]   export name (length bytes)
-     */
+    uint32_t len;
 
-    rc = -EINVAL;
-    if (read_sync(csock, &tmp, sizeof(tmp)) != sizeof(tmp)) {
-        LOG("read failed");
-        goto fail;
+    magic = cpu_to_be64(NBD_REP_MAGIC);
+    if (write_sync(csock, &magic, sizeof(magic)) != sizeof(magic)) {
+        LOG("write failed (rep magic)");
+        return -EINVAL;
     }
-    TRACE("Checking reserved");
-    if (tmp != 0) {
-        LOG("Bad reserved received");
-        goto fail;
+    opt = cpu_to_be32(opt);
+    if (write_sync(csock, &opt, sizeof(opt)) != sizeof(opt)) {
+        LOG("write failed (rep opt)");
+        return -EINVAL;
     }
-
-    if (read_sync(csock, &magic, sizeof(magic)) != sizeof(magic)) {
-        LOG("read failed");
-        goto fail;
+    type = cpu_to_be32(type);
+    if (write_sync(csock, &type, sizeof(type)) != sizeof(type)) {
+        LOG("write failed (rep type)");
+        return -EINVAL;
     }
-    TRACE("Checking reserved");
-    if (magic != be64_to_cpu(NBD_OPTS_MAGIC)) {
-        LOG("Bad magic received");
-        goto fail;
+    len = cpu_to_be32(0);
+    if (write_sync(csock, &len, sizeof(len)) != sizeof(len)) {
+        LOG("write failed (rep data length)");
+        return -EINVAL;
     }
+    return 0;
+}
 
-    if (read_sync(csock, &tmp, sizeof(tmp)) != sizeof(tmp)) {
-        LOG("read failed");
-        goto fail;
-    }
-    TRACE("Checking option");
-    if (tmp != be32_to_cpu(NBD_OPT_EXPORT_NAME)) {
-        LOG("Bad option received");
-        goto fail;
-    }
+static int nbd_handle_export_name(NBDClient *client, uint32_t length)
+{
+    int rc = -EINVAL, csock = client->sock;
+    char name[256];
 
-    if (read_sync(csock, &length, sizeof(length)) != sizeof(length)) {
-        LOG("read failed");
-        goto fail;
-    }
+    /* Client sends:
+        [20 ..  xx]   export name (length bytes)
+     */
     TRACE("Checking length");
-    length = be32_to_cpu(length);
     if (length > 255) {
         LOG("Bad length received");
         goto fail;
@@ -286,13 +276,75 @@ static int nbd_receive_options(NBDClient *client)
 
     QTAILQ_INSERT_TAIL(&client->exp->clients, client, next);
     nbd_export_get(client->exp);
-
-    TRACE("Option negotiation succeeded.");
     rc = 0;
 fail:
     return rc;
 }
 
+static int nbd_receive_options(NBDClient *client)
+{
+    while (1) {
+        int csock = client->sock;
+        uint32_t tmp, length;
+        uint64_t magic;
+
+        /* Client sends:
+            [ 0 ..   3]   client flags
+            [ 4 ..  11]   NBD_OPTS_MAGIC
+            [12 ..  15]   NBD option
+            [16 ..  19]   length
+            ...           Rest of request
+        */
+
+        if (read_sync(csock, &tmp, sizeof(tmp)) != sizeof(tmp)) {
+            LOG("read failed");
+            return -EINVAL;
+        }
+        TRACE("Checking client flags");
+        tmp = be32_to_cpu(tmp);
+        if (tmp != 0 && tmp != NBD_FLAG_C_FIXED_NEWSTYLE) {
+            LOG("Bad client flags received");
+            return -EINVAL;
+        }
+
+        if (read_sync(csock, &magic, sizeof(magic)) != sizeof(magic)) {
+            LOG("read failed");
+            return -EINVAL;
+        }
+        TRACE("Checking opts magic");
+        if (magic != be64_to_cpu(NBD_OPTS_MAGIC)) {
+            LOG("Bad magic received");
+            return -EINVAL;
+        }
+
+        if (read_sync(csock, &tmp, sizeof(tmp)) != sizeof(tmp)) {
+            LOG("read failed");
+            return -EINVAL;
+        }
+
+        if (read_sync(csock, &length, sizeof(length)) != sizeof(length)) {
+            LOG("read failed");
+            return -EINVAL;
+        }
+        length = be32_to_cpu(length);
+
+        TRACE("Checking option");
+        switch (be32_to_cpu(tmp)) {
+        case NBD_OPT_ABORT:
+            return -EINVAL;
+
+        case NBD_OPT_EXPORT_NAME:
+            return nbd_handle_export_name(client, length);
+
+        default:
+            tmp = be32_to_cpu(tmp);
+            LOG("Unsupported option 0x%x", tmp);
+            nbd_send_rep(client->sock, NBD_REP_ERR_UNSUP, tmp);
+            return -EINVAL;
+        }
+    }
+}
+
 static int nbd_send_negotiate(NBDClient *client)
 {
     int csock = client->sock;
@@ -333,6 +385,7 @@ static int nbd_send_negotiate(NBDClient *client)
         cpu_to_be16w((uint16_t*)(buf + 26), client->exp->nbdflags | myflags);
     } else {
         cpu_to_be64w((uint64_t*)(buf + 8), NBD_OPTS_MAGIC);
+        cpu_to_be16w((uint16_t *)(buf + 16), NBD_FLAG_FIXED_NEWSTYLE);
     }
 
     if (client->exp) {
@@ -346,7 +399,7 @@ static int nbd_send_negotiate(NBDClient *client)
             goto fail;
         }
         rc = nbd_receive_options(client);
-        if (rc < 0) {
+        if (rc != 0) {
             LOG("option negotiation failed");
             goto fail;
         }
@@ -1174,7 +1227,7 @@ NBDClient *nbd_client_new(NBDExport *exp, int csock,
     client->refcount = 1;
     client->exp = exp;
     client->sock = csock;
-    if (nbd_send_negotiate(client) < 0) {
+    if (nbd_send_negotiate(client)) {
         g_free(client);
         return NULL;
     }
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [Qemu-devel] [PULL 5/5] nbd: Handle NBD_OPT_LIST option.
  2014-06-27 14:11 [Qemu-devel] [PULL 0/5] NBD changes for 2014-06-27 Paolo Bonzini
                   ` (3 preceding siblings ...)
  2014-06-27 14:11 ` [Qemu-devel] [PULL 4/5] nbd: Handle fixed new-style clients Paolo Bonzini
@ 2014-06-27 14:11 ` Paolo Bonzini
  2014-06-29 11:45 ` [Qemu-devel] [PULL 0/5] NBD changes for 2014-06-27 Peter Maydell
  5 siblings, 0 replies; 9+ messages in thread
From: Paolo Bonzini @ 2014-06-27 14:11 UTC (permalink / raw)
  To: qemu-devel; +Cc: Hani Benhabiles

From: Hani Benhabiles <kroosec@gmail.com>

Signed-off-by: Hani Benhabiles <kroosec@gmail.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 include/block/nbd.h |  3 +++
 nbd.c               | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 68 insertions(+)

diff --git a/include/block/nbd.h b/include/block/nbd.h
index 561b70c..9e835d2 100644
--- a/include/block/nbd.h
+++ b/include/block/nbd.h
@@ -52,7 +52,10 @@ struct nbd_reply {
 #define NBD_FLAG_C_FIXED_NEWSTYLE   (1 << 0)    /* Fixed newstyle protocol. */
 
 /* Reply types. */
+#define NBD_REP_ACK             (1)             /* Data sending finished. */
+#define NBD_REP_SERVER          (2)             /* Export description. */
 #define NBD_REP_ERR_UNSUP       ((1 << 31) | 1) /* Unknown option. */
+#define NBD_REP_ERR_INVALID     ((1 << 31) | 3) /* Invalid length. */
 
 #define NBD_CMD_MASK_COMMAND	0x0000ffff
 #define NBD_CMD_FLAG_FUA	(1 << 16)
diff --git a/nbd.c b/nbd.c
index a579e01..e7d1cee 100644
--- a/nbd.c
+++ b/nbd.c
@@ -84,6 +84,7 @@
 
 #define NBD_OPT_EXPORT_NAME     (1)
 #define NBD_OPT_ABORT           (2)
+#define NBD_OPT_LIST            (3)
 
 /* Definitions for opaque data types */
 
@@ -249,6 +250,64 @@ static int nbd_send_rep(int csock, uint32_t type, uint32_t opt)
     return 0;
 }
 
+static int nbd_send_rep_list(int csock, NBDExport *exp)
+{
+    uint64_t magic, name_len;
+    uint32_t opt, type, len;
+
+    name_len = strlen(exp->name);
+    magic = cpu_to_be64(NBD_REP_MAGIC);
+    if (write_sync(csock, &magic, sizeof(magic)) != sizeof(magic)) {
+        LOG("write failed (magic)");
+        return -EINVAL;
+     }
+    opt = cpu_to_be32(NBD_OPT_LIST);
+    if (write_sync(csock, &opt, sizeof(opt)) != sizeof(opt)) {
+        LOG("write failed (opt)");
+        return -EINVAL;
+    }
+    type = cpu_to_be32(NBD_REP_SERVER);
+    if (write_sync(csock, &type, sizeof(type)) != sizeof(type)) {
+        LOG("write failed (reply type)");
+        return -EINVAL;
+    }
+    len = cpu_to_be32(name_len + sizeof(len));
+    if (write_sync(csock, &len, sizeof(len)) != sizeof(len)) {
+        LOG("write failed (length)");
+        return -EINVAL;
+    }
+    len = cpu_to_be32(name_len);
+    if (write_sync(csock, &len, sizeof(len)) != sizeof(len)) {
+        LOG("write failed (length)");
+        return -EINVAL;
+    }
+    if (write_sync(csock, exp->name, name_len) != name_len) {
+        LOG("write failed (buffer)");
+        return -EINVAL;
+    }
+    return 0;
+}
+
+static int nbd_handle_list(NBDClient *client, uint32_t length)
+{
+    int csock;
+    NBDExport *exp;
+
+    csock = client->sock;
+    if (length) {
+        return nbd_send_rep(csock, NBD_REP_ERR_INVALID, NBD_OPT_LIST);
+    }
+
+    /* For each export, send a NBD_REP_SERVER reply. */
+    QTAILQ_FOREACH(exp, &exports, next) {
+        if (nbd_send_rep_list(csock, exp)) {
+            return -EINVAL;
+        }
+    }
+    /* Finish with a NBD_REP_ACK. */
+    return nbd_send_rep(csock, NBD_REP_ACK, NBD_OPT_LIST);
+}
+
 static int nbd_handle_export_name(NBDClient *client, uint32_t length)
 {
     int rc = -EINVAL, csock = client->sock;
@@ -330,6 +389,12 @@ static int nbd_receive_options(NBDClient *client)
 
         TRACE("Checking option");
         switch (be32_to_cpu(tmp)) {
+        case NBD_OPT_LIST:
+            if (nbd_handle_list(client, length) < 0) {
+                return 1;
+            }
+            break;
+
         case NBD_OPT_ABORT:
             return -EINVAL;
 
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PULL 0/5] NBD changes for 2014-06-27
  2014-06-27 14:11 [Qemu-devel] [PULL 0/5] NBD changes for 2014-06-27 Paolo Bonzini
                   ` (4 preceding siblings ...)
  2014-06-27 14:11 ` [Qemu-devel] [PULL 5/5] nbd: Handle NBD_OPT_LIST option Paolo Bonzini
@ 2014-06-29 11:45 ` Peter Maydell
  2014-06-29 11:55   ` Hani Benhabiles
  5 siblings, 1 reply; 9+ messages in thread
From: Peter Maydell @ 2014-06-29 11:45 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: QEMU Developers

On 27 June 2014 15:11, Paolo Bonzini <pbonzini@redhat.com> wrote:
> The following changes since commit d4cba13bdf251baeedb36b87c1e9f6766773e380:
>
>   tcg/ppc: Fix failure in tcg_out_mem_long (2014-06-27 13:23:41 +0100)
>
> are available in the git repository at:
>
>   git://github.com/bonzini/qemu.git nbd-next
>
> for you to fetch changes up to 34bf23a5e0e878e3cd650c47d670b881f9f61475:
>
>   nbd: Handle NBD_OPT_LIST option. (2014-06-27 16:06:48 +0200)
>
> Three bugfixes, and a new feature.

Hi. I'm afraid this doesn't build on win32:
/home/petmay01/linaro/qemu-for-merges/blockdev-nbd.c: In function ‘nbd_accept’:
/home/petmay01/linaro/qemu-for-merges/blockdev-nbd.c:31: error:
‘SHUT_RDWR’ undeclared (first use in this function)
/home/petmay01/linaro/qemu-for-merges/blockdev-nbd.c:31: error: (Each
undeclared identifier is reported only once
/home/petmay01/linaro/qemu-for-merges/blockdev-nbd.c:31: error: for
each function it appears in.)
make: *** [blockdev-nbd.o] Error 1

thanks
-- PMM

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PULL 0/5] NBD changes for 2014-06-27
  2014-06-29 11:45 ` [Qemu-devel] [PULL 0/5] NBD changes for 2014-06-27 Peter Maydell
@ 2014-06-29 11:55   ` Hani Benhabiles
  2014-06-30 12:36     ` Paolo Bonzini
  0 siblings, 1 reply; 9+ messages in thread
From: Hani Benhabiles @ 2014-06-29 11:55 UTC (permalink / raw)
  To: Peter Maydell; +Cc: Paolo Bonzini, QEMU Developers

On Sun, Jun 29, 2014 at 12:45:27PM +0100, Peter Maydell wrote:
> On 27 June 2014 15:11, Paolo Bonzini <pbonzini@redhat.com> wrote:
> > The following changes since commit d4cba13bdf251baeedb36b87c1e9f6766773e380:
> >
> >   tcg/ppc: Fix failure in tcg_out_mem_long (2014-06-27 13:23:41 +0100)
> >
> > are available in the git repository at:
> >
> >   git://github.com/bonzini/qemu.git nbd-next
> >
> > for you to fetch changes up to 34bf23a5e0e878e3cd650c47d670b881f9f61475:
> >
> >   nbd: Handle NBD_OPT_LIST option. (2014-06-27 16:06:48 +0200)
> >
> > Three bugfixes, and a new feature.
> 
> Hi. I'm afraid this doesn't build on win32:

Hi Peter,

Should be fixed with s/SHUT_RDWR/2/

That is how shutdown() is called elsewhere in nbd.c and block/nbd-client.c

> /home/petmay01/linaro/qemu-for-merges/blockdev-nbd.c: In function ‘nbd_accept’:
> /home/petmay01/linaro/qemu-for-merges/blockdev-nbd.c:31: error:
> ‘SHUT_RDWR’ undeclared (first use in this function)
> /home/petmay01/linaro/qemu-for-merges/blockdev-nbd.c:31: error: (Each
> undeclared identifier is reported only once
> /home/petmay01/linaro/qemu-for-merges/blockdev-nbd.c:31: error: for
> each function it appears in.)
> make: *** [blockdev-nbd.o] Error 1
> 
> thanks
> -- PMM
> 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PULL 0/5] NBD changes for 2014-06-27
  2014-06-29 11:55   ` Hani Benhabiles
@ 2014-06-30 12:36     ` Paolo Bonzini
  0 siblings, 0 replies; 9+ messages in thread
From: Paolo Bonzini @ 2014-06-30 12:36 UTC (permalink / raw)
  To: Hani Benhabiles, Peter Maydell; +Cc: QEMU Developers

Il 29/06/2014 13:55, Hani Benhabiles ha scritto:
> On Sun, Jun 29, 2014 at 12:45:27PM +0100, Peter Maydell wrote:
>> On 27 June 2014 15:11, Paolo Bonzini <pbonzini@redhat.com> wrote:
>>> The following changes since commit d4cba13bdf251baeedb36b87c1e9f6766773e380:
>>>
>>>   tcg/ppc: Fix failure in tcg_out_mem_long (2014-06-27 13:23:41 +0100)
>>>
>>> are available in the git repository at:
>>>
>>>   git://github.com/bonzini/qemu.git nbd-next
>>>
>>> for you to fetch changes up to 34bf23a5e0e878e3cd650c47d670b881f9f61475:
>>>
>>>   nbd: Handle NBD_OPT_LIST option. (2014-06-27 16:06:48 +0200)
>>>
>>> Three bugfixes, and a new feature.
>>
>> Hi. I'm afraid this doesn't build on win32:
>
> Hi Peter,
>
> Should be fixed with s/SHUT_RDWR/2/
>
> That is how shutdown() is called elsewhere in nbd.c and block/nbd-client.c

Will resubmit.

Paolo

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2014-06-30 12:37 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-06-27 14:11 [Qemu-devel] [PULL 0/5] NBD changes for 2014-06-27 Paolo Bonzini
2014-06-27 14:11 ` [Qemu-devel] [PULL 1/5] nbd: Don't export a block device with no medium Paolo Bonzini
2014-06-27 14:11 ` [Qemu-devel] [PULL 2/5] nbd: Don't validate from and len in NBD_CMD_DISC Paolo Bonzini
2014-06-27 14:11 ` [Qemu-devel] [PULL 3/5] nbd: Shutdown socket before closing Paolo Bonzini
2014-06-27 14:11 ` [Qemu-devel] [PULL 4/5] nbd: Handle fixed new-style clients Paolo Bonzini
2014-06-27 14:11 ` [Qemu-devel] [PULL 5/5] nbd: Handle NBD_OPT_LIST option Paolo Bonzini
2014-06-29 11:45 ` [Qemu-devel] [PULL 0/5] NBD changes for 2014-06-27 Peter Maydell
2014-06-29 11:55   ` Hani Benhabiles
2014-06-30 12:36     ` Paolo Bonzini

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.