xen/xen-qemu-iscsi-fix.patch

63 lines
2.1 KiB
Diff
Raw Normal View History

Index: xen-3.2.1-testing/tools/ioemu/xenstore.c
===================================================================
--- xen-3.2.1-testing.orig/tools/ioemu/xenstore.c
+++ xen-3.2.1-testing/tools/ioemu/xenstore.c
@@ -91,6 +91,7 @@ void xenstore_parse_domain_config(int do
char *fpath = NULL, *bpath = NULL, *btype = NULL,
*dev = NULL, *params = NULL, *type = NULL, *drv = NULL;
int i, is_scsi, is_tap, is_hdN = 0;
+ int j;
unsigned int len, num, hd_index;
BlockDriverState *bs;
@@ -173,12 +174,7 @@ void xenstore_parse_domain_config(int do
continue;
free(type);
type = xs_read(xsh, XBT_NULL, 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;
@@ -186,6 +182,35 @@ void xenstore_parse_domain_config(int do
drv = xs_read(xsh, XBT_NULL, buf, &len);
if (drv == NULL)
continue;
+
+ free(params);
+ if (!strcmp(drv,"iscsi"))
+ {
+ if (pasprintf(&buf, "%s/node", bpath) == -1)
+ continue;
+
+ /* wait for block-iscsi 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: iscsi device not found -- timed out \n");
+ continue;
+ }
+ }
+ else
+ {
+ if (pasprintf(&buf, "%s/params", bpath) == -1)
+ continue;
+ params = xs_read(xsh, XBT_NULL, buf, &len);
+ if (params == NULL)
+ continue;
+ }
+
/* Strip off blktap sub-type prefix aio: - QEMU can autodetect this */
if (!strcmp(drv, "tap") && params[0]) {
char *offset = strchr(params, ':');