@@ -772,10 +772,16 @@ settings, from the following list:
=over 4
+=item B<type=TYPE>
+
+The backendtype for the PV device. Supported values are B<qemu> and
+B<xen_9pfsd>. The default is B<qemu>.
+
=item B<tag=STRING>
9pfs tag to identify the filesystem share. The tag is needed on the
-guest side to mount it.
+guest side to mount it. For the backendtype of B<xen_9pfsd> the tag defaults to
+"Xen".
=item B<security_model="none">
@@ -785,12 +791,38 @@ squash or remap).
=item B<path=STRING>
-Filesystem path on the backend to export.
+Filesystem path on the backend to export. For the backendtype of B<xen_9pfsd>
+the path defaults to "@XEN_LOG_DIR@/guests/<guest-name>".
=item B<backend=domain-id>
Specify the backend domain name or id, defaults to dom0.
+=item B<max-files=NUMBER>
+
+Specify the maximum number of files below B<path>. A value of 0 (which
+is the default) doesn't limit the number of files. Only valid for
+B<type=xen_9pfsd>.
+
+=item B<max-open-files=NUMBER>
+
+Specify the maximum number of concurrently opened files below B<path>.
+Multiple opens of the same file are counted individually. Only valid for
+B<type=xen_9pfsd>, which has a default of B<max-open-files=5>.
+
+=item B<max-space=NUMBER>
+
+Specify the maximum used disk space in MiB below B<path>. A value of 0 (which
+is the default) doesn't limit the usable disk space. Only valid for
+B<type=xen_9pfsd>.
+
+=item B<auto-delete=BOOLEAN>
+
+When set the backend will delete the oldest file which is currently not
+opened by the guest in case the disk space limit set via B<max-space> or the
+file limit set via B<max-files> is being reached. Only valid for
+B<type=xen_9pfsd>.
+
=back
=item B<pvcalls=[ "backend=domain-id", ... ]>
@@ -20,6 +20,24 @@
static int libxl__device_p9_setdefault(libxl__gc *gc, uint32_t domid,
libxl_device_p9 *p9, bool hotplug)
{
+ if (p9->type == LIBXL_P9_TYPE_UNKNOWN) {
+ p9->type = LIBXL_P9_TYPE_QEMU;
+ }
+ if (p9->type == LIBXL_P9_TYPE_QEMU &&
+ (p9->max_files || p9->max_open_files || p9->max_space ||
+ p9->auto_delete)) {
+ LOGD(ERROR, domid, "Illegal 9pfs parameter combination");
+ return ERROR_INVAL;
+ }
+ if (p9->type == LIBXL_P9_TYPE_XEN_9PFSD && !p9->tag) {
+ p9->tag = libxl__strdup(NOGC, "Xen");
+ }
+
+ if (!p9->path || !p9->security_model || !p9->tag) {
+ LOGD(ERROR, domid, "9pfs spec missing required field!");
+ return ERROR_INVAL;
+ }
+
return libxl__resolve_domid(gc, p9->backend_domname, &p9->backend_domid);
}
@@ -2233,6 +2233,20 @@ void parse_config_data(const char *config_source,
replace_string(&p9->tag, value);
} else if (!strcmp(key, "backend")) {
replace_string(&p9->backend_domname, value);
+ } else if (!strcmp(key, "type")) {
+ if (libxl_p9_type_from_string(value, &p9->type)) {
+ fprintf(stderr, "failed to parse 9pfs type: %s\n",
+ value);
+ exit(1);
+ }
+ } else if (!strcmp(key, "max-files")) {
+ p9->max_files = parse_ulong(value);
+ } else if (!strcmp(key, "max-open-files")) {
+ p9->max_open_files = parse_ulong(value);
+ } else if (!strcmp(key, "max-space")) {
+ p9->max_space = parse_ulong(value);
+ } else if (!strcmp(key, "auto-delete")) {
+ p9->auto_delete = strtoul(value, NULL, 0);
} else {
fprintf(stderr, "Unknown 9pfs parameter '%s'\n", key);
exit(1);
@@ -2243,9 +2257,12 @@ void parse_config_data(const char *config_source,
libxl_string_list_dispose(&pairs);
- if (!p9->path || !p9->security_model || !p9->tag) {
- fprintf(stderr, "9pfs spec missing required field!\n");
- exit(1);
+ if (p9->type == LIBXL_P9_TYPE_XEN_9PFSD && !p9->path) {
+ char *path;
+
+ xasprintf(&path, XEN_LOG_DIR "/guests/%s", c_info->name);
+ replace_string(&p9->path, path);
+ free(path);
}
}
}