diff --git a/libvirt-0.6.1-events-dispatch.patch b/libvirt-0.6.1-events-dispatch.patch
new file mode 100644
index 0000000..49da108
--- /dev/null
+++ b/libvirt-0.6.1-events-dispatch.patch
@@ -0,0 +1,46 @@
+From: Daniel P. Berrange <berrange@redhat.com>
+Date: Mon, 16 Mar 2009 10:35:21 +0000 (+0000)
+Subject: Fix dispatch of FD events when one or more handles are marked deleted
+X-Git-Url: http://git.et.redhat.com/?p=libvirt.git;a=commitdiff_plain;h=10baf3deb8588f5902b6f2eb362fb408707e3d95
+
+Fix dispatch of FD events when one or more handles are marked deleted
+---
+
+diff --git a/qemud/event.c b/qemud/event.c
+index c9ea563..0887008 100644
+--- a/qemud/event.c
++++ b/qemud/event.c
+@@ -409,25 +409,26 @@ static int virEventDispatchTimeouts(void) {
+  * Returns 0 upon success, -1 if an error occurred
+  */
+ static int virEventDispatchHandles(int nfds, struct pollfd *fds) {
+-    int i;
++    int i, n;
+ 
+-    for (i = 0 ; i < nfds ; i++) {
++    for (i = 0, n = 0 ; i < eventLoop.handlesCount && n < nfds ; i++) {
+         if (eventLoop.handles[i].deleted) {
+             EVENT_DEBUG("Skip deleted %d", eventLoop.handles[i].fd);
+             continue;
+         }
+ 
+-        if (fds[i].revents) {
++        if (fds[n].revents) {
+             virEventHandleCallback cb = eventLoop.handles[i].cb;
+             void *opaque = eventLoop.handles[i].opaque;
+-            int hEvents = virPollEventToEventHandleType(fds[i].revents);
+-            EVENT_DEBUG("Dispatch %d %d %p", fds[i].fd,
+-                        fds[i].revents, eventLoop.handles[i].opaque);
++            int hEvents = virPollEventToEventHandleType(fds[n].revents);
++            EVENT_DEBUG("Dispatch %d %d %p", fds[n].fd,
++                        fds[n].revents, eventLoop.handles[i].opaque);
+             virEventUnlock();
+             (cb)(eventLoop.handles[i].watch,
+-                 fds[i].fd, hEvents, opaque);
++                 fds[n].fd, hEvents, opaque);
+             virEventLock();
+         }
++        n++;
+     }
+ 
+     return 0;
diff --git a/libvirt-0.6.1-fd-leaks.patch b/libvirt-0.6.1-fd-leaks.patch
new file mode 100644
index 0000000..07d3c4c
--- /dev/null
+++ b/libvirt-0.6.1-fd-leaks.patch
@@ -0,0 +1,78 @@
+From: Daniel Veillard <veillard@redhat.com>
+Date: Mon, 16 Mar 2009 10:41:37 +0000 (+0000)
+Subject: Avoid some potential FILE * leaks
+X-Git-Url: http://git.et.redhat.com/?p=libvirt.git;a=commitdiff_plain;h=39429bab2d55807698d9aed0112200ae532799b8
+
+Avoid some potential FILE * leaks
+* qemud/qemud.c src/cgroup.c src/uml_driver.c src/util.c: close
+  some potential FILE * leaks
+Daniel
+---
+
+diff --git a/qemud/qemud.c b/qemud/qemud.c
+index fd315fc..4f04355 100644
+--- a/qemud/qemud.c
++++ b/qemud/qemud.c
+@@ -488,7 +488,7 @@ static int qemudWritePidFile(const char *pidFile) {
+     if (fprintf(fh, "%lu\n", (unsigned long)getpid()) < 0) {
+         VIR_ERROR(_("Failed to write to pid file '%s' : %s"),
+                   pidFile, virStrerror(errno, ebuf, sizeof ebuf));
+-        close(fd);
++        fclose(fh);
+         return -1;
+     }
+ 
+diff --git a/src/cgroup.c b/src/cgroup.c
+index 5af44bd..d1d44a2 100644
+--- a/src/cgroup.c
++++ b/src/cgroup.c
+@@ -57,7 +57,7 @@ void virCgroupFree(virCgroupPtr *group)
+ 
+ static virCgroupPtr virCgroupGetMount(const char *controller)
+ {
+-    FILE *mounts;
++    FILE *mounts = NULL;
+     struct mntent entry;
+     char buf[CGROUP_MAX_VAL];
+     virCgroupPtr root = NULL;
+@@ -90,6 +90,8 @@ static virCgroupPtr virCgroupGetMount(const char *controller)
+ 
+     return root;
+ err:
++    if (mounts != NULL)
++        fclose(mounts);
+     virCgroupFree(&root);
+ 
+     return NULL;
+diff --git a/src/uml_driver.c b/src/uml_driver.c
+index 1dc7ccd..f7400f9 100644
+--- a/src/uml_driver.c
++++ b/src/uml_driver.c
+@@ -547,6 +547,7 @@ reopen:
+ 
+     if (fscanf(file, "%d", &vm->pid) != 1) {
+         errno = EINVAL;
++        fclose(file);
+         goto cleanup;
+     }
+ 
+@@ -1040,6 +1041,7 @@ static int umlGetProcessInfo(unsigned long long *cpuTime, int pid) {
+ 
+     if (fscanf(pidinfo, "%*d %*s %*c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %llu %llu", &usertime, &systime) != 2) {
+         umlDebug("not enough arg");
++        fclose(pidinfo);
+         return -1;
+     }
+ 
+diff --git a/src/util.c b/src/util.c
+index 9b74757..66ad9a4 100644
+--- a/src/util.c
++++ b/src/util.c
+@@ -1058,6 +1058,7 @@ int virFileReadPid(const char *dir,
+ 
+     if (fscanf(file, "%d", pid) != 1) {
+         rc = EINVAL;
++        fclose(file);
+         goto cleanup;
+     }
+ 
diff --git a/libvirt-0.6.1-fd-leaks2.patch b/libvirt-0.6.1-fd-leaks2.patch
new file mode 100644
index 0000000..e2914aa
--- /dev/null
+++ b/libvirt-0.6.1-fd-leaks2.patch
@@ -0,0 +1,40 @@
+Index: src/remote_internal.c
+===================================================================
+RCS file: /data/cvs/libxen/src/remote_internal.c,v
+retrieving revision 1.141
+diff -u -u -p -r1.141 remote_internal.c
+--- src/remote_internal.c	3 Mar 2009 19:33:34 -0000	1.141
++++ src/remote_internal.c	16 Mar 2009 16:57:17 -0000
+@@ -332,7 +332,7 @@ doRemoteOpen (virConnectPtr conn,
+               virConnectAuthPtr auth ATTRIBUTE_UNUSED,
+               int flags)
+ {
+-    int wakeupFD[2];
++    int wakeupFD[2] = { -1, -1 };
+     char *transport_str = NULL;
+ 
+     if (conn->uri) {
+@@ -885,6 +885,11 @@ doRemoteOpen (virConnectPtr conn,
+ #endif
+     }
+ 
++    if (wakeupFD[0] >= 0) {
++        close(wakeupFD[0]);
++	close(wakeupFD[1]);
++    }
++
+     VIR_FREE(priv->hostname);
+     goto cleanup;
+ }
+@@ -1350,6 +1355,11 @@ doRemoteClose (virConnectPtr conn, struc
+         } while (reap != -1 && reap != priv->pid);
+     }
+ #endif
++    if (priv->wakeupReadFD >= 0) {
++        close(priv->wakeupReadFD);
++	close(priv->wakeupSendFD);
++    }
++
+ 
+     /* Free hostname copy */
+     free (priv->hostname);
diff --git a/libvirt-0.6.1-getvcpus-remote.patch b/libvirt-0.6.1-getvcpus-remote.patch
new file mode 100644
index 0000000..9b38d24
--- /dev/null
+++ b/libvirt-0.6.1-getvcpus-remote.patch
@@ -0,0 +1,22 @@
+From: Daniel P. Berrange <berrange@redhat.com>
+Date: Mon, 16 Mar 2009 10:33:01 +0000 (+0000)
+Subject: Fix handling of cpumaps arg to virDomainGetVcpus RPC dispatcher
+X-Git-Url: http://git.et.redhat.com/?p=libvirt.git;a=commitdiff_plain;h=2d75d954f52a740470f85ceece4eb995d79968ca
+
+Fix handling of cpumaps arg to virDomainGetVcpus RPC dispatcher
+---
+
+diff --git a/qemud/remote.c b/qemud/remote.c
+index 8eaa7d6..44a274a 100644
+--- a/qemud/remote.c
++++ b/qemud/remote.c
+@@ -1475,7 +1475,8 @@ remoteDispatchDomainGetVcpus (struct qemud_server *server ATTRIBUTE_UNUSED,
+     /* Allocate buffers to take the results. */
+     if (VIR_ALLOC_N(info, args->maxinfo) < 0)
+         goto oom;
+-    if (VIR_ALLOC_N(cpumaps, args->maxinfo) < 0)
++    if (args->maplen > 0 &&
++        VIR_ALLOC_N(cpumaps, args->maxinfo * args->maplen) < 0)
+         goto oom;
+ 
+     info_len = virDomainGetVcpus (dom,
diff --git a/libvirt-0.6.1-pool-mode-parse.patch b/libvirt-0.6.1-pool-mode-parse.patch
new file mode 100644
index 0000000..4c400b6
--- /dev/null
+++ b/libvirt-0.6.1-pool-mode-parse.patch
@@ -0,0 +1,188 @@
+From: Daniel Veillard <veillard@redhat.com>
+Date: Thu, 12 Mar 2009 20:15:32 +0000 (+0000)
+Subject: * src/storage_conf.c: fix storage pool mode parsing, and refactoring
+X-Git-Url: http://git.et.redhat.com/?p=libvirt.git;a=commitdiff_plain;h=bc962f5d7c6e2c2cfc233ea6deea95dba2b7c6eb
+
+* src/storage_conf.c: fix storage pool mode parsing, and refactoring
+  patch by Ryota Ozaki
+Daniel
+---
+
+diff --git a/src/storage_conf.c b/src/storage_conf.c
+index 9c13e07..1c9a4e5 100644
+--- a/src/storage_conf.c
++++ b/src/storage_conf.c
+@@ -371,15 +371,33 @@ virStoragePoolDefParseAuthChap(virConnectPtr conn,
+ 
+ 
+ static int
+-virStoragePoolDefParsePerms(virConnectPtr conn,
+-                            xmlXPathContextPtr ctxt,
+-                            virStoragePermsPtr perms) {
++virStorageDefParsePerms(virConnectPtr conn,
++                        xmlXPathContextPtr ctxt,
++                        virStoragePermsPtr perms,
++                        const char *permxpath,
++                        int defaultmode) {
+     char *mode;
+     long v;
++    int ret = -1;
++    xmlNodePtr relnode;
++    xmlNodePtr node;
+ 
+-    mode = virXPathString(conn, "string(/pool/permissions/mode)", ctxt);
++    node = virXPathNode(conn, permxpath, ctxt);
++    if (node == NULL) {
++        /* Set default values if there is not <permissions> element */
++        perms->mode = defaultmode;
++        perms->uid = getuid();
++        perms->gid = getgid();
++        perms->label = NULL;
++        return 0;
++    }
++
++    relnode = ctxt->node;
++    ctxt->node = node;
++
++    mode = virXPathString(conn, "string(./mode)", ctxt);
+     if (!mode) {
+-        perms->mode = 0700;
++        perms->mode = defaultmode;
+     } else {
+         char *end = NULL;
+         perms->mode = strtol(mode, &end, 8);
+@@ -387,36 +405,39 @@ virStoragePoolDefParsePerms(virConnectPtr conn,
+         if (*end || perms->mode < 0 || perms->mode > 0777) {
+             virStorageReportError(conn, VIR_ERR_XML_ERROR,
+                                   "%s", _("malformed octal mode"));
+-            return -1;
++            goto error;
+         }
+     }
+ 
+-    if (virXPathNode(conn, "/pool/permissions/owner", ctxt) == NULL) {
++    if (virXPathNode(conn, "./owner", ctxt) == NULL) {
+         perms->uid = getuid();
+     } else {
+-        if (virXPathLong(conn, "number(/pool/permissions/owner)", ctxt, &v) < 0) {
++        if (virXPathLong(conn, "number(./owner)", ctxt, &v) < 0) {
+             virStorageReportError(conn, VIR_ERR_XML_ERROR,
+                                   "%s", _("malformed owner element"));
+-            return -1;
++            goto error;
+         }
+         perms->uid = (int)v;
+     }
+ 
+-    if (virXPathNode(conn, "/pool/permissions/group", ctxt) == NULL) {
++    if (virXPathNode(conn, "./group", ctxt) == NULL) {
+         perms->gid = getgid();
+     } else {
+-        if (virXPathLong(conn, "number(/pool/permissions/group)", ctxt, &v) < 0) {
++        if (virXPathLong(conn, "number(./group)", ctxt, &v) < 0) {
+             virStorageReportError(conn, VIR_ERR_XML_ERROR,
+                                   "%s", _("malformed group element"));
+-            return -1;
++            goto error;
+         }
+         perms->gid = (int)v;
+     }
+ 
+     /* NB, we're ignoring missing labels here - they'll simply inherit */
+-    perms->label = virXPathString(conn, "string(/pool/permissions/label)", ctxt);
++    perms->label = virXPathString(conn, "string(./label)", ctxt);
+ 
+-    return 0;
++    ret = 0;
++error:
++    ctxt->node = relnode;
++    return ret;
+ }
+ 
+ 
+@@ -579,7 +600,8 @@ virStoragePoolDefParseDoc(virConnectPtr conn,
+         goto cleanup;
+     }
+ 
+-    if (virStoragePoolDefParsePerms(conn, ctxt, &ret->target.perms) < 0)
++    if (virStorageDefParsePerms(conn, ctxt, &ret->target.perms,
++                                "/pool/target/permissions", 0700) < 0)
+         goto cleanup;
+ 
+     return ret;
+@@ -801,55 +823,6 @@ virStoragePoolDefFormat(virConnectPtr conn,
+ 
+ 
+ static int
+-virStorageVolDefParsePerms(virConnectPtr conn,
+-                           xmlXPathContextPtr ctxt,
+-                           virStoragePermsPtr perms) {
+-    char *mode;
+-    long v;
+-
+-    mode = virXPathString(conn, "string(/volume/permissions/mode)", ctxt);
+-    if (!mode) {
+-        perms->mode = 0600;
+-    } else {
+-        char *end = NULL;
+-        perms->mode = strtol(mode, &end, 8);
+-        VIR_FREE(mode);
+-        if (*end || perms->mode < 0 || perms->mode > 0777) {
+-            virStorageReportError(conn, VIR_ERR_XML_ERROR,
+-                                  "%s", _("malformed octal mode"));
+-            return -1;
+-        }
+-    }
+-
+-    if (virXPathNode(conn, "/volume/permissions/owner", ctxt) == NULL) {
+-        perms->uid = getuid();
+-    } else {
+-        if (virXPathLong(conn, "number(/volume/permissions/owner)", ctxt, &v) < 0) {
+-            virStorageReportError(conn, VIR_ERR_XML_ERROR,
+-                                  "%s", _("missing owner element"));
+-            return -1;
+-        }
+-        perms->uid = (int)v;
+-    }
+-    if (virXPathNode(conn, "/volume/permissions/group", ctxt) == NULL) {
+-        perms->gid = getgid();
+-    } else {
+-        if (virXPathLong(conn, "number(/volume/permissions/group)", ctxt, &v) < 0) {
+-            virStorageReportError(conn, VIR_ERR_XML_ERROR,
+-                                  "%s", _("missing group element"));
+-            return -1;
+-        }
+-        perms->gid = (int)v;
+-    }
+-
+-    /* NB, we're ignoring missing labels here - they'll simply inherit */
+-    perms->label = virXPathString(conn, "string(/volume/permissions/label)", ctxt);
+-
+-    return 0;
+-}
+-
+-
+-static int
+ virStorageSize(virConnectPtr conn,
+                const char *unit,
+                const char *val,
+@@ -997,7 +970,8 @@ virStorageVolDefParseDoc(virConnectPtr conn,
+         VIR_FREE(format);
+     }
+ 
+-    if (virStorageVolDefParsePerms(conn, ctxt, &ret->target.perms) < 0)
++    if (virStorageDefParsePerms(conn, ctxt, &ret->target.perms,
++                                "/volume/target/permissions", 0600) < 0)
+         goto cleanup;
+ 
+ 
+@@ -1019,7 +993,8 @@ virStorageVolDefParseDoc(virConnectPtr conn,
+         VIR_FREE(format);
+     }
+ 
+-    if (virStorageVolDefParsePerms(conn, ctxt, &ret->backingStore.perms) < 0)
++    if (virStorageDefParsePerms(conn, ctxt, &ret->backingStore.perms,
++                                "/volume/backingStore/permissions", 0600) < 0)
+         goto cleanup;
+ 
+     return ret;
diff --git a/libvirt-0.6.1-storage-delete-fail.patch b/libvirt-0.6.1-storage-delete-fail.patch
deleted file mode 100644
index 9880012..0000000
--- a/libvirt-0.6.1-storage-delete-fail.patch
+++ /dev/null
@@ -1,11 +0,0 @@
-diff -rup libvirt-0.6.1.orig/src/storage_driver.c libvirt-0.6.1.new/src/storage_driver.c
---- libvirt-0.6.1.orig/src/storage_driver.c	2009-02-16 03:43:41.000000000 -0500
-+++ libvirt-0.6.1.new/src/storage_driver.c	2009-03-06 08:02:51.000000000 -0500
-@@ -1296,7 +1296,6 @@ storageVolumeDelete(virStorageVolPtr obj
-     ret = 0;
- 
- cleanup:
--    virStorageVolDefFree(vol);
-     if (pool)
-         virStoragePoolObjUnlock(pool);
-     return ret;
diff --git a/libvirt-0.6.1-storage-free.patch b/libvirt-0.6.1-storage-free.patch
new file mode 100644
index 0000000..bfda133
--- /dev/null
+++ b/libvirt-0.6.1-storage-free.patch
@@ -0,0 +1,20 @@
+From: Daniel P. Berrange <berrange@redhat.com>
+Date: Mon, 16 Mar 2009 10:31:38 +0000 (+0000)
+Subject: Don't free storage volume in cleanup path, since it may still be referenced
+X-Git-Url: http://git.et.redhat.com/?p=libvirt.git;a=commitdiff_plain;h=d8f08ca049b6d3bc7a5124a3957e967539ad080d
+
+Don't free storage volume in cleanup path, since it may still be referenced
+---
+
+diff --git a/src/storage_driver.c b/src/storage_driver.c
+index f1320c5..b261843 100644
+--- a/src/storage_driver.c
++++ b/src/storage_driver.c
+@@ -1296,7 +1296,6 @@ storageVolumeDelete(virStorageVolPtr obj,
+     ret = 0;
+ 
+ cleanup:
+-    virStorageVolDefFree(vol);
+     if (pool)
+         virStoragePoolObjUnlock(pool);
+     return ret;
diff --git a/libvirt-0.6.1-vcpu-deadlock.patch b/libvirt-0.6.1-vcpu-deadlock.patch
new file mode 100644
index 0000000..f9df448
--- /dev/null
+++ b/libvirt-0.6.1-vcpu-deadlock.patch
@@ -0,0 +1,36 @@
+From: Daniel P. Berrange <berrange@redhat.com>
+Date: Mon, 16 Mar 2009 11:44:46 +0000 (+0000)
+Subject: Avoid deadlock setting vcpus in QEMU driver
+X-Git-Url: http://git.et.redhat.com/?p=libvirt.git;a=commitdiff_plain;h=4d7ecd146ce4de847256ae0887963719f214f62f
+
+Avoid deadlock setting vcpus in QEMU driver
+---
+
+diff --git a/src/qemu_driver.c b/src/qemu_driver.c
+index dad7098..51442d6 100644
+--- a/src/qemu_driver.c
++++ b/src/qemu_driver.c
+@@ -2725,6 +2725,7 @@ static int qemudDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus) {
+     virDomainObjPtr vm;
+     int max;
+     int ret = -1;
++    const char *type;
+ 
+     qemuDriverLock(driver);
+     vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+@@ -2745,7 +2746,14 @@ static int qemudDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus) {
+         goto cleanup;
+     }
+ 
+-    if ((max = qemudDomainGetMaxVcpus(dom)) < 0) {
++    if (!(type = virDomainVirtTypeToString(vm->def->virtType))) {
++        qemudReportError(dom->conn, dom, NULL, VIR_ERR_INTERNAL_ERROR,
++                         _("unknown virt type in domain definition '%d'"),
++                         vm->def->virtType);
++        goto cleanup;
++    }
++
++    if ((max = qemudGetMaxVCPUs(dom->conn, type)) < 0) {
+         qemudReportError(dom->conn, dom, NULL, VIR_ERR_INTERNAL_ERROR, "%s",
+                          _("could not determine max vcpus for the domain"));
+         goto cleanup;
diff --git a/libvirt-0.6.1-xen-events.patch b/libvirt-0.6.1-xen-events.patch
new file mode 100644
index 0000000..dd80746
--- /dev/null
+++ b/libvirt-0.6.1-xen-events.patch
@@ -0,0 +1,29 @@
+Index: src/xs_internal.c
+===================================================================
+RCS file: /data/cvs/libxen/src/xs_internal.c,v
+retrieving revision 1.88
+diff -u -u -r1.88 xs_internal.c
+--- src/xs_internal.c	5 Feb 2009 18:14:00 -0000	1.88
++++ src/xs_internal.c	11 Mar 2009 13:23:17 -0000
+@@ -1215,7 +1215,7 @@
+ static void
+ xenStoreWatchEvent(int watch ATTRIBUTE_UNUSED,
+                    int fd ATTRIBUTE_UNUSED,
+-                   int events ATTRIBUTE_UNUSED,
++                   int events,
+                    void *data)
+ {
+     char		 **event;
+@@ -1226,8 +1226,12 @@
+ 
+     virConnectPtr        conn = data;
+     xenUnifiedPrivatePtr priv = (xenUnifiedPrivatePtr) conn->privateData;
++
+     if(!priv) return;
+ 
++    /* only set a watch on read and write events */
++    if (events & (VIR_EVENT_HANDLE_ERROR | VIR_EVENT_HANDLE_HANGUP)) return;
++
+     xenUnifiedLock(priv);
+ 
+     if(!priv->xshandle)
diff --git a/libvirt-0.6.1-xenblock-detach.patch b/libvirt-0.6.1-xenblock-detach.patch
new file mode 100644
index 0000000..204f5d9
--- /dev/null
+++ b/libvirt-0.6.1-xenblock-detach.patch
@@ -0,0 +1,26 @@
+From: Daniel P. Berrange <berrange@redhat.com>
+Date: Tue, 10 Mar 2009 10:32:24 +0000 (+0000)
+Subject: Fix Xen block detach with newer Xend (Cole RobinSon / Tomohiro Takahashi)
+X-Git-Url: http://git.et.redhat.com/?p=libvirt.git;a=commitdiff_plain;h=33813a932d58c17441203d0e581eba91369a71e0
+
+Fix Xen block detach with newer Xend (Cole RobinSon / Tomohiro Takahashi)
+---
+
+diff --git a/src/xend_internal.c b/src/xend_internal.c
+index f9f2cb3..772f3f4 100644
+--- a/src/xend_internal.c
++++ b/src/xend_internal.c
+@@ -5566,7 +5566,12 @@ virDomainXMLDevID(virDomainPtr domain,
+     char *xref;
+ 
+     if (dev->type == VIR_DOMAIN_DEVICE_DISK) {
+-        strcpy(class, "vbd");
++        if (dev->data.disk->driverName &&
++            STREQ(dev->data.disk->driverName, "tap"))
++            strcpy(class, "tap");
++        else
++            strcpy(class, "vbd");
++
+         if (dev->data.disk->dst == NULL)
+             return -1;
+         xenUnifiedLock(priv);
diff --git a/libvirt-0.6.1-xend-lookup.patch b/libvirt-0.6.1-xend-lookup.patch
new file mode 100644
index 0000000..ea9a175
--- /dev/null
+++ b/libvirt-0.6.1-xend-lookup.patch
@@ -0,0 +1,24 @@
+Index: src/xend_internal.c
+===================================================================
+RCS file: /data/cvs/libxen/src/xend_internal.c,v
+retrieving revision 1.251
+diff -u -r1.251 xend_internal.c
+--- src/xend_internal.c	13 Feb 2009 18:23:23 -0000	1.251
++++ src/xend_internal.c	10 Mar 2009 10:00:28 -0000
+@@ -904,7 +904,15 @@
+         count++;
+     }
+ 
+-    if (VIR_ALLOC_N(ptr, count + 1 + extra) < 0)
++    /*
++     * We can'tuse the normal allocation routines as we are mixing
++     * an array of char * at the beginning followed by an array of char
++     * ret points to the NULL terminated array of char *
++     * ptr points to the current string after that array but in the same
++     * allocated block
++     */
++    if (virAlloc((void *)&ptr,
++                 (count + 1) * sizeof(char *) + extra * sizeof(char)) < 0)
+         goto error;
+ 
+     ret = (char **) ptr;
diff --git a/libvirt.spec b/libvirt.spec
index 13585ab..f672800 100644
--- a/libvirt.spec
+++ b/libvirt.spec
@@ -47,14 +47,24 @@
 Summary: Library providing a simple API virtualization
 Name: libvirt
 Version: 0.6.1
-Release: 3%{?dist}%{?extra_release}
+Release: 4%{?dist}%{?extra_release}
 License: LGPLv2+
 Group: Development/Libraries
 Source: libvirt-%{version}.tar.gz
-Patch1: libvirt-%{version}-storage-delete-fail.patch
+Patch1: libvirt-0.6.1-xend-lookup.patch
+Patch2: libvirt-0.6.1-xen-events.patch
+Patch3: libvirt-0.6.1-events-dispatch.patch
+Patch4: libvirt-0.6.1-fd-leaks.patch
+Patch5: libvirt-0.6.1-getvcpus-remote.patch
+Patch6: libvirt-0.6.1-pool-mode-parse.patch
+Patch7: libvirt-0.6.1-storage-free.patch
+Patch8: libvirt-0.6.1-vcpu-deadlock.patch
+Patch9: libvirt-0.6.1-xenblock-detach.patch
+Patch10: libvirt-0.6.1-fd-leaks2.patch
 
 # Not upstream yet - pending QEMU merge
-Patch100: libvirt-%{version}-vnc-sasl-auth.patch
+Patch100: libvirt-0.6.1-vnc-sasl-auth.patch
+
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
 URL: http://libvirt.org/
 BuildRequires: python python-devel
@@ -185,7 +195,16 @@ of recent versions of Linux (and other OSes).
 
 %prep
 %setup -q
-%patch1 -p1
+%patch1 -p0
+%patch2 -p0
+%patch3 -p1
+%patch4 -p1
+%patch5 -p1
+%patch6 -p1
+%patch7 -p1
+%patch8 -p1
+%patch9 -p1
+%patch10 -p0
 
 %patch100 -p1
 
@@ -480,6 +499,16 @@ fi
 %endif
 
 %changelog
+* Tue Mar 17 2009 Daniel P. Berrange <berrange@redhat.com> - 0.6.1-4.fc11
+- Fix memory allocation for xend lookup
+- Avoid crash if storage volume deletion fails
+- Fix multiple FD leaks
+- Fix bug in dispatch FD events when a callback is marked deleted
+- Fix parsing of storage volume owner/group/mode
+- Fix memory allocation for virDomainGetVcpus RPC handler
+- Avoid deadlock in setting vCPU count
+- Use correct driver name in Xen block detach
+
 * Mon Mar  9 2009 Cole Robinson <crobinso@redhat.com> - 0.6.1-3.fc11
 - Add Requires: libselinux