bug #239173 bug #242953 Index: xen-3.1-testing/tools/python/xen/xend/XendDomainInfo.py =================================================================== --- xen-3.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py +++ xen-3.1-testing/tools/python/xen/xend/XendDomainInfo.py @@ -1833,7 +1833,7 @@ class XendDomainInfo: (fn, BOOTLOADER_LOOPBACK_DEVICE)) vbd = { - 'mode': 'RO', + 'mode': 'RW', 'device': BOOTLOADER_LOOPBACK_DEVICE, } Index: xen-3.1-testing/tools/ioemu/xenstore.c =================================================================== --- xen-3.1-testing.orig/tools/ioemu/xenstore.c +++ xen-3.1-testing/tools/ioemu/xenstore.c @@ -81,9 +81,9 @@ void xenstore_parse_domain_config(int do { char **e = NULL; char *buf = NULL, *path; - char *fpath = NULL, *bpath = NULL, + char *fpath = NULL, *bpath = NULL, *btype = NULL, *dev = NULL, *params = NULL, *type = NULL, *media_present = NULL; - int i, is_scsi; + int i, is_scsi, is_tap; unsigned int len, num, hd_index; for(i = 0; i < MAX_DISKS + MAX_SCSI_DISKS; i++) @@ -116,6 +116,14 @@ void xenstore_parse_domain_config(int do bpath = xs_read(xsh, XBT_NULL, buf, &len); if (bpath == NULL) continue; + /* check to see if type is tap or not */ + if (pasprintf(&buf, "%s/type", bpath) == -1) + continue; + free(btype); + btype = xs_read(xsh, XBT_NULL, buf, &len); + if (btype == NULL) + continue; + is_tap = !strncmp(btype, "tap", 3); /* read the name of the device */ if (pasprintf(&buf, "%s/dev", bpath) == -1) continue; @@ -123,6 +131,13 @@ void xenstore_parse_domain_config(int do dev = xs_read(xsh, XBT_NULL, buf, &len); if (dev == NULL) continue; + /* Force xvdN to look like hdN */ + if (is_tap && !strncmp(dev, "xvd", 3)) { + memmove(dev, dev+1, strlen(dev)); + dev[0] = 'h'; + dev[1] = 'd'; + fprintf(stderr, "Got blktap '%s'\n", dev); + } is_scsi = !strncmp(dev, "sd", 2); if ((strncmp(dev, "hd", 2) && !is_scsi) || strlen(dev) != 3 ) continue; @@ -140,6 +155,14 @@ void xenstore_parse_domain_config(int do params = xs_read(xsh, XBT_NULL, buf, &len); if (params == NULL) continue; + /* Strip off blktap sub-type prefix aio: etc */ + if (is_tap) { + char *offset = strchr(params, ':'); + if (!offset) + continue; + memmove(params, offset+1, strlen(offset+1)+1); + fprintf(stderr, "Got params '%s'\n", params); + } /* * check if device has a phantom vbd; the phantom is hooked * to the frontend device (for ease of cleanup), so lookup @@ -196,6 +219,7 @@ void xenstore_parse_domain_config(int do free(type); free(params); free(dev); + free(btype); free(bpath); free(buf); free(path);