[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1/3] xl: support empty CDROM devices
From: Ian Campbell <ian.campbell@xxxxxxxxxx> 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> Acked-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> - Changes in v2: * Add a test case for `devtype=cdrom,,,hdc' --- docs/man/xl.pod.1 | 30 +++++++++++++++++++++--------- tools/libxl/check-xl-disk-parse | 35 +++++++++++++++++++++++++++++++++++ tools/libxl/libxlu_disk.c | 2 ++ tools/libxl/libxlu_disk_l.c | 35 ++++++++++++++--------------------- tools/libxl/libxlu_disk_l.h | 10 +--------- tools/libxl/libxlu_disk_l.l | 5 +++-- tools/libxl/xl_cmdimpl.c | 3 ++- tools/libxl/xl_cmdtable.c | 4 ++-- 8 files changed, 80 insertions(+), 44 deletions(-) diff --git a/docs/man/xl.pod.1 b/docs/man/xl.pod.1 index cbd7608..25ce777 100644 --- a/docs/man/xl.pod.1 +++ b/docs/man/xl.pod.1 @@ -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 --git a/tools/libxl/check-xl-disk-parse b/tools/libxl/check-xl-disk-parse index 67805e5..7a33780 100755 --- a/tools/libxl/check-xl-disk-parse +++ b/tools/libxl/check-xl-disk-parse @@ -107,4 +107,39 @@ 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 devtype=cdrom,,,hdc +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 --git a/tools/libxl/libxlu_disk.c b/tools/libxl/libxlu_disk.c index 3d51def..18fe386 100644 --- a/tools/libxl/libxlu_disk.c +++ b/tools/libxl/libxlu_disk.c @@ -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 --git a/tools/libxl/libxlu_disk_l.c b/tools/libxl/libxlu_disk_l.c index 2f0f283..8b9f44d 100644 --- a/tools/libxl/libxlu_disk_l.c +++ b/tools/libxl/libxlu_disk_l.c @@ -841,11 +841,12 @@ static void setaccess(DiskParseContext *dpc, const char *str) { /* 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(DiskParseContext *dpc, const char *str) { #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 ) { @@ -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=...'"); @@ -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: @@ -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(); @@ -2516,12 +2517,4 @@ void xlu__disk_yyfree (void * ptr , yyscan_t yyscanner) #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 --git a/tools/libxl/libxlu_disk_l.h b/tools/libxl/libxlu_disk_l.h index a3fbd72..87bf96c 100644 --- a/tools/libxl/libxlu_disk_l.h +++ b/tools/libxl/libxlu_disk_l.h @@ -340,16 +340,8 @@ extern int xlu__disk_yylex (yyscan_t yyscanner); #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 --git a/tools/libxl/libxlu_disk_l.l b/tools/libxl/libxlu_disk_l.l index a3e7180..6e53928 100644 --- a/tools/libxl/libxlu_disk_l.l +++ b/tools/libxl/libxlu_disk_l.l @@ -92,11 +92,12 @@ static void setaccess(DiskParseContext *dpc, const char *str) { /* 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 --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index e2aa8592..3fd152a 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -2211,7 +2211,8 @@ static void cd_insert(const char *dom, const char *virtdev, char *phys) 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; } diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c index f0a88c2..85ea768 100644 --- a/tools/libxl/xl_cmdtable.c +++ b/tools/libxl/xl_cmdtable.c @@ -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>", }, -- 1.7.2.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |