File xend-disk-order.patch of Package libvirt.import4712

Index: libvirt-0.8.8/src/xen/xend_internal.c
===================================================================
--- libvirt-0.8.8.orig/src/xen/xend_internal.c
+++ libvirt-0.8.8/src/xen/xend_internal.c
@@ -1383,20 +1383,24 @@ xenDaemonParseSxprDisks(virDomainDefPtr
             const char *src = NULL;
             const char *dst = NULL;
             const char *mode = NULL;
+            int bootable;
 
             /* Again dealing with (vbd...) vs (tap ...) differences */
             if (sexpr_lookup(node, "device/vbd")) {
                 src = sexpr_node(node, "device/vbd/uname");
                 dst = sexpr_node(node, "device/vbd/dev");
                 mode = sexpr_node(node, "device/vbd/mode");
+                bootable = sexpr_int(node, "device/vbd/bootable");
             } else if (sexpr_lookup(node, "device/tap2")) {
                 src = sexpr_node(node, "device/tap2/uname");
                 dst = sexpr_node(node, "device/tap2/dev");
                 mode = sexpr_node(node, "device/tap2/mode");
+                bootable = sexpr_int(node, "device/tap2/bootable");
             } else {
                 src = sexpr_node(node, "device/tap/uname");
                 dst = sexpr_node(node, "device/tap/dev");
                 mode = sexpr_node(node, "device/tap/mode");
+                bootable = sexpr_int(node, "device/tap/bootable");
             }
 
             if (VIR_ALLOC(disk) < 0)
@@ -1521,7 +1525,12 @@ xenDaemonParseSxprDisks(virDomainDefPtr
             if (VIR_REALLOC_N(def->disks, def->ndisks+1) < 0)
                 goto no_memory;
 
-            def->disks[def->ndisks++] = disk;
+            if (bootable == 1 && def->ndisks > 0) {
+                memmove(def->disks + 1, def->disks, sizeof(def->disks) * def->ndisks);
+                def->disks[0] = disk;
+                def->ndisks++;
+            } else
+                def->disks[def->ndisks++] = disk;
             disk = NULL;
         }
     }