From 9062564d79cb45029403cc998b48410e42ead924 Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Tue, 10 Mar 2009 16:45:44 +0100 Subject: [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 --- hw/xen_blktap.c | 5 ++++- tapdisk-ioemu.c | 13 ++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) Index: xen-3.4.1-testing/tools/ioemu-remote/hw/xen_blktap.c =================================================================== --- xen-3.4.1-testing.orig/tools/ioemu-remote/hw/xen_blktap.c +++ xen-3.4.1-testing/tools/ioemu-remote/hw/xen_blktap.c @@ -65,6 +65,7 @@ int read_fd; int write_fd; static pid_t process; +int connected_disks = 0; fd_list_entry_t *fd_start = NULL; extern char* get_snapshot_name(int devid); @@ -547,6 +548,7 @@ static void handle_blktap_ctrlmsg(void* /* Allocate the disk structs */ s = state_init(); + connected_disks++; /*Open file*/ if (s == NULL || open_disk(s, path, msg->drivertype, msg->readonly)) { @@ -629,7 +631,8 @@ static void handle_blktap_ctrlmsg(void* 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); Index: xen-3.4.1-testing/tools/ioemu-remote/tapdisk-ioemu.c =================================================================== --- xen-3.4.1-testing.orig/tools/ioemu-remote/tapdisk-ioemu.c +++ xen-3.4.1-testing/tools/ioemu-remote/tapdisk-ioemu.c @@ -14,6 +14,7 @@ extern void qemu_aio_init(void); extern void qemu_aio_poll(void); extern void *fd_start; +extern int connected_disks; int domid = 0; FILE* logfile; @@ -76,7 +77,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) @@ -128,11 +129,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; }