The next patch wants to make queuing commands smarter; rather than
duplicating the logic at each command's call site, it's better to
centralize things in command_common, and to also make this helper
routine visible for use in NBD_CMD_DISC.
---
lib/disconnect.c | 17 +++--------------
lib/internal.h | 6 ++++++
lib/rw.c | 19 +++----------------
3 files changed, 12 insertions(+), 30 deletions(-)
diff --git a/lib/disconnect.c b/lib/disconnect.c
index bc43b4c..26d7298 100644
--- a/lib/disconnect.c
+++ b/lib/disconnect.c
@@ -62,25 +62,14 @@ nbd_unlocked_aio_disconnect (struct nbd_connection *conn)
{
struct command_in_flight *cmd;
- cmd = malloc (sizeof *cmd);
- if (cmd == NULL) {
- set_error (errno, "malloc");
+ cmd = command_common (conn, 0, NBD_CMD_DISC, 0, 0, NULL);
+ if (cmd == NULL)
return -1;
- }
- cmd->flags = 0;
- cmd->type = NBD_CMD_DISC;
- cmd->handle = conn->h->unique++;
- cmd->offset = 0;
- cmd->count = 0;
- cmd->data = NULL;
-
- cmd->next = conn->cmds_to_issue;
- conn->cmds_to_issue = cmd;
/* This will leave the command on the in-flight list. Is this a
* problem? Probably it isn't. If it is, we could add a flag to
* the command struct to tell SEND_REQUEST not to add it to the
* in-flight list.
*/
- return nbd_internal_run (conn->h, conn, cmd_issue);
+ return 0;
}
diff --git a/lib/internal.h b/lib/internal.h
index 3f2b729..67bd52a 100644
--- a/lib/internal.h
+++ b/lib/internal.h
@@ -265,6 +265,12 @@ extern void nbd_internal_set_last_error (int errnum, char *error);
extern int nbd_internal_errno_of_nbd_error (uint32_t error);
extern const char *nbd_internal_name_of_nbd_cmd (uint16_t type);
+/* rw.c */
+extern struct command_in_flight *command_common (struct nbd_connection *conn,
+ uint16_t flags, uint16_t type,
+ uint64_t offset,
+ uint64_t count, void *data);
+
/* socket.c */
struct socket *nbd_internal_socket_create (int fd);
diff --git a/lib/rw.c b/lib/rw.c
index 9dfce97..a7587e9 100644
--- a/lib/rw.c
+++ b/lib/rw.c
@@ -241,7 +241,7 @@ nbd_unlocked_block_status (struct nbd_handle *h,
return r == -1 ? -1 : 0;
}
-static struct command_in_flight *
+struct command_in_flight *
command_common (struct nbd_connection *conn,
uint16_t flags, uint16_t type,
uint64_t offset, uint64_t count, void *data)
@@ -298,6 +298,8 @@ command_common (struct nbd_connection *conn,
cmd->next = conn->cmds_to_issue;
conn->cmds_to_issue = cmd;
+ if (nbd_internal_run (conn->h, conn, cmd_issue) == -1)
+ return NULL;
return cmd;
}
@@ -311,8 +313,6 @@ nbd_unlocked_aio_pread (struct nbd_connection *conn, void *buf,
cmd = command_common (conn, 0, NBD_CMD_READ, offset, count, buf);
if (!cmd)
return -1;
- if (nbd_internal_run (conn->h, conn, cmd_issue) == -1)
- return -1;
return cmd->handle;
}
@@ -344,8 +344,6 @@ nbd_unlocked_aio_pwrite (struct nbd_connection *conn, const void
*buf,
(void *) buf);
if (!cmd)
return -1;
- if (nbd_internal_run (conn->h, conn, cmd_issue) == -1)
- return -1;
return cmd->handle;
}
@@ -363,8 +361,6 @@ nbd_unlocked_aio_flush (struct nbd_connection *conn)
cmd = command_common (conn, 0, NBD_CMD_FLUSH, 0, 0, NULL);
if (!cmd)
return -1;
- if (nbd_internal_run (conn->h, conn, cmd_issue) == -1)
- return -1;
return cmd->handle;
}
@@ -400,8 +396,6 @@ nbd_unlocked_aio_trim (struct nbd_connection *conn,
cmd = command_common (conn, flags, NBD_CMD_TRIM, offset, count, NULL);
if (!cmd)
return -1;
- if (nbd_internal_run (conn->h, conn, cmd_issue) == -1)
- return -1;
return cmd->handle;
}
@@ -424,8 +418,6 @@ nbd_unlocked_aio_cache (struct nbd_connection *conn,
cmd = command_common (conn, 0, NBD_CMD_CACHE, offset, count, NULL);
if (!cmd)
return -1;
- if (nbd_internal_run (conn->h, conn, cmd_issue) == -1)
- return -1;
return cmd->handle;
}
@@ -461,8 +453,6 @@ nbd_unlocked_aio_zero (struct nbd_connection *conn,
cmd = command_common (conn, flags, NBD_CMD_WRITE_ZEROES, offset, count, NULL);
if (!cmd)
return -1;
- if (nbd_internal_run (conn->h, conn, cmd_issue) == -1)
- return -1;
return cmd->handle;
}
@@ -505,8 +495,5 @@ nbd_unlocked_aio_block_status (struct nbd_connection *conn,
cmd->extent_fn = extent;
cmd->extent_id = id;
- if (nbd_internal_run (conn->h, conn, cmd_issue) == -1)
- return -1;
-
return cmd->handle;
}
--
2.20.1