|
@@ -738,21 +738,34 @@ static int blkfront_probe(struct xenbus_device *dev,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /* no unplug has been done: do not hook devices != xen vbds */
|
|
|
- if (xen_hvm_domain() && (xen_platform_pci_unplug & XEN_UNPLUG_IGNORE)) {
|
|
|
- int major;
|
|
|
-
|
|
|
- if (!VDEV_IS_EXTENDED(vdevice))
|
|
|
- major = BLKIF_MAJOR(vdevice);
|
|
|
- else
|
|
|
- major = XENVBD_MAJOR;
|
|
|
-
|
|
|
- if (major != XENVBD_MAJOR) {
|
|
|
- printk(KERN_INFO
|
|
|
- "%s: HVM does not support vbd %d as xen block device\n",
|
|
|
- __FUNCTION__, vdevice);
|
|
|
+ if (xen_hvm_domain()) {
|
|
|
+ char *type;
|
|
|
+ int len;
|
|
|
+ /* no unplug has been done: do not hook devices != xen vbds */
|
|
|
+ if (xen_platform_pci_unplug & XEN_UNPLUG_IGNORE) {
|
|
|
+ int major;
|
|
|
+
|
|
|
+ if (!VDEV_IS_EXTENDED(vdevice))
|
|
|
+ major = BLKIF_MAJOR(vdevice);
|
|
|
+ else
|
|
|
+ major = XENVBD_MAJOR;
|
|
|
+
|
|
|
+ if (major != XENVBD_MAJOR) {
|
|
|
+ printk(KERN_INFO
|
|
|
+ "%s: HVM does not support vbd %d as xen block device\n",
|
|
|
+ __FUNCTION__, vdevice);
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /* do not create a PV cdrom device if we are an HVM guest */
|
|
|
+ type = xenbus_read(XBT_NIL, dev->nodename, "device-type", &len);
|
|
|
+ if (IS_ERR(type))
|
|
|
+ return -ENODEV;
|
|
|
+ if (strncmp(type, "cdrom", 5) == 0) {
|
|
|
+ kfree(type);
|
|
|
return -ENODEV;
|
|
|
}
|
|
|
+ kfree(type);
|
|
|
}
|
|
|
info = kzalloc(sizeof(*info), GFP_KERNEL);
|
|
|
if (!info) {
|