aboutsummaryrefslogtreecommitdiffstats
path: root/tools/blktap2
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2010-01-29 08:53:52 +0000
committerKeir Fraser <keir.fraser@citrix.com>2010-01-29 08:53:52 +0000
commit613ef0ad1d7554aa04f9365f992f924defe58635 (patch)
treea706b14a625499fbbe6e0a8d5362fa45a5e21f79 /tools/blktap2
parent3d624ae31bb83570e93e133ba505a84f1417421c (diff)
downloadxen-613ef0ad1d7554aa04f9365f992f924defe58635.tar.gz
xen-613ef0ad1d7554aa04f9365f992f924defe58635.tar.bz2
xen-613ef0ad1d7554aa04f9365f992f924defe58635.zip
blktap2: Sort out tapdisk IPC init.
Move I/O and event callbacks setup out of tapdisk-server, into tapdisk-ipc. Signed-off-by: Daniel Stodden <daniel.stodden@citrix.com>
Diffstat (limited to 'tools/blktap2')
-rw-r--r--tools/blktap2/drivers/tapdisk-ipc.c74
-rw-r--r--tools/blktap2/drivers/tapdisk-ipc.h4
-rw-r--r--tools/blktap2/drivers/tapdisk-server.c74
-rw-r--r--tools/blktap2/drivers/tapdisk-server.h1
4 files changed, 95 insertions, 58 deletions
diff --git a/tools/blktap2/drivers/tapdisk-ipc.c b/tools/blktap2/drivers/tapdisk-ipc.c
index 3cfdb6c8f8..988e1c2c8f 100644
--- a/tools/blktap2/drivers/tapdisk-ipc.c
+++ b/tools/blktap2/drivers/tapdisk-ipc.c
@@ -30,12 +30,86 @@
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
+#include <fcntl.h>
#include "tapdisk.h"
#include "tapdisk-ipc.h"
#include "tapdisk-vbd.h"
#include "tapdisk-server.h"
+static void
+tapdisk_ipc_read_event(event_id_t id, char mode, void *private)
+{
+ td_ipc_t *ipc = private;
+ tapdisk_ipc_read(ipc);
+}
+
+static void
+__tapdisk_ipc_init(td_ipc_t *ipc)
+{
+ ipc->rfd = -1;
+ ipc->wfd = -1;
+ ipc->rfd_event = -1;
+}
+
+int
+tapdisk_ipc_open(td_ipc_t *ipc, const char *read, const char *write)
+{
+ int err;
+
+ memset(ipc, 0, sizeof(td_ipc_t));
+ __tapdisk_ipc_init(ipc);
+
+ if (read) {
+ ipc->rfd = open(read, O_RDWR | O_NONBLOCK);
+ if (ipc->rfd < 0) {
+ err = -errno;
+ EPRINTF("FD open failed %s: %d\n", read, err);
+ goto fail;
+ }
+
+ ipc->rfd_event =
+ tapdisk_server_register_event(SCHEDULER_POLL_READ_FD,
+ ipc->rfd, 0,
+ tapdisk_ipc_read_event,
+ ipc);
+ if (ipc->rfd_event < 0) {
+ err = ipc->rfd_event;
+ goto fail;
+ }
+ }
+
+ if (write) {
+ ipc->wfd = open(write, O_RDWR | O_NONBLOCK);
+ if (ipc->wfd < 0) {
+ err = -errno;
+ EPRINTF("FD open failed %s, %d\n", write, err);
+ goto fail;
+ }
+ }
+
+ return 0;
+
+fail:
+ tapdisk_ipc_close(ipc);
+ return err;
+}
+
+void
+tapdisk_ipc_close(td_ipc_t *ipc)
+{
+ if (ipc->rfd > 0)
+ close(ipc->rfd);
+
+ if (ipc->wfd > 0)
+ close(ipc->wfd);
+
+ if (ipc->rfd_event >= 0)
+ tapdisk_server_unregister_event(ipc->rfd_event);
+
+ __tapdisk_ipc_init(ipc);
+}
+
static int
tapdisk_ipc_write_message(int fd, tapdisk_message_t *message, int timeout)
{
diff --git a/tools/blktap2/drivers/tapdisk-ipc.h b/tools/blktap2/drivers/tapdisk-ipc.h
index 25eb48cafc..c213d17795 100644
--- a/tools/blktap2/drivers/tapdisk-ipc.h
+++ b/tools/blktap2/drivers/tapdisk-ipc.h
@@ -29,13 +29,17 @@
#define _TAPDISK_IPC_H_
#include "tapdisk-message.h"
+#include "scheduler.h"
typedef struct td_ipc_handle {
int rfd;
int wfd;
+ event_id_t rfd_event;
td_uuid_t uuid;
} td_ipc_t;
+int tapdisk_ipc_open(td_ipc_t *ipc, const char *read, const char *write);
+void tapdisk_ipc_close(td_ipc_t *ipc);
int tapdisk_ipc_read(td_ipc_t *ipc);
int tapdisk_ipc_write(td_ipc_t *ipc, int type);
int tapdisk_ipc_write_error(td_ipc_t *ipc, const char *message);
diff --git a/tools/blktap2/drivers/tapdisk-server.c b/tools/blktap2/drivers/tapdisk-server.c
index 4d9c426f4a..4e74e30a48 100644
--- a/tools/blktap2/drivers/tapdisk-server.c
+++ b/tools/blktap2/drivers/tapdisk-server.c
@@ -26,7 +26,6 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <stdio.h>
-#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
@@ -223,12 +222,6 @@ tapdisk_server_send_error(const char *message)
}
static void
-tapdisk_server_read_ipc_message(event_id_t id, char mode, void *private)
-{
- tapdisk_ipc_read(&server.ipc);
-}
-
-static void
tapdisk_server_aio_queue_event(event_id_t id, char mode, void *private)
{
tapdisk_complete_tiocbs(&server.aio_queue);
@@ -242,6 +235,18 @@ tapdisk_server_free_aio_queue(void)
}
static int
+tapdisk_server_init_ipc(const char *read, const char *write)
+{
+ return tapdisk_ipc_open(&server.ipc, read, write);
+}
+
+static void
+tapdisk_server_close_ipc(void)
+{
+ tapdisk_ipc_close(&server.ipc);
+}
+
+static int
tapdisk_server_initialize_aio_queue(void)
{
int err;
@@ -270,15 +275,7 @@ static void
tapdisk_server_close(void)
{
tapdisk_server_free_aio_queue();
-
- if (server.control_event)
- scheduler_unregister_event(&server.scheduler, server.control_event);
-
- if (server.ipc.rfd != -1)
- close(server.ipc.rfd);
-
- if (server.ipc.wfd != -1)
- close(server.ipc.wfd);
+ tapdisk_server_close_ipc();
}
static void
@@ -334,63 +331,26 @@ int
tapdisk_server_initialize(const char *read, const char *write)
{
int err;
- event_id_t event_id;
- event_id = 0;
memset(&server, 0, sizeof(tapdisk_server_t));
- server.ipc.rfd = server.ipc.wfd = -1;
-
INIT_LIST_HEAD(&server.vbds);
- if (read) {
- server.ipc.rfd = open(read, O_RDWR | O_NONBLOCK);
- if (server.ipc.rfd < 0) {
- err = -errno;
- EPRINTF("FD open failed %s: %d\n", read, err);
- goto fail;
- }
- }
-
- if (write) {
- server.ipc.wfd = open(write, O_RDWR | O_NONBLOCK);
- if (server.ipc.wfd < 0) {
- err = -errno;
- EPRINTF("FD open failed %s, %d\n", write, err);
- goto fail;
- }
- }
-
scheduler_initialize(&server.scheduler);
- if (read) {
- event_id = scheduler_register_event(&server.scheduler,
- SCHEDULER_POLL_READ_FD,
- server.ipc.rfd, 0,
- tapdisk_server_read_ipc_message,
- NULL);
- if (event_id < 0) {
- err = event_id;
- goto fail;
- }
- }
+ err = tapdisk_server_init_ipc(read, write);
+ if (err)
+ goto fail;
err = tapdisk_server_initialize_aio_queue();
if (err)
goto fail;
- server.control_event = event_id;
server.run = 1;
return 0;
fail:
- if (server.ipc.rfd > 0)
- close(server.ipc.rfd);
- if (server.ipc.wfd > 0)
- close(server.ipc.wfd);
- if (event_id > 0)
- scheduler_unregister_event(&server.scheduler,
- server.control_event);
+ tapdisk_server_close_ipc();
return err;
}
diff --git a/tools/blktap2/drivers/tapdisk-server.h b/tools/blktap2/drivers/tapdisk-server.h
index 09a4e13b81..ffdc579183 100644
--- a/tools/blktap2/drivers/tapdisk-server.h
+++ b/tools/blktap2/drivers/tapdisk-server.h
@@ -57,7 +57,6 @@ typedef struct tapdisk_server {
td_ipc_t ipc;
struct list_head vbds;
scheduler_t scheduler;
- event_id_t control_event;
struct tqueue aio_queue;
event_id_t aio_queue_event_id;
} tapdisk_server_t;