]> xenbits.xensource.com Git - qemu-xen-4.1-testing.git/commitdiff
stubdom: fix cdrom changing
authorIan Jackson <ian.jackson@eu.citrix.com>
Mon, 4 Jan 2010 16:21:02 +0000 (16:21 +0000)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Mon, 4 Jan 2010 16:21:02 +0000 (16:21 +0000)
Hi all,
the current code to change a cdrom doesn't work with stubdoms:

- media_filename set at boot time doesn't have the proper
value (that in the stubdom case is the frontend path and not the
filename);

- when a cdrom watch event is triggered, the code to decide whether the
new cdrom is valid and different from the current cdrom doesn't work for
stubdoms;

both issues are fixed by this patch, in particular now media_filename
consistently holds the frontend path for stubdoms while bs->filename
holds the filename (like in the normal qemu case) to allow comparisons
with the old cdrom filename.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
xenstore.c

index 8ac478b7d66a8cb477fa02e7b04eb80926491f7e..50647197f32ec252516045fdfa72e65b535e5dae 100644 (file)
@@ -108,7 +108,23 @@ static void insert_media(void *opaque)
                 format = &bdrv_raw;
 
             bdrv_open2(bs, media_filename[i], 0, format);
+#ifdef CONFIG_STUBDOM
+            {
+                char *buf, *backend, *params_path, *params;
+                unsigned int len;
+                asprintf(&buf, "%s/backend", media_filename[i]);
+                backend = xs_read(xsh, XBT_NULL, buf, &len);
+                asprintf(&params_path, "%s/params", backend);
+                params = xs_read(xsh, XBT_NULL, params_path, &len);
+                pstrcpy(bs->filename, sizeof(bs->filename), params);
+                free(buf);
+                free(backend);
+                free(params_path);
+                free(params);
+            }
+#else
             pstrcpy(bs->filename, sizeof(bs->filename), media_filename[i]);
+#endif
             free(media_filename[i]);
             media_filename[i] = NULL;
         }
@@ -555,6 +571,11 @@ void xenstore_parse_domain_config(int hvm_domid)
 
        drives_table[nb_drives].bdrv = bs;
        drives_table[nb_drives].used = 1;
+#ifdef CONFIG_STUBDOM
+    media_filename[nb_drives] = strdup(danger_buf);
+#else
+    media_filename[nb_drives] = strdup(bs->filename);
+#endif
        nb_drives++;
 
     }
@@ -931,6 +952,7 @@ void xenstore_process_event(void *opaque)
     fprintf(stderr,"medium change watch on `%s' (index: %d): %s\n",
            vec[XS_WATCH_TOKEN], hd_index, image ? image : "<none>");
 
+#ifndef CONFIG_STUBDOM
     if (image != NULL) {
         /* Strip off blktap sub-type prefix */
         bpath = strdup(vec[XS_WATCH_PATH]); 
@@ -947,6 +969,30 @@ void xenstore_process_event(void *opaque)
         if (!strcmp(image, drives_table[hd_index].bdrv->filename))
             goto out;  /* identical */
     }
+#else
+    {
+        char path[strlen(vec[XS_WATCH_PATH]) - 6 + 8];
+        char *state;
+        path[0] = '\0';
+        strncat(path, vec[XS_WATCH_PATH], strlen(vec[XS_WATCH_PATH]) - 6);
+        strcat(path, "state");
+        state = xs_read(xsh, XBT_NULL, path, &len);
+        if (image && image[0] && state && atoi(state) <= 4) {
+            if (!strcmp(image, drives_table[hd_index].bdrv->filename))
+                goto out;  /* identical */
+            path[0] = '\0';
+            strncat(path, vec[XS_WATCH_PATH], strlen(vec[XS_WATCH_PATH]) - 6);
+            strcat(path, "frontend");
+            free(image);
+            image = NULL;
+            image = xs_read(xsh, XBT_NULL, path, &len);
+        } else {
+            free(image);
+            image = NULL;
+        }
+        free(state);
+    }
+#endif
 
     drives_table[hd_index].bdrv->filename[0] = '\0';
     bdrv_close(drives_table[hd_index].bdrv);
@@ -956,15 +1002,7 @@ void xenstore_process_event(void *opaque)
     }
 
     if (image && image[0]) {
-#ifdef CONFIG_STUBDOM
-        char path[strlen(vec[XS_WATCH_PATH]) - 6 + 8];
-        path[0] = '\0';
-        strncat(path, vec[XS_WATCH_PATH], strlen(vec[XS_WATCH_PATH]) - 6);
-        strcat(path, "frontend");
-        media_filename[hd_index] = xs_read(xsh, XBT_NULL, path, &len);
-#else
         media_filename[hd_index] = strdup(image);
-#endif
         xenstore_check_new_media_present(5000);
     }