]> xenbits.xensource.com Git - xenclient/kernel.git/commitdiff
blkback: Set the VDISK_CDROM flag when a device is marked as being a
authorKeir Fraser <keir.fraser@citrix.com>
Tue, 15 Apr 2008 14:16:28 +0000 (15:16 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Tue, 15 Apr 2008 14:16:28 +0000 (15:16 +0100)
cdrom, even if the underlying device/file is not a physical cdrom.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
CC: Christian Limpach <christian.limpach@citrix.com>
drivers/xen/blkback/common.h
drivers/xen/blkback/vbd.c
drivers/xen/blkback/xenbus.c

index 948edf39b9f516d903925559d968fdbc56a0f1ed..663bfeefd56c68b3e71b972d800a9540d1689e55 100644 (file)
@@ -110,7 +110,7 @@ int blkif_map(blkif_t *blkif, unsigned long shared_page, unsigned int evtchn);
 
 /* Create a vbd. */
 int vbd_create(blkif_t *blkif, blkif_vdev_t vdevice, unsigned major,
-              unsigned minor, int readonly);
+              unsigned minor, int readonly, int cdrom);
 void vbd_free(struct vbd *vbd);
 
 unsigned long long vbd_size(struct vbd *vbd);
index 34048b32c451ea8f74607f4843ba3bdc886b35bc..2594419f4e311677e6465d77ada8c89ff312b0ca 100644 (file)
@@ -51,7 +51,7 @@ unsigned long vbd_secsize(struct vbd *vbd)
 }
 
 int vbd_create(blkif_t *blkif, blkif_vdev_t handle, unsigned major,
-              unsigned minor, int readonly)
+              unsigned minor, int readonly, int cdrom)
 {
        struct vbd *vbd;
        struct block_device *bdev;
@@ -81,7 +81,7 @@ int vbd_create(blkif_t *blkif, blkif_vdev_t handle, unsigned major,
                return -ENOENT;
        }
 
-       if (vbd->bdev->bd_disk->flags & GENHD_FL_CD)
+       if (vbd->bdev->bd_disk->flags & GENHD_FL_CD || cdrom)
                vbd->type |= VDISK_CDROM;
        if (vbd->bdev->bd_disk->flags & GENHD_FL_REMOVABLE)
                vbd->type |= VDISK_REMOVABLE;
index f4309614f5e34f5c3018e61e81a16064aae67503..7e689c758117f299dc4969924ac8270168577b2e 100644 (file)
@@ -270,6 +270,8 @@ static void backend_changed(struct xenbus_watch *watch,
        struct backend_info *be
                = container_of(watch, struct backend_info, backend_watch);
        struct xenbus_device *dev = be->dev;
+       int cdrom = 0;
+       char *device_type;
 
        DPRINTK("");
 
@@ -303,6 +305,12 @@ static void backend_changed(struct xenbus_watch *watch,
                return;
        }
 
+       device_type = xenbus_read(XBT_NIL, dev->otherend, "device-type", NULL);
+       if (!IS_ERR(device_type)) {
+               cdrom = strcmp(device_type, "cdrom") == 0;
+               kfree(device_type);
+       }
+
        if (be->major == 0 && be->minor == 0) {
                /* Front end dir is a number, which is used as the handle. */
 
@@ -313,7 +321,7 @@ static void backend_changed(struct xenbus_watch *watch,
                be->minor = minor;
 
                err = vbd_create(be->blkif, handle, major, minor,
-                                (NULL == strchr(be->mode, 'w')));
+                                (NULL == strchr(be->mode, 'w')), cdrom);
                if (err) {
                        be->major = be->minor = 0;
                        xenbus_dev_fatal(dev, err, "creating vbd structure");