소스 검색

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>
Stefano Stabellini 15 년 전
부모
커밋
b98a409b80
1개의 변경된 파일26개의 추가작업 그리고 13개의 파일을 삭제
  1. 26 13
      drivers/block/xen-blkfront.c

+ 26 - 13
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) {