}
}
- /* 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) {