WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH 1 of 4] blktap2: Sort out tapdisk IPC init

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH 1 of 4] blktap2: Sort out tapdisk IPC init
From: Daniel Stodden <daniel.stodden@xxxxxxxxxx>
Date: Thu, 28 Jan 2010 22:37:43 -0000
Delivery-date: Thu, 28 Jan 2010 14:39:33 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <patchbomb.1264718262@xxxxxxxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <patchbomb.1264718262@xxxxxxxxxxxxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mercurial-patchbomb/1.3.1
# HG changeset patch
# User Daniel Stodden <daniel.stodden@xxxxxxxxxx>
# Date 1258172773 28800
# Node ID 9da64803841f4d8d8816f6d0218cbc6b672f7903
# Parent  2636e561970898517def148c19e04581b12dc860
blktap2: Sort out tapdisk IPC init.

Move I/O and event callbacks setup out of tapdisk-server, into tapdisk-ipc.

diff -r 2636e5619708 -r 9da64803841f tools/blktap2/drivers/tapdisk-ipc.c
--- a/tools/blktap2/drivers/tapdisk-ipc.c       Tue Jan 26 15:54:40 2010 +0000
+++ b/tools/blktap2/drivers/tapdisk-ipc.c       Fri Nov 13 20:26:13 2009 -0800
@@ -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 -r 2636e5619708 -r 9da64803841f tools/blktap2/drivers/tapdisk-ipc.h
--- a/tools/blktap2/drivers/tapdisk-ipc.h       Tue Jan 26 15:54:40 2010 +0000
+++ b/tools/blktap2/drivers/tapdisk-ipc.h       Fri Nov 13 20:26:13 2009 -0800
@@ -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 -r 2636e5619708 -r 9da64803841f tools/blktap2/drivers/tapdisk-server.c
--- a/tools/blktap2/drivers/tapdisk-server.c    Tue Jan 26 15:54:40 2010 +0000
+++ b/tools/blktap2/drivers/tapdisk-server.c    Fri Nov 13 20:26:13 2009 -0800
@@ -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 @@
 }
 
 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 @@
 }
 
 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 @@
 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 @@
 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 -r 2636e5619708 -r 9da64803841f tools/blktap2/drivers/tapdisk-server.h
--- a/tools/blktap2/drivers/tapdisk-server.h    Tue Jan 26 15:54:40 2010 +0000
+++ b/tools/blktap2/drivers/tapdisk-server.h    Fri Nov 13 20:26:13 2009 -0800
@@ -57,7 +57,6 @@
        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;

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel