summaryrefslogtreecommitdiff
path: root/drivers/block
diff options
context:
space:
mode:
authorStefano Stabellini <stefano.stabellini@eu.citrix.com>2010-07-29 13:53:16 (GMT)
committerJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>2010-07-29 18:11:08 (GMT)
commitb98a409b80ac510c95b4f1bafdef28edaeabd3e7 (patch)
tree2c109585fa1354eae60e739a67955b4176cd3eac /drivers/block
parentc7f52cdc2f3e1733d3864e439ac2e92edd99ef31 (diff)
downloadlinux-b98a409b80ac510c95b4f1bafdef28edaeabd3e7.tar.xz
blkfront: do not create a PV cdrom device if xen_hvm_guest
It is not possible to unplug emulated cdrom devices, and PV cdroms don't handle media insert, eject and stream, so we are better off disabling PV cdroms when running as a Xen HVM guest. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Diffstat (limited to 'drivers/block')
-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 6eb2989..f63ac3d 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) {