File xen-qemu-iscsi-fix.patch of Package xen.openSUSE_Leap_42.3_Update

Index: xen-4.9.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
===================================================================
--- xen-4.9.0-testing.orig/tools/qemu-xen-traditional-dir-remote/xenstore.c
+++ xen-4.9.0-testing/tools/qemu-xen-traditional-dir-remote/xenstore.c
@@ -450,7 +450,7 @@ void xenstore_parse_domain_config(int hv
     char *buf = NULL;
     char *fpath = NULL, *bpath = NULL, *btype = NULL,
         *dev = NULL, *params = NULL, *drv = NULL;
-    int i, ret, is_tap;
+    int i, j, ret, is_tap;
     unsigned int len, num, hd_index, pci_devid = 0;
     BlockDriverState *bs;
     BlockDriver *format;
@@ -534,12 +534,7 @@ void xenstore_parse_domain_config(int hv
             continue;
         free(danger_type);
         danger_type = xs_read(xsh, XBT_NULL, danger_buf, &len);
-        if (pasprintf(&buf, "%s/params", bpath) == -1)
-            continue;
-        free(params);
-        params = xs_read(xsh, XBT_NULL, buf, &len);
-        if (params == NULL)
-            continue;
+
         /* read the name of the device */
         if (pasprintf(&buf, "%s/type", bpath) == -1)
             continue;
@@ -547,6 +542,35 @@ void xenstore_parse_domain_config(int hv
         drv = xs_read(xsh, XBT_NULL, buf, &len);
         if (drv == NULL)
             continue;
+
+        free(params);
+        if (!strcmp(drv,"iscsi") || !strcmp(drv, "npiv") ||
+            !strcmp(drv,"dmmd")) {
+            if (pasprintf(&buf, "%s/node", bpath) == -1)
+                continue;
+
+            /* wait for block-[iscsi|npiv|dmmd] script to complete and populate the
+             * node entry.  try 30 times (30 secs) */
+            for (j = 0; j < 30; j++) {
+                params = xs_read(xsh, XBT_NULL, buf, &len);
+                if (params != NULL)
+                    break;
+                sleep(1);
+            }
+            if (params == NULL) {
+                fprintf(stderr, "qemu: %s device not found -- timed out \n", drv);
+                continue;
+            }
+        }
+        else
+        {
+            if (pasprintf(&buf, "%s/params", bpath) == -1)
+                continue;
+            params = xs_read(xsh, XBT_NULL, buf, &len);
+            if (params == NULL)
+                continue;
+        }
+
         /* Obtain blktap sub-type prefix */
         if ((!strcmp(drv, "tap") || !strcmp(drv, "qdisk")) && params[0]) {
             char *offset = strchr(params, ':'); 
@@ -664,6 +688,12 @@ void xenstore_parse_domain_config(int hv
                         format = &bdrv_host_device;
                     else
                         format = &bdrv_raw;
+		} else if (!strcmp(drv,"iscsi")) {
+		    format = &bdrv_raw;
+		} else if (!strcmp(drv,"npiv")) {
+		    format = &bdrv_raw;
+		} else if (!strcmp(drv,"dmmd")) {
+		    format = &bdrv_raw;
 		} else {
 		    format = bdrv_find_format(drv);
 		    if (!format) {
openSUSE Build Service is sponsored by