[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |