From b98a409b80ac510c95b4f1bafdef28edaeabd3e7 Mon Sep 17 00:00:00 2001 From: Stefano Stabellini Date: Thu, 29 Jul 2010 14:53:16 +0100 Subject: 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 --- drivers/block/xen-blkfront.c | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) (limited to 'drivers') 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) { -- cgit v1.2.3