[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 6/6] tapdisk-ioemu: Fix shutdown condition



Even when opening the only image a tapdisk-ioemu instance is
responsible for fails, it can't immediately shut down. blktapctrl
still wants to communicate with tapdisk-ioemu and close the disk.

This patch changes tapdisk-ioemu to count the connections to
blktapctrl rather than the number of opened disk images.

Signed-off-by: Kevin Wolf <kwolf@xxxxxxx>
---
 hw/xen_blktap.c |    5 ++++-
 tapdisk-ioemu.c |   13 ++++++++++---
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/hw/xen_blktap.c b/hw/xen_blktap.c
index f04f30d..5cbdbcb 100644
--- a/hw/xen_blktap.c
+++ b/hw/xen_blktap.c
@@ -67,6 +67,7 @@ int read_fd;
 int write_fd;
 
 static pid_t process;
+int connected_disks = 0;
 fd_list_entry_t *fd_start = NULL;
 
 static void handle_blktap_iomsg(void* private);
@@ -543,6 +544,7 @@ static void handle_blktap_ctrlmsg(void* private)
 
                        /* Allocate the disk structs */
                        s = state_init();
+                       connected_disks++;
 
                        /*Open file*/
                        if (s == NULL || open_disk(s, path, msg->drivertype, 
msg->readonly)) {
@@ -593,7 +595,8 @@ static void handle_blktap_ctrlmsg(void* private)
                case CTLMSG_CLOSE:
                        s = get_state(msg->cookie);
                        if (s) unmap_disk(s);
-                       break;                  
+                       connected_disks--;
+                       break;
 
                case CTLMSG_PID:
                        memset(buf, 0x00, MSG_SIZE);
diff --git a/tapdisk-ioemu.c b/tapdisk-ioemu.c
index 31f7f59..f87381b 100644
--- a/tapdisk-ioemu.c
+++ b/tapdisk-ioemu.c
@@ -18,6 +18,7 @@ extern void *qemu_mallocz(size_t size);
 extern void qemu_free(void *ptr);
 
 extern void *fd_start;
+extern int connected_disks;
 
 int domid = 0;
 FILE* logfile;
@@ -84,7 +85,7 @@ int main(void)
     int max_fd;
     fd_set rfds;
     struct timeval tv;
-    void *old_fd_start = NULL;
+    int old_connected_disks = 0;
 
     /* Daemonize */
     if (fork() != 0)
@@ -136,11 +137,17 @@ int main(void)
                 pioh = &ioh->next;
         }
 
+       if (old_connected_disks != connected_disks)
+            fprintf(stderr, "connected disks: %d => %d\n",
+               old_connected_disks, connected_disks);
+
         /* Exit when the last image has been closed */
-        if (old_fd_start != NULL && fd_start == NULL)
+        if (old_connected_disks != 0 && connected_disks == 0) {
+           fprintf(stderr, "Last image is closed, exiting.\n");
             exit(0);
+       }
 
-        old_fd_start = fd_start;
+        old_connected_disks = connected_disks;
     }
     return 0;
 }
-- 
1.6.0.2


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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.