summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/block/xen-blkfront.c39
1 files changed, 26 insertions, 13 deletions
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index 6eb2989a9d0a..f63ac3d1f8a4 100644
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -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) {