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, ':');