]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
blkfront: do not create a PV cdrom device if xen_hvm_guest
authorStefano Stabellini <stefano.stabellini@eu.citrix.com>
Thu, 29 Jul 2010 13:53:16 +0000 (14:53 +0100)
committerJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Thu, 29 Jul 2010 18:11:08 +0000 (11:11 -0700)
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>
drivers/block/xen-blkfront.c

index 6eb2989a9d0ac587fe6ab8621e00fda287e4ab22..f63ac3d1f8a411b23574fbc221f2d3edd0a12738 100644 (file)
@@ -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) {