From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel De Graaf Subject: [PATCH v2] libxl: Support backend domain ID for disks Date: Wed, 5 Sep 2012 13:05:13 -0400 Message-ID: <1346864713-28732-1-git-send-email-dgdegra@tycho.nsa.gov> References: <1346400260.27277.93.camel@zakaz.uk.xensource.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1346400260.27277.93.camel@zakaz.uk.xensource.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Ian.Campbell@citrix.com Cc: Daniel De Graaf , Ian.Jackson@eu.citrix.com, xen-devel@lists.xen.org List-Id: xen-devel@lists.xenproject.org Allow specification of backend domains for disks, either in the config file or via xl block-attach. This functionality was supported in xend (via an optional command line parameter to block-attach), so should also be supported with libxl. In order to support named backend domains like network-attach, a valid libxl_ctx must now be passed to xlu_cfg_init. Signed-off-by: Daniel De Graaf --- This patch does not include the changes to tools/libxl/libxlu_disk_l.c and tools/libxl/libxlu_disk_l.h because the diffs contain unrelated changes due to different generator versions. docs/misc/xl-disk-configuration.txt | 12 ++++++++++++ tools/libxl/libxlu_cfg.c | 4 +++- tools/libxl/libxlu_disk_l.l | 9 +++++++++ tools/libxl/libxlu_internal.h | 1 + tools/libxl/libxlutil.h | 3 ++- tools/libxl/xl.c | 2 +- tools/libxl/xl_cmdimpl.c | 20 +++++++++----------- 7 files changed, 37 insertions(+), 14 deletions(-) diff --git a/docs/misc/xl-disk-configuration.txt b/docs/misc/xl-disk-configuration.txt index 86c16be..5bd456d 100644 --- a/docs/misc/xl-disk-configuration.txt +++ b/docs/misc/xl-disk-configuration.txt @@ -139,6 +139,18 @@ cdrom Convenience alias for "devtype=cdrom". +backend= +--------------------- + +Description: Designates a backend domain for the device +Supported values: Valid domain names +Mandatory: No + +Specifies the backend domain which this device should attach to. This +defaults to domain 0. Specifying another domain requires setting up a +driver domain which is outside the scope of this document. + + backendtype= -------------------------- diff --git a/tools/libxl/libxlu_cfg.c b/tools/libxl/libxlu_cfg.c index 22adcb0..1d086b4 100644 --- a/tools/libxl/libxlu_cfg.c +++ b/tools/libxl/libxlu_cfg.c @@ -25,13 +25,15 @@ #include "libxlu_cfg_l.h" #include "libxlu_cfg_i.h" -XLU_Config *xlu_cfg_init(FILE *report, const char *report_source) { +XLU_Config *xlu_cfg_init(FILE *report, const char *report_source, + libxl_ctx *ctx) { XLU_Config *cfg; cfg= malloc(sizeof(*cfg)); if (!cfg) return 0; cfg->report= report; + cfg->ctx = ctx; cfg->config_source= strdup(report_source); if (!cfg->config_source) { free(cfg); return 0; } diff --git a/tools/libxl/libxlu_disk_l.l b/tools/libxl/libxlu_disk_l.l index bee16a1..8cfc16e 100644 --- a/tools/libxl/libxlu_disk_l.l +++ b/tools/libxl/libxlu_disk_l.l @@ -33,6 +33,7 @@ %{ #include "libxlu_disk_i.h" +#include "libxl_utils.h" #define YY_NO_INPUT @@ -113,6 +114,13 @@ static void setbackendtype(DiskParseContext *dpc, const char *str) { else xlu__disk_err(dpc,str,"unknown value for backendtype"); } +/* Sets ->backend_domid from the string. */ +static void setbackend(DiskParseContext *dpc, const char *str) { + if (libxl_name_to_domid(dpc->cfg->ctx, str, &dpc->disk->backend_domid)) { + xlu__disk_err(dpc,str,"unknown domain for backend"); + } +} + #define DEPRECATE(usewhatinstead) /* not currently reported */ /* Handles a vdev positional parameter which includes a devtype. */ @@ -168,6 +176,7 @@ devtype=disk,? { DPC->disk->is_cdrom = 0; } devtype=[^,]*,? { xlu__disk_err(DPC,yytext,"unknown value for type"); } access=[^,]*,? { STRIP(','); setaccess(DPC, FROMEQUALS); } +backend=[^,]*,? { STRIP(','); setbackend(DPC,FROMEQUALS); } backendtype=[^,]*,? { STRIP(','); setbackendtype(DPC,FROMEQUALS); } vdev=[^,]*,? { STRIP(','); SAVESTRING("vdev", vdev, FROMEQUALS); } diff --git a/tools/libxl/libxlu_internal.h b/tools/libxl/libxlu_internal.h index 7579158..5a9cf6d 100644 --- a/tools/libxl/libxlu_internal.h +++ b/tools/libxl/libxlu_internal.h @@ -39,6 +39,7 @@ struct XLU_Config { XLU_ConfigSetting *settings; FILE *report; char *config_source; + libxl_ctx *ctx; }; typedef struct { diff --git a/tools/libxl/libxlutil.h b/tools/libxl/libxlutil.h index 0333e55..1de23e7 100644 --- a/tools/libxl/libxlutil.h +++ b/tools/libxl/libxlutil.h @@ -24,7 +24,8 @@ typedef struct XLU_Config XLU_Config; typedef struct XLU_ConfigList XLU_ConfigList; -XLU_Config *xlu_cfg_init(FILE *report, const char *report_filename); +XLU_Config *xlu_cfg_init(FILE *report, const char *report_filename, + libxl_ctx *ctx); /* 0 means we got ENOMEM. */ /* report_filename is copied; report is saved and must remain valid * until the Config is destroyed. */ diff --git a/tools/libxl/xl.c b/tools/libxl/xl.c index f31e836..32a5c32 100644 --- a/tools/libxl/xl.c +++ b/tools/libxl/xl.c @@ -56,7 +56,7 @@ static void parse_global_config(const char *configfile, int e; const char *buf; - config = xlu_cfg_init(stderr, configfile); + config = xlu_cfg_init(stderr, configfile, ctx); if (!config) { fprintf(stderr, "Failed to allocate for configuration\n"); exit(1); diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 2d6ab97..eaebbeb 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -427,7 +427,7 @@ static void parse_disk_config_multistring(XLU_Config **config, libxl_device_disk_init(disk); if (!*config) { - *config = xlu_cfg_init(stderr, "command line"); + *config = xlu_cfg_init(stderr, "command line", ctx); if (!*config) { perror("xlu_cfg_init"); exit(-1); } } @@ -583,7 +583,7 @@ static void parse_config_data(const char *config_source, libxl_domain_create_info *c_info = &d_config->c_info; libxl_domain_build_info *b_info = &d_config->b_info; - config= xlu_cfg_init(stderr, config_source); + config= xlu_cfg_init(stderr, config_source, ctx); if (!config) { fprintf(stderr, "Failed to allocate for configuration\n"); exit(1); @@ -2473,7 +2473,7 @@ static void pcidetach(const char *dom, const char *bdf, int force) libxl_device_pci_init(&pcidev); - config = xlu_cfg_init(stderr, "command line"); + config = xlu_cfg_init(stderr, "command line", ctx); if (!config) { perror("xlu_cfg_inig"); exit(-1); } if (xlu_pci_parse_bdf(config, &pcidev, bdf)) { @@ -2520,7 +2520,7 @@ static void pciattach(const char *dom, const char *bdf, const char *vs) libxl_device_pci_init(&pcidev); - config = xlu_cfg_init(stderr, "command line"); + config = xlu_cfg_init(stderr, "command line", ctx); if (!config) { perror("xlu_cfg_inig"); exit(-1); } if (xlu_pci_parse_bdf(config, &pcidev, bdf)) { @@ -2586,7 +2586,7 @@ static void pciassignable_add(const char *bdf, int rebind) libxl_device_pci_init(&pcidev); - config = xlu_cfg_init(stderr, "command line"); + config = xlu_cfg_init(stderr, "command line", ctx); if (!config) { perror("xlu_cfg_init"); exit(-1); } if (xlu_pci_parse_bdf(config, &pcidev, bdf)) { @@ -2624,7 +2624,7 @@ static void pciassignable_remove(const char *bdf, int rebind) libxl_device_pci_init(&pcidev); - config = xlu_cfg_init(stderr, "command line"); + config = xlu_cfg_init(stderr, "command line", ctx); if (!config) { perror("xlu_cfg_init"); exit(-1); } if (xlu_pci_parse_bdf(config, &pcidev, bdf)) { @@ -5321,7 +5321,7 @@ int main_networkattach(int argc, char **argv) return 1; } - config= xlu_cfg_init(stderr, "command line"); + config= xlu_cfg_init(stderr, "command line", ctx); if (!config) { fprintf(stderr, "Failed to allocate for configuration\n"); return 1; @@ -5467,7 +5467,7 @@ int main_networkdetach(int argc, char **argv) int main_blockattach(int argc, char **argv) { int opt; - uint32_t fe_domid, be_domid = 0; + uint32_t fe_domid; libxl_device_disk disk = { 0 }; XLU_Config *config = 0; @@ -5483,8 +5483,6 @@ int main_blockattach(int argc, char **argv) parse_disk_config_multistring (&config, argc-optind, (const char* const*)argv + optind, &disk); - disk.backend_domid = be_domid; - if (dryrun_only) { char *json = libxl_device_disk_to_json(ctx, &disk); printf("disk: %s\n", json); @@ -6078,7 +6076,7 @@ int main_cpupoolcreate(int argc, char **argv) config_len += strlen(extra_config) + 1; } - config = xlu_cfg_init(stderr, config_src); + config = xlu_cfg_init(stderr, config_src, ctx); if (!config) { fprintf(stderr, "Failed to allocate for configuration\n"); goto out; -- 1.7.11.4