[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] xl: support empty CDROM devices



# HG changeset patch
# User Ian Campbell <ian.campbell@xxxxxxxxxx>
# Date 1343211245 -3600
# Node ID 576aeedaca777236db8760ac5ca17b30f1c5354d
# Parent  f0249f4b34e3ca3a770a09c688f9c1d1c523f5e7
xl: support empty CDROM devices

The important change here is to xlu_disk_parse to correctly set format == EMPTY
for CDROM devices which are empty. Test cases are added which check for
correctness here.

xend accepts ',hdc:cdrom,r'[0] as an empty CDROM drive however this is not
consistent with the xl syntax in docs/misc/xl-disk-configuration.txt which
requires ',,hdc:cdrom,r' (the additional positional paramter is the format).
I'm not sure if/how this can be fixed. Note that xend does not accept
',,hdc:cdrom,r'

There are several incidental cleanups included the the cdrom-{insert,eject}
commands:
  - add a dry-run mode
  - use the non-deprecated disk specification syntax
  - check for and report errors from libxl_cdrom_insert

[0] http://wiki.xen.org/wiki/CD_Rom_Support_in_Xen

Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

diff -r f0249f4b34e3 -r 576aeedaca77 docs/man/xl.pod.1
--- a/docs/man/xl.pod.1 Wed Jul 25 10:23:41 2012 +0100
+++ b/docs/man/xl.pod.1 Wed Jul 25 11:14:05 2012 +0100
@@ -1037,9 +1037,12 @@ in the domain.
 
 List virtual block devices for a domain.
 
-=item B<cd-insert> I<domain-id> I<VirtualDevice> I<be-dev>
+=item B<cd-insert> I<domain-id> I<VirtualDevice> I<target>
 
-Insert a cdrom into a guest domain's cd drive. Only works with HVM domains.
+Insert a cdrom into a guest domain's existing virtial cd drive. The
+virtual drive must already exist but can be current empty.
+
+Only works with HVM domains.
 
 B<OPTIONS>
 
@@ -1047,20 +1050,29 @@ B<OPTIONS>
 
 =item I<VirtualDevice>
 
-How the device should be presented to the guest domain; for example /dev/hdc.
+How the device should be presented to the guest domain; for example "hdc".
 
-=item I<be-dev>
+=item I<target>
 
-the device in the backend domain (usually domain 0) to be exported; it
-can be a path to a file (file://path/to/file.iso). See B<disk> in
-L<xl.cfg(5)> for the details.
+the target path in the backend domain (usually domain 0) to be
+exported; Can be a block device or a file etc. See B<target> in
+F<docs/misc/xl-disk-configuration.txt>.
 
 =back
 
 =item B<cd-eject> I<domain-id> I<VirtualDevice>
 
-Eject a cdrom from a guest's cd drive. Only works with HVM domains.
-I<VirtualDevice> is the cdrom device in the guest to eject.
+Eject a cdrom from a guest's virtual cd drive. Only works with HVM domains.
+
+B<OPTIONS>
+
+=over 4
+
+=item I<VirtualDevice>
+
+How the device should be presented to the guest domain; for example "hdc".
+
+=back
 
 =back
 
diff -r f0249f4b34e3 -r 576aeedaca77 tools/libxl/check-xl-disk-parse
--- a/tools/libxl/check-xl-disk-parse   Wed Jul 25 10:23:41 2012 +0100
+++ b/tools/libxl/check-xl-disk-parse   Wed Jul 25 11:14:05 2012 +0100
@@ -107,4 +107,38 @@ disk: {
 EOF
 one 0 backendtype=phy,vdev=xvdb,access=w,target=/dev/vg/guest-volume
 
+expected <<EOF
+disk: {
+    "backend_domid": 0,
+    "pdev_path": "",
+    "vdev": "hdc",
+    "backend": "unknown",
+    "format": "empty",
+    "script": null,
+    "removable": 1,
+    "readwrite": 0,
+    "is_cdrom": 1
+}
+
+EOF
+one 0 ,,hdc:cdrom,r
+one 0 vdev=hdc,access=r,devtype=cdrom,target=
+one 0 ,empty,hdc:cdrom,r
+
+expected <<EOF
+disk: {
+    "backend_domid": 0,
+    "pdev_path": null,
+    "vdev": "hdc",
+    "backend": "unknown",
+    "format": "empty",
+    "script": null,
+    "removable": 1,
+    "readwrite": 0,
+    "is_cdrom": 1
+}
+
+EOF
+one 0 vdev=hdc,access=r,devtype=cdrom,format=empty
+
 complete
diff -r f0249f4b34e3 -r 576aeedaca77 tools/libxl/libxlu_disk.c
--- a/tools/libxl/libxlu_disk.c Wed Jul 25 10:23:41 2012 +0100
+++ b/tools/libxl/libxlu_disk.c Wed Jul 25 11:14:05 2012 +0100
@@ -76,6 +76,8 @@ int xlu_disk_parse(XLU_Config *cfg,
     if (disk->is_cdrom) {
         disk->removable = 1;
         disk->readwrite = 0;
+        if (!disk->pdev_path || !strcmp(disk->pdev_path, ""))
+            disk->format = LIBXL_DISK_FORMAT_EMPTY;
     }
 
     if (!disk->vdev) {
diff -r f0249f4b34e3 -r 576aeedaca77 tools/libxl/libxlu_disk_l.c
--- a/tools/libxl/libxlu_disk_l.c       Wed Jul 25 10:23:41 2012 +0100
+++ b/tools/libxl/libxlu_disk_l.c       Wed Jul 25 11:14:05 2012 +0100
@@ -841,11 +841,12 @@ static void setaccess(DiskParseContext *
 
 /* Sets ->format from the string.  IDL should provide something for this. */
 static void setformat(DiskParseContext *dpc, const char *str) {
-    if (!strcmp(str,"") ||
-             !strcmp(str,"raw"))    DSET(dpc,format,FORMAT,str,RAW);
+    if      (!strcmp(str,""))       DSET(dpc,format,FORMAT,str,RAW);
+    else if (!strcmp(str,"raw"))    DSET(dpc,format,FORMAT,str,RAW);
     else if (!strcmp(str,"qcow"))   DSET(dpc,format,FORMAT,str,QCOW);
     else if (!strcmp(str,"qcow2"))  DSET(dpc,format,FORMAT,str,QCOW2);
     else if (!strcmp(str,"vhd"))    DSET(dpc,format,FORMAT,str,VHD);
+    else if (!strcmp(str,"empty"))  DSET(dpc,format,FORMAT,str,EMPTY);
     else xlu__disk_err(dpc,str,"unknown value for format");
 }
 
@@ -860,7 +861,7 @@ static void setbackendtype(DiskParseCont
 #define DEPRECATE(usewhatinstead) /* not currently reported */
 
 
-#line 864 "libxlu_disk_l.c"
+#line 865 "libxlu_disk_l.c"
 
 #define INITIAL 0
 #define LEXERR 1
@@ -1096,12 +1097,12 @@ YY_DECL
        register int yy_act;
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
 
-#line 126 "libxlu_disk_l.l"
+#line 127 "libxlu_disk_l.l"
 
 
  /*----- the scanner rules which do the parsing -----*/
 
-#line 1105 "libxlu_disk_l.c"
+#line 1106 "libxlu_disk_l.c"
 
        if ( !yyg->yy_init )
                {
@@ -1222,72 +1223,72 @@ do_action:      /* This label is used only to
 case 1:
 /* rule 1 can match eol */
 YY_RULE_SETUP
-#line 130 "libxlu_disk_l.l"
+#line 131 "libxlu_disk_l.l"
 { /* ignore whitespace before parameters */ }
        YY_BREAK
 /* ordinary parameters setting enums or strings */
 case 2:
 /* rule 2 can match eol */
 YY_RULE_SETUP
-#line 134 "libxlu_disk_l.l"
+#line 135 "libxlu_disk_l.l"
 { STRIP(','); setformat(DPC, FROMEQUALS); }
        YY_BREAK
 case 3:
 YY_RULE_SETUP
-#line 136 "libxlu_disk_l.l"
+#line 137 "libxlu_disk_l.l"
 { DPC->disk->is_cdrom = 1; }
        YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 137 "libxlu_disk_l.l"
+#line 138 "libxlu_disk_l.l"
 { DPC->disk->is_cdrom = 1; }
        YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 138 "libxlu_disk_l.l"
+#line 139 "libxlu_disk_l.l"
 { DPC->disk->is_cdrom = 0; }
        YY_BREAK
 case 6:
 /* rule 6 can match eol */
 YY_RULE_SETUP
-#line 139 "libxlu_disk_l.l"
+#line 140 "libxlu_disk_l.l"
 { xlu__disk_err(DPC,yytext,"unknown value for type"); }
        YY_BREAK
 case 7:
 /* rule 7 can match eol */
 YY_RULE_SETUP
-#line 141 "libxlu_disk_l.l"
+#line 142 "libxlu_disk_l.l"
 { STRIP(','); setaccess(DPC, FROMEQUALS); }
        YY_BREAK
 case 8:
 /* rule 8 can match eol */
 YY_RULE_SETUP
-#line 142 "libxlu_disk_l.l"
+#line 143 "libxlu_disk_l.l"
 { STRIP(','); setbackendtype(DPC,FROMEQUALS); }
        YY_BREAK
 case 9:
 /* rule 9 can match eol */
 YY_RULE_SETUP
-#line 144 "libxlu_disk_l.l"
+#line 145 "libxlu_disk_l.l"
 { STRIP(','); SAVESTRING("vdev", vdev, FROMEQUALS); }
        YY_BREAK
 case 10:
 /* rule 10 can match eol */
 YY_RULE_SETUP
-#line 145 "libxlu_disk_l.l"
+#line 146 "libxlu_disk_l.l"
 { STRIP(','); SAVESTRING("script", script, FROMEQUALS); }
        YY_BREAK
 /* the target magic parameter, eats the rest of the string */
 case 11:
 YY_RULE_SETUP
-#line 149 "libxlu_disk_l.l"
+#line 150 "libxlu_disk_l.l"
 { STRIP(','); SAVESTRING("target", pdev_path, FROMEQUALS); }
        YY_BREAK
 /* unknown parameters */
 case 12:
 /* rule 12 can match eol */
 YY_RULE_SETUP
-#line 153 "libxlu_disk_l.l"
+#line 154 "libxlu_disk_l.l"
 { xlu__disk_err(DPC,yytext,"unknown parameter"); }
        YY_BREAK
 /* deprecated prefixes */
@@ -1295,7 +1296,7 @@ YY_RULE_SETUP
    * matched the whole string, so these patterns take precedence */
 case 13:
 YY_RULE_SETUP
-#line 160 "libxlu_disk_l.l"
+#line 161 "libxlu_disk_l.l"
 {
                     STRIP(':');
                     DPC->had_depr_prefix=1; DEPRECATE("use `[format=]...,'");
@@ -1304,7 +1305,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 166 "libxlu_disk_l.l"
+#line 167 "libxlu_disk_l.l"
 {
                    STRIP(':');
                     DPC->had_depr_prefix=1; DEPRECATE("use `script=...'");
@@ -1316,12 +1317,12 @@ case 15:
 yyg->yy_c_buf_p = yy_cp = yy_bp + 8;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
-#line 172 "libxlu_disk_l.l"
+#line 173 "libxlu_disk_l.l"
 { DPC->had_depr_prefix=1; DEPRECATE(0); }
        YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 173 "libxlu_disk_l.l"
+#line 174 "libxlu_disk_l.l"
 { DPC->had_depr_prefix=1; DEPRECATE(0); }
        YY_BREAK
 case 17:
@@ -1329,7 +1330,7 @@ case 17:
 yyg->yy_c_buf_p = yy_cp = yy_bp + 4;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
-#line 174 "libxlu_disk_l.l"
+#line 175 "libxlu_disk_l.l"
 { DPC->had_depr_prefix=1; DEPRECATE(0); }
        YY_BREAK
 case 18:
@@ -1337,7 +1338,7 @@ case 18:
 yyg->yy_c_buf_p = yy_cp = yy_bp + 6;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
-#line 175 "libxlu_disk_l.l"
+#line 176 "libxlu_disk_l.l"
 { DPC->had_depr_prefix=1; DEPRECATE(0); }
        YY_BREAK
 case 19:
@@ -1345,7 +1346,7 @@ case 19:
 yyg->yy_c_buf_p = yy_cp = yy_bp + 5;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
-#line 176 "libxlu_disk_l.l"
+#line 177 "libxlu_disk_l.l"
 { DPC->had_depr_prefix=1; DEPRECATE(0); }
        YY_BREAK
 case 20:
@@ -1353,13 +1354,13 @@ case 20:
 yyg->yy_c_buf_p = yy_cp = yy_bp + 4;
 YY_DO_BEFORE_ACTION; /* set up yytext again */
 YY_RULE_SETUP
-#line 177 "libxlu_disk_l.l"
+#line 178 "libxlu_disk_l.l"
 { DPC->had_depr_prefix=1; DEPRECATE(0); }
        YY_BREAK
 case 21:
 /* rule 21 can match eol */
 YY_RULE_SETUP
-#line 179 "libxlu_disk_l.l"
+#line 180 "libxlu_disk_l.l"
 {
                  xlu__disk_err(DPC,yytext,"unknown deprecated disk prefix");
                  return 0;
@@ -1369,7 +1370,7 @@ YY_RULE_SETUP
 case 22:
 /* rule 22 can match eol */
 YY_RULE_SETUP
-#line 186 "libxlu_disk_l.l"
+#line 187 "libxlu_disk_l.l"
 {
     char *colon;
     STRIP(',');
@@ -1406,7 +1407,7 @@ YY_RULE_SETUP
        YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 220 "libxlu_disk_l.l"
+#line 221 "libxlu_disk_l.l"
 {
     BEGIN(LEXERR);
     yymore();
@@ -1414,17 +1415,17 @@ YY_RULE_SETUP
        YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 224 "libxlu_disk_l.l"
+#line 225 "libxlu_disk_l.l"
 {
     xlu__disk_err(DPC,yytext,"bad disk syntax"); return 0;
 }
        YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 227 "libxlu_disk_l.l"
+#line 228 "libxlu_disk_l.l"
 YY_FATAL_ERROR( "flex scanner jammed" );
        YY_BREAK
-#line 1428 "libxlu_disk_l.c"
+#line 1429 "libxlu_disk_l.c"
                        case YY_STATE_EOF(INITIAL):
                        case YY_STATE_EOF(LEXERR):
                                yyterminate();
@@ -2516,12 +2517,4 @@ void xlu__disk_yyfree (void * ptr , yysc
 
 #define YYTABLES_NAME "yytables"
 
-#line 227 "libxlu_disk_l.l"
-
-/*
- * Local variables:
- * mode: C
- * c-basic-offset: 4
- * indent-tabs-mode: nil
- * End:
- */
+#line 228 "libxlu_disk_l.l"
diff -r f0249f4b34e3 -r 576aeedaca77 tools/libxl/libxlu_disk_l.h
--- a/tools/libxl/libxlu_disk_l.h       Wed Jul 25 10:23:41 2012 +0100
+++ b/tools/libxl/libxlu_disk_l.h       Wed Jul 25 11:14:05 2012 +0100
@@ -340,16 +340,8 @@ extern int xlu__disk_yylex (yyscan_t yys
 #undef YY_DECL
 #endif
 
-#line 227 "libxlu_disk_l.l"
+#line 228 "libxlu_disk_l.l"
 
 #line 346 "libxlu_disk_l.h"
 #undef xlu__disk_yyIN_HEADER
 #endif /* xlu__disk_yyHEADER_H */
-
-/*
- * Local variables:
- * mode: C
- * c-basic-offset: 4
- * indent-tabs-mode: nil
- * End:
- */
diff -r f0249f4b34e3 -r 576aeedaca77 tools/libxl/libxlu_disk_l.l
--- a/tools/libxl/libxlu_disk_l.l       Wed Jul 25 10:23:41 2012 +0100
+++ b/tools/libxl/libxlu_disk_l.l       Wed Jul 25 11:14:05 2012 +0100
@@ -92,11 +92,12 @@ static void setaccess(DiskParseContext *
 
 /* Sets ->format from the string.  IDL should provide something for this. */
 static void setformat(DiskParseContext *dpc, const char *str) {
-    if (!strcmp(str,"") ||
-             !strcmp(str,"raw"))    DSET(dpc,format,FORMAT,str,RAW);
+    if      (!strcmp(str,""))       DSET(dpc,format,FORMAT,str,RAW);
+    else if (!strcmp(str,"raw"))    DSET(dpc,format,FORMAT,str,RAW);
     else if (!strcmp(str,"qcow"))   DSET(dpc,format,FORMAT,str,QCOW);
     else if (!strcmp(str,"qcow2"))  DSET(dpc,format,FORMAT,str,QCOW2);
     else if (!strcmp(str,"vhd"))    DSET(dpc,format,FORMAT,str,VHD);
+    else if (!strcmp(str,"empty"))  DSET(dpc,format,FORMAT,str,EMPTY);
     else xlu__disk_err(dpc,str,"unknown value for format");
 }
 
diff -r f0249f4b34e3 -r 576aeedaca77 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c  Wed Jul 25 10:23:41 2012 +0100
+++ b/tools/libxl/xl_cmdimpl.c  Wed Jul 25 11:14:05 2012 +0100
@@ -2211,7 +2211,8 @@ static void cd_insert(const char *dom, c
 
     find_domain(dom);
 
-    if (asprintf(&buf, "%s,%s:cdrom,r", phys ? phys : "", virtdev) < 0) {
+    if (asprintf(&buf, "vdev=%s,access=r,devtype=cdrom,target=%s",
+                 virtdev, phys ? phys : "") < 0) {
         fprintf(stderr, "out of memory\n");
         return;
     }
@@ -2220,9 +2221,19 @@ static void cd_insert(const char *dom, c
 
     disk.backend_domid = 0;
 
-    libxl_cdrom_insert(ctx, domid, &disk, NULL);
-
-    libxl_device_disk_dispose(&disk);
+    if (dryrun_only) {
+        char *json = libxl_device_disk_to_json(ctx, &disk);
+        printf("disk: %s\n", json);
+        free(json);
+        if (ferror(stdout) || fflush(stdout)) { perror("stdout"); exit(-1); }
+        return;
+    } else {
+        if (libxl_cdrom_insert(ctx, domid, &disk, NULL)) {
+            fprintf(stderr, "libxl_cdrom_insert failed.\n");
+
+            libxl_device_disk_dispose(&disk);
+        }
+    }
     free(buf);
 }
 
diff -r f0249f4b34e3 -r 576aeedaca77 tools/libxl/xl_cmdtable.c
--- a/tools/libxl/xl_cmdtable.c Wed Jul 25 10:23:41 2012 +0100
+++ b/tools/libxl/xl_cmdtable.c Wed Jul 25 11:14:05 2012 +0100
@@ -174,12 +174,12 @@ struct cmd_spec cmd_table[] = {
       "- for internal use only",
     },
     { "cd-insert",
-      &main_cd_insert, 0, 1,
+      &main_cd_insert, 1, 1,
       "Insert a cdrom into a guest's cd drive",
       "<Domain> <VirtualDevice> <type:path>",
     },
     { "cd-eject",
-      &main_cd_eject, 0, 1,
+      &main_cd_eject, 1, 1,
       "Eject a cdrom from a guest's cd drive",
       "<Domain> <VirtualDevice>",
     },

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.