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

[Xen-changelog] [xen-unstable] Revert 17499:451ae3b8e5c8



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1208953824 -3600
# Node ID 08321f572e37747dd3fd53403996314e3179d6bf
# Parent  a5319f23db7c0985ac7ac84a998fedf435565062
Revert 17499:451ae3b8e5c8

Breaks HVM guest creation (bugzilla #1221).

Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 tools/blktap/drivers/blktapctrl.c       |   83 ++++++--------------------------
 tools/blktap/drivers/tapdisk.h          |    2 
 tools/ioemu/Makefile                    |    2 
 tools/ioemu/hw/xen_blktap.c             |   45 ++++++++++++++++-
 tools/ioemu/tapdisk-ioemu.c             |   14 -----
 tools/ioemu/vl.c                        |    8 ++-
 tools/python/xen/xend/XendDomainInfo.py |    3 -
 tools/python/xen/xend/image.py          |   30 -----------
 8 files changed, 69 insertions(+), 118 deletions(-)

diff -r a5319f23db7c -r 08321f572e37 tools/blktap/drivers/blktapctrl.c
--- a/tools/blktap/drivers/blktapctrl.c Wed Apr 23 09:15:34 2008 +0100
+++ b/tools/blktap/drivers/blktapctrl.c Wed Apr 23 13:30:24 2008 +0100
@@ -474,8 +474,9 @@ static int read_msg(int fd, int msgtype,
 
 }
 
-static int launch_tapdisk_provider(char **argv)
-{
+int launch_tapdisk(char *wrctldev, char *rdctldev)
+{
+       char *argv[] = { "tapdisk", wrctldev, rdctldev, NULL };
        pid_t child;
        
        if ((child = fork()) < 0)
@@ -489,9 +490,7 @@ static int launch_tapdisk_provider(char 
                            i != STDERR_FILENO)
                                close(i);
 
-               execvp(argv[0], argv);
-               DPRINTF("execvp failed: %d (%s)\n", errno, strerror(errno));
-               DPRINTF("PATH = %s\n", getenv("PATH"));
+               execvp("tapdisk", argv);
                _exit(1);
        } else {
                pid_t got;
@@ -499,78 +498,28 @@ static int launch_tapdisk_provider(char 
                        got = waitpid(child, NULL, 0);
                } while (got != child);
        }
-       return child;
-}
-
-static int launch_tapdisk(char *wrctldev, char *rdctldev)
-{
-       char *argv[] = { "tapdisk", wrctldev, rdctldev, NULL };
-
-       if (launch_tapdisk_provider(argv) < 0)
-               return -1;
-
        return 0;
 }
 
-static int launch_tapdisk_ioemu(void)
-{
-       char *argv[] = { "tapdisk-ioemu", NULL };
-       return launch_tapdisk_provider(argv);
-}
-
-/* 
- * Connect to an ioemu based disk provider (qemu-dm or tapdisk-ioemu)
- *
- * If the domain has a device model, connect to qemu-dm through the
- * domain specific pipe. Otherwise use a single tapdisk-ioemu instance
- * which is represented by domid 0 and provides access for Dom0 and
- * all DomUs without device model.
- */
-static int connect_qemu(blkif_t *blkif, int domid)
+/* Connect to qemu-dm */
+static int connect_qemu(blkif_t *blkif)
 {
        char *rdctldev, *wrctldev;
-
-       static int tapdisk_ioemu_pid = 0;
-       static int dom0_readfd = 0;
-       static int dom0_writefd = 0;
-       
-       if (asprintf(&rdctldev, BLKTAP_CTRL_DIR "/qemu-read-%d", domid) < 0)
-               return -1;
-
-       if (asprintf(&wrctldev, BLKTAP_CTRL_DIR "/qemu-write-%d", domid) < 0) {
+       
+       if (asprintf(&rdctldev, BLKTAP_CTRL_DIR "/qemu-read-%d", 
+                       blkif->domid) < 0)
+               return -1;
+
+       if (asprintf(&wrctldev, BLKTAP_CTRL_DIR "/qemu-write-%d", 
+                       blkif->domid) < 0) {
                free(rdctldev);
                return -1;
        }
 
        DPRINTF("Using qemu blktap pipe: %s\n", rdctldev);
        
-       if (domid == 0) {
-               /*
-                * tapdisk-ioemu exits as soon as the last image is 
-                * disconnected. Check if it is still running.
-                */
-               if (tapdisk_ioemu_pid == 0 || kill(tapdisk_ioemu_pid, 0)) {
-                       /* No device model and tapdisk-ioemu doesn't run yet */
-                       DPRINTF("Launching tapdisk-ioemu\n");
-                       tapdisk_ioemu_pid = launch_tapdisk_ioemu();
-                       
-                       dom0_readfd = open_ctrl_socket(wrctldev);
-                       dom0_writefd = open_ctrl_socket(rdctldev);
-               }
-
-               DPRINTF("Using tapdisk-ioemu connection\n");
-               blkif->fds[READ] = dom0_readfd;
-               blkif->fds[WRITE] = dom0_writefd;
-       } else if (access(rdctldev, R_OK | W_OK) == 0) {
-               /* Use existing pipe to the device model */
-               DPRINTF("Using qemu-dm connection\n");
-               blkif->fds[READ] = open_ctrl_socket(wrctldev);
-               blkif->fds[WRITE] = open_ctrl_socket(rdctldev);
-       } else {
-               /* No device model => try with tapdisk-ioemu */
-               DPRINTF("No device model\n");
-               connect_qemu(blkif, 0);
-       }
+       blkif->fds[READ] = open_ctrl_socket(wrctldev);
+       blkif->fds[WRITE] = open_ctrl_socket(rdctldev);
        
        free(rdctldev);
        free(wrctldev);
@@ -650,7 +599,7 @@ int blktapctrl_new_blkif(blkif_t *blkif)
 
                if (!exist) {
                        if (type == DISK_TYPE_IOEMU) {
-                               if (connect_qemu(blkif, blkif->domid))
+                               if (connect_qemu(blkif))
                                        goto fail;
                        } else {
                                if (connect_tapdisk(blkif, minor))
diff -r a5319f23db7c -r 08321f572e37 tools/blktap/drivers/tapdisk.h
--- a/tools/blktap/drivers/tapdisk.h    Wed Apr 23 09:15:34 2008 +0100
+++ b/tools/blktap/drivers/tapdisk.h    Wed Apr 23 13:30:24 2008 +0100
@@ -235,7 +235,7 @@ static disk_info_t ioemu_disk = {
        DISK_TYPE_IOEMU,
        "ioemu disk",
        "ioemu",
-       1,
+       0,
 #ifdef TAPDISK
        NULL
 #endif
diff -r a5319f23db7c -r 08321f572e37 tools/ioemu/Makefile
--- a/tools/ioemu/Makefile      Wed Apr 23 09:15:34 2008 +0100
+++ b/tools/ioemu/Makefile      Wed Apr 23 13:30:24 2008 +0100
@@ -87,7 +87,7 @@ endif
 
 install: all $(if $(BUILD_DOCS),install-doc)
        mkdir -p "$(DESTDIR)$(bindir)"
-       $(INSTALL) -m 755 $(TOOLS) "$(DESTDIR)$(SBINDIR)"
+       $(INSTALL) -m 755 $(TOOLS) "$(DESTDIR)$(prefix)/sbin"
 #      mkdir -p "$(DESTDIR)$(datadir)"
 #      for x in bios.bin vgabios.bin vgabios-cirrus.bin ppc_rom.bin \
 #              video.x openbios-sparc32 linux_boot.bin pxe-ne2k_pci.bin \
diff -r a5319f23db7c -r 08321f572e37 tools/ioemu/hw/xen_blktap.c
--- a/tools/ioemu/hw/xen_blktap.c       Wed Apr 23 09:15:34 2008 +0100
+++ b/tools/ioemu/hw/xen_blktap.c       Wed Apr 23 13:30:24 2008 +0100
@@ -581,13 +581,17 @@ static void handle_blktap_ctrlmsg(void* 
  */
 static int open_ctrl_socket(char *devname)
 {
+       int ret;
        int ipc_fd;
 
        if (mkdir(BLKTAP_CTRL_DIR, 0755) == 0)
                DPRINTF("Created %s directory\n", BLKTAP_CTRL_DIR);
 
-       if (access(devname, R_OK | W_OK))
+       ret = mkfifo(devname,S_IRWXU|S_IRWXG|S_IRWXO);
+       if ( (ret != 0) && (errno != EEXIST) ) {
+               DPRINTF("ERROR: pipe failed (%d)\n", errno);
                return -1;
+       }
 
        ipc_fd = open(devname,O_RDWR|O_NONBLOCK);
 
@@ -597,6 +601,42 @@ static int open_ctrl_socket(char *devnam
        }
 
        return ipc_fd;
+}
+
+/**
+ * Unmaps all disks and closes their pipes
+ */
+void shutdown_blktap(void)
+{
+       fd_list_entry_t *ptr;
+       struct td_state *s;
+       char *devname;
+
+       DPRINTF("Shutdown blktap\n");
+
+       /* Unmap all disks */
+       ptr = fd_start;
+       while (ptr != NULL) {
+               s = ptr->s;
+               unmap_disk(s);
+               close(ptr->tap_fd);
+               ptr = ptr->next;
+       }
+
+       /* Delete control pipes */
+       if (asprintf(&devname, BLKTAP_CTRL_DIR "/qemu-read-%d", domid) >= 0) {
+               DPRINTF("Delete %s\n", devname);
+               if (unlink(devname))
+                       DPRINTF("Could not delete: %s\n", strerror(errno));
+               free(devname);
+       }
+       
+       if (asprintf(&devname, BLKTAP_CTRL_DIR "/qemu-write-%d", domid) >= 0) { 
+               DPRINTF("Delete %s\n", devname);
+               if (unlink(devname))
+                       DPRINTF("Could not delete: %s\n", strerror(errno));
+               free(devname);
+       }
 }
 
 /**
@@ -639,5 +679,8 @@ int init_blktap(void)
        /* Attach a handler to the read pipe (called from qemu main loop) */
        qemu_set_fd_handler2(read_fd, NULL, &handle_blktap_ctrlmsg, NULL, NULL);
 
+       /* Register handler to clean up when the domain is destroyed */
+       atexit(&shutdown_blktap);
+
        return 0;
 }
diff -r a5319f23db7c -r 08321f572e37 tools/ioemu/tapdisk-ioemu.c
--- a/tools/ioemu/tapdisk-ioemu.c       Wed Apr 23 09:15:34 2008 +0100
+++ b/tools/ioemu/tapdisk-ioemu.c       Wed Apr 23 13:30:24 2008 +0100
@@ -4,7 +4,6 @@
 #include <string.h>
 #include <stdint.h>
 #include <signal.h>
-#include <unistd.h>
 #include <sys/time.h>
 
 #include <assert.h>
@@ -16,8 +15,6 @@ extern void bdrv_init(void);
 
 extern void *qemu_mallocz(size_t size);
 extern void qemu_free(void *ptr);
-
-extern void *fd_start;
 
 int domid = 0;
 FILE* logfile;
@@ -98,17 +95,12 @@ int main(void)
     int max_fd;
     fd_set rfds;
     struct timeval tv;
-    void *old_fd_start = NULL;
 
     logfile = stderr;
     
     bdrv_init();
     qemu_aio_init();
     init_blktap();
-
-    /* Daemonize */
-    if (fork() != 0)
-       exit(0);
    
     /* 
      * Main loop: Pass events to the corrsponding handlers and check for
@@ -145,12 +137,6 @@ int main(void)
             } else 
                 pioh = &ioh->next;
         }
-
-        /* Exit when the last image has been closed */
-        if (old_fd_start != NULL && fd_start == NULL)
-            exit(0);
-
-        old_fd_start = fd_start;
     }
     return 0;
 }
diff -r a5319f23db7c -r 08321f572e37 tools/ioemu/vl.c
--- a/tools/ioemu/vl.c  Wed Apr 23 09:15:34 2008 +0100
+++ b/tools/ioemu/vl.c  Wed Apr 23 13:30:24 2008 +0100
@@ -6273,6 +6273,12 @@ void qemu_system_powerdown_request(void)
     powerdown_requested = 1;
     if (cpu_single_env)
         cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
+}
+
+static void qemu_sighup_handler(int signal)
+{
+    fprintf(stderr, "Received SIGHUP, terminating.\n");
+    exit(0);
 }
 
 void main_loop_wait(int timeout)
@@ -7970,7 +7976,7 @@ int main(int argc, char **argv)
 
 #ifndef CONFIG_STUBDOM
     /* Unblock SIGTERM and SIGHUP, which may have been blocked by the caller */
-    signal(SIGHUP, SIG_DFL);
+    signal(SIGHUP, qemu_sighup_handler);
     sigemptyset(&set);
     sigaddset(&set, SIGTERM);
     sigaddset(&set, SIGHUP);
diff -r a5319f23db7c -r 08321f572e37 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   Wed Apr 23 09:15:34 2008 +0100
+++ b/tools/python/xen/xend/XendDomainInfo.py   Wed Apr 23 13:30:24 2008 +0100
@@ -1837,9 +1837,6 @@ class XendDomainInfo:
 
         @raise: VmError for invalid devices
         """
-        if self.image:
-            self.image.prepareEnvironment()
-
         ordered_refs = self.info.ordered_device_refs()
         for dev_uuid in ordered_refs:
             devclass, config = self.info['devices'][dev_uuid]
diff -r a5319f23db7c -r 08321f572e37 tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py    Wed Apr 23 09:15:34 2008 +0100
+++ b/tools/python/xen/xend/image.py    Wed Apr 23 13:30:24 2008 +0100
@@ -184,30 +184,6 @@ class ImageHandler:
     def buildDomain(self):
         """Build the domain. Define in subclass."""
         raise NotImplementedError()
-
-    def prepareEnvironment(self):
-        """Prepare the environment for the execution of the domain. This
-        method is called before any devices are set up."""
-        
-        domid = self.vm.getDomid()
-       
-        # Delete left-over pipes
-        try:
-            os.unlink('/var/run/tap/qemu-read-%d' % domid)
-            os.unlink('/var/run/tap/qemu-write-%d' % domid)
-        except:
-            pass
-
-        # No device model, don't create pipes
-        if self.device_model is None:
-            return
-
-        # If we use a device model, the pipes for communication between
-        # blktapctrl and ioemu must be present before the devices are 
-        # created (blktapctrl must access them for new block devices)
-        os.mkfifo('/var/run/tap/qemu-read-%d' % domid, 0600)
-        os.mkfifo('/var/run/tap/qemu-write-%d' % domid, 0600)
-        
 
     # Return a list of cmd line args to the device models based on the
     # xm config file
@@ -435,12 +411,6 @@ class ImageHandler:
             self.pid = None
             state = xstransact.Remove("/local/domain/0/device-model/%i"
                                       % self.vm.getDomid())
-            
-            try:
-                os.unlink('/var/run/tap/qemu-read-%d' % self.vm.getDomid())
-                os.unlink('/var/run/tap/qemu-write-%d' % self.vm.getDomid())
-            except:
-                pass
 
 
 class LinuxImageHandler(ImageHandler):

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


 


Rackspace

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