]> xenbits.xensource.com Git - qemu-xen-4.5-testing.git/commitdiff
Fix to eject cdrom on HVM Domain
authorIan Jackson <ian.jackson@eu.citrix.com>
Fri, 4 Sep 2009 15:19:54 +0000 (16:19 +0100)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Fri, 4 Sep 2009 15:19:54 +0000 (16:19 +0100)
We tried to eject cdrom(/dev/hdc) on HVM Domain.
But, cdrom media are not ejected from the cdrom device on HostOS.

The module to eject the cdrom device has already been implemented in
qemu-dm.
 But, all devices are opened as raw device for VBD.
Therefore, the module to eject the cdrom device is not work.

The cdrom device was corrected to open as a physical device on HostOS.
When eject is executed on HVM Domain, cdrom media are ejected from the
cdrom device on HostOS.

This patch corrected the problem.
Signed-off-by: Takanori Kasai <kasai.takanori@jp.fujitsu.com>
xenstore.c

index aee96f0fee41fcb2768778f996b91f62a7299c04..bdc25c3d4b40ed0b9b87720b64ec28834882fe66 100644 (file)
@@ -107,7 +107,14 @@ static void insert_media(void *opaque)
     for (i = 0; i < MAX_DRIVES + 1; i++) {
         bs = drives_table[i].bdrv;
         if (media_filename[i] && bs && bs->filename[0] == '\0') {
-            bdrv_open2(bs, media_filename[i], 0, &bdrv_raw);
+            BlockDriver *format;
+            if ( strstart(media_filename[i], "/dev/cd", NULL) 
+              || strstart(media_filename[i], "/dev/scd", NULL)) 
+                format = &bdrv_host_device;
+            else 
+                format = &bdrv_raw;
+
+            bdrv_open2(bs, media_filename[i], 0, format);
             pstrcpy(bs->filename, sizeof(bs->filename), media_filename[i]);
             free(media_filename[i]);
             media_filename[i] = NULL;
@@ -533,7 +540,11 @@ void xenstore_parse_domain_config(int hvm_domid)
                } else if (!strcmp(drv,"file")) {
                    format = &bdrv_raw;
                } else if (!strcmp(drv,"phy")) {
-                   format = &bdrv_raw;
+                    if (strstart(params, "/dev/cd", NULL) 
+                     || strstart(params, "/dev/scd", NULL)) 
+                        format = &bdrv_host_device;
+                    else
+                        format = &bdrv_raw;
                } else {
                    format = bdrv_find_format(drv);
                    if (!format) {