aboutsummaryrefslogtreecommitdiff
path: root/fsdev/qemu-fsdev.c
diff options
context:
space:
mode:
authorGreg Kurz <groug@kaod.org>2019-05-17 17:34:48 +0200
committerGreg Kurz <groug@kaod.org>2019-05-17 17:34:48 +0200
commitaee7f3ecd8b7c3f761fde2ca5d2b4d8c45b6dfa0 (patch)
tree8b5f483afc9c80d8cd34393423239fa501111127 /fsdev/qemu-fsdev.c
parent202324357397435bb572734e3fd4e1eed86b04f9 (diff)
fsdev: Error out when unsupported option is passed
Each fsdriver only supports a subset of the options that can be passed to -fsdev. Unsupported options are simply ignored. This could cause the user to erroneously think QEMU has a bug. Enforce strict checking of supported options for all fsdrivers. This shouldn't impact libvirt, since it doesn't know about the synth and proxy fsdrivers. Signed-off-by: Greg Kurz <groug@kaod.org> Reviewed-by: Eric Blake <eblake@redhat.com>
Diffstat (limited to 'fsdev/qemu-fsdev.c')
-rw-r--r--fsdev/qemu-fsdev.c74
1 files changed, 71 insertions, 3 deletions
diff --git a/fsdev/qemu-fsdev.c b/fsdev/qemu-fsdev.c
index e972bd698c..077a8c4e2b 100644
--- a/fsdev/qemu-fsdev.c
+++ b/fsdev/qemu-fsdev.c
@@ -34,6 +34,7 @@
typedef struct FsDriverTable {
const char *name;
FileOperations *ops;
+ const char **opts;
} FsDriverTable;
typedef struct FsDriverListEntry {
@@ -44,12 +45,75 @@ typedef struct FsDriverListEntry {
static QTAILQ_HEAD(, FsDriverListEntry) fsdriver_entries =
QTAILQ_HEAD_INITIALIZER(fsdriver_entries);
+#define COMMON_FS_DRIVER_OPTIONS "id", "fsdriver", "readonly"
+
static FsDriverTable FsDrivers[] = {
- { .name = "local", .ops = &local_ops},
- { .name = "synth", .ops = &synth_ops},
- { .name = "proxy", .ops = &proxy_ops},
+ {
+ .name = "local",
+ .ops = &local_ops,
+ .opts = (const char * []) {
+ COMMON_FS_DRIVER_OPTIONS,
+ "security_model",
+ "path",
+ "writeout",
+ "fmode",
+ "dmode",
+ "throttling.bps-total",
+ "throttling.bps-read",
+ "throttling.bps-write",
+ "throttling.iops-total",
+ "throttling.iops-read",
+ "throttling.iops-write",
+ "throttling.bps-total-max",
+ "throttling.bps-read-max",
+ "throttling.bps-write-max",
+ "throttling.iops-total-max",
+ "throttling.iops-read-max",
+ "throttling.iops-write-max",
+ "throttling.bps-total-max-length",
+ "throttling.bps-read-max-length",
+ "throttling.bps-write-max-length",
+ "throttling.iops-total-max-length",
+ "throttling.iops-read-max-length",
+ "throttling.iops-write-max-length",
+ "throttling.iops-size",
+ },
+ },
+ {
+ .name = "synth",
+ .ops = &synth_ops,
+ .opts = (const char * []) {
+ COMMON_FS_DRIVER_OPTIONS,
+ },
+ },
+ {
+ .name = "proxy",
+ .ops = &proxy_ops,
+ .opts = (const char * []) {
+ COMMON_FS_DRIVER_OPTIONS,
+ "socket",
+ "sock_fd",
+ "writeout",
+ },
+ },
};
+static int validate_opt(void *opaque, const char *name, const char *value,
+ Error **errp)
+{
+ FsDriverTable *drv = opaque;
+ const char **opt;
+
+ for (opt = drv->opts; *opt; opt++) {
+ if (!strcmp(*opt, name)) {
+ return 0;
+ }
+ }
+
+ error_setg(errp, "'%s' is invalid for fsdriver '%s'", name, drv->name);
+ return -1;
+}
+
int qemu_fsdev_add(QemuOpts *opts, Error **errp)
{
int i;
@@ -80,6 +144,10 @@ int qemu_fsdev_add(QemuOpts *opts, Error **errp)
return -1;
}
+ if (qemu_opt_foreach(opts, validate_opt, &FsDrivers[i], errp)) {
+ return -1;
+ }
+
fsle = g_malloc0(sizeof(*fsle));
fsle->fse.fsdev_id = g_strdup(fsdev_id);
fsle->fse.ops = FsDrivers[i].ops;