From 7159804d0be470da876ed856ee81d2dfeefedd97 Mon Sep 17 00:00:00 2001 From: Greg Kurz Date: Fri, 17 May 2019 17:34:48 +0200 Subject: fsdev: Drop unused extern declaration This is a leftover of the handle backend, removed in QEMU 4.0. Signed-off-by: Greg Kurz Reviewed-by: Thomas Huth --- fsdev/qemu-fsdev.h | 1 - 1 file changed, 1 deletion(-) diff --git a/fsdev/qemu-fsdev.h b/fsdev/qemu-fsdev.h index d9716b4..844159d 100644 --- a/fsdev/qemu-fsdev.h +++ b/fsdev/qemu-fsdev.h @@ -41,7 +41,6 @@ typedef struct FsDriverListEntry { int qemu_fsdev_add(QemuOpts *opts, Error **errp); FsDriverEntry *get_fsdev_fsentry(char *id); extern FileOperations local_ops; -extern FileOperations handle_ops; extern FileOperations synth_ops; extern FileOperations proxy_ops; #endif -- cgit v1.1 From 778f0fad5f93224b8657831cf82fa3bb644f21e7 Mon Sep 17 00:00:00 2001 From: Greg Kurz Date: Fri, 17 May 2019 17:34:48 +0200 Subject: fsdev: Drop unused opaque field This was introduced along with -fsdev but it never got used. Signed-off-by: Greg Kurz Reviewed-by: Thomas Huth --- fsdev/file-op-9p.h | 1 - 1 file changed, 1 deletion(-) diff --git a/fsdev/file-op-9p.h b/fsdev/file-op-9p.h index 3fa062b..c757c80 100644 --- a/fsdev/file-op-9p.h +++ b/fsdev/file-op-9p.h @@ -147,7 +147,6 @@ struct FileOperations int (*renameat)(FsContext *ctx, V9fsPath *olddir, const char *old_name, V9fsPath *newdir, const char *new_name); int (*unlinkat)(FsContext *ctx, V9fsPath *dir, const char *name, int flags); - void *opaque; }; #endif -- cgit v1.1 From 202324357397435bb572734e3fd4e1eed86b04f9 Mon Sep 17 00:00:00 2001 From: Greg Kurz Date: Fri, 17 May 2019 17:34:48 +0200 Subject: fsdev: Move some types definition to qemu-fsdev.c It would make sense for these types to be defined in a header file if we had an API for fsdrivers to register themselves. In practice, we only have three of them and it is very unlikely we add new ones since the future of file sharing between host and guest is the upcoming virtio-fs. Move the types to qemu-fsdev.c instead since they are only used there. Signed-off-by: Greg Kurz Reviewed-by: Thomas Huth --- fsdev/qemu-fsdev.c | 23 +++++++++++++++++++++++ fsdev/qemu-fsdev.h | 24 ------------------------ 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/fsdev/qemu-fsdev.c b/fsdev/qemu-fsdev.c index 54cb36a..e972bd6 100644 --- a/fsdev/qemu-fsdev.c +++ b/fsdev/qemu-fsdev.c @@ -18,6 +18,29 @@ #include "qemu/error-report.h" #include "qemu/option.h" +/* + * A table to store the various file systems and their callback operations. + * ----------------- + * fstype | ops + * ----------------- + * local | local_ops + * . | + * . | + * . | + * . | + * ----------------- + * etc + */ +typedef struct FsDriverTable { + const char *name; + FileOperations *ops; +} FsDriverTable; + +typedef struct FsDriverListEntry { + FsDriverEntry fse; + QTAILQ_ENTRY(FsDriverListEntry) next; +} FsDriverListEntry; + static QTAILQ_HEAD(, FsDriverListEntry) fsdriver_entries = QTAILQ_HEAD_INITIALIZER(fsdriver_entries); diff --git a/fsdev/qemu-fsdev.h b/fsdev/qemu-fsdev.h index 844159d..52a5397 100644 --- a/fsdev/qemu-fsdev.h +++ b/fsdev/qemu-fsdev.h @@ -14,30 +14,6 @@ #define QEMU_FSDEV_H #include "file-op-9p.h" - -/* - * A table to store the various file systems and their callback operations. - * ----------------- - * fstype | ops - * ----------------- - * local | local_ops - * . | - * . | - * . | - * . | - * ----------------- - * etc - */ -typedef struct FsDriverTable { - const char *name; - FileOperations *ops; -} FsDriverTable; - -typedef struct FsDriverListEntry { - FsDriverEntry fse; - QTAILQ_ENTRY(FsDriverListEntry) next; -} FsDriverListEntry; - int qemu_fsdev_add(QemuOpts *opts, Error **errp); FsDriverEntry *get_fsdev_fsentry(char *id); extern FileOperations local_ops; -- cgit v1.1 From aee7f3ecd8b7c3f761fde2ca5d2b4d8c45b6dfa0 Mon Sep 17 00:00:00 2001 From: Greg Kurz Date: Fri, 17 May 2019 17:34:48 +0200 Subject: 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 Reviewed-by: Eric Blake --- fsdev/qemu-fsdev.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/fsdev/qemu-fsdev.c b/fsdev/qemu-fsdev.c index e972bd6..077a8c4 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; -- cgit v1.1 From 6e4199af73a5f4d03b9d9b3ab005cae33c5c6666 Mon Sep 17 00:00:00 2001 From: Greg Kurz Date: Fri, 17 May 2019 17:34:48 +0200 Subject: vl: Deprecate -virtfs_synth The synth fsdriver never got used for anything else but the QTest testcase for VirtIO 9P. And even there, QTest uses -fsdev synth and -device virtio-9p-... directly. Signed-off-by: Greg Kurz Reviewed-by: Thomas Huth --- qemu-deprecated.texi | 5 +++++ qemu-options.hx | 3 ++- vl.c | 4 ++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/qemu-deprecated.texi b/qemu-deprecated.texi index 842e71b..1a821b6 100644 --- a/qemu-deprecated.texi +++ b/qemu-deprecated.texi @@ -72,6 +72,11 @@ backend settings instead of environment variables. To ease migration to the new format, the ``-audiodev-help'' option can be used to convert the current values of the environment variables to ``-audiodev'' options. +@subsection -virtfs_synth (since 4.1) + +The ``-virtfs_synth'' argument is now deprecated. Please use ``-fsdev synth'' +and ``-device virtio-9p-...'' instead. + @section QEMU Machine Protocol (QMP) commands @subsection block-dirty-bitmap-add "autoload" parameter (since 2.12.0) diff --git a/qemu-options.hx b/qemu-options.hx index 3faa935..e54c565 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -1368,7 +1368,8 @@ DEF("virtfs_synth", 0, QEMU_OPTION_virtfs_synth, STEXI @item -virtfs_synth @findex -virtfs_synth -Create synthetic file system image +Create synthetic file system image. Note that this option is now deprecated. +Please use @code{-fsdev synth} and @code{-device virtio-9p-...} instead. ETEXI DEF("iscsi", HAS_ARG, QEMU_OPTION_iscsi, diff --git a/vl.c b/vl.c index b670951..8456f00 100644 --- a/vl.c +++ b/vl.c @@ -3535,6 +3535,10 @@ int main(int argc, char **argv, char **envp) QemuOpts *fsdev; QemuOpts *device; + warn_report("'-virtfs_synth' is deprecated, please use " + "'-fsdev synth' and '-device virtio-9p-...' " + "instead"); + fsdev = qemu_opts_create(qemu_find_opts("fsdev"), "v_synth", 1, NULL); if (!fsdev) { -- cgit v1.1 From b44a6b09705e9e8a3005229b58de36d176020548 Mon Sep 17 00:00:00 2001 From: Greg Kurz Date: Fri, 17 May 2019 17:34:49 +0200 Subject: virtfs: Fix documentation of -fsdev and -virtfs This fixes several things: - add "id" description to -virtfs documentation - split the description into several lines in both usage and documentation for accurateness and clarity - add documentation and usage of the synth fsdriver - add "throttling.*" description to -fsdev local - add some missing periods - add proper reference to the virtfs-proxy-helper(1) manual page - document that the virtio device may be either virtio-9p-pci, virtio-9p-ccw or virtio-9p-device, depending on the machine type Buglink: https://bugs.launchpad.net/qemu/+bug/1581976 Signed-off-by: Greg Kurz Acked-by: Thomas Huth --- qemu-options.hx | 93 ++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 66 insertions(+), 27 deletions(-) diff --git a/qemu-options.hx b/qemu-options.hx index e54c565..5daa5a8 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -1232,26 +1232,35 @@ the write back by pressing @key{C-a s} (@pxref{disk_images}). ETEXI DEF("fsdev", HAS_ARG, QEMU_OPTION_fsdev, - "-fsdev fsdriver,id=id[,path=path,][security_model={mapped-xattr|mapped-file|passthrough|none}]\n" - " [,writeout=immediate][,readonly][,socket=socket|sock_fd=sock_fd][,fmode=fmode][,dmode=dmode]\n" + "-fsdev local,id=id,path=path,security_model=mapped-xattr|mapped-file|passthrough|none\n" + " [,writeout=immediate][,readonly][,fmode=fmode][,dmode=dmode]\n" " [[,throttling.bps-total=b]|[[,throttling.bps-read=r][,throttling.bps-write=w]]]\n" " [[,throttling.iops-total=i]|[[,throttling.iops-read=r][,throttling.iops-write=w]]]\n" " [[,throttling.bps-total-max=bm]|[[,throttling.bps-read-max=rm][,throttling.bps-write-max=wm]]]\n" " [[,throttling.iops-total-max=im]|[[,throttling.iops-read-max=irm][,throttling.iops-write-max=iwm]]]\n" - " [[,throttling.iops-size=is]]\n", + " [[,throttling.iops-size=is]]\n" + "-fsdev proxy,id=id,socket=socket[,writeout=immediate][,readonly]\n" + "-fsdev proxy,id=id,sock_fd=sock_fd[,writeout=immediate][,readonly]\n" + "-fsdev synth,id=id\n", QEMU_ARCH_ALL) STEXI -@item -fsdev @var{fsdriver},id=@var{id},path=@var{path},[security_model=@var{security_model}][,writeout=@var{writeout}][,readonly][,socket=@var{socket}|sock_fd=@var{sock_fd}][,fmode=@var{fmode}][,dmode=@var{dmode}] +@item -fsdev local,id=@var{id},path=@var{path},security_model=@var{security_model} [,writeout=@var{writeout}][,readonly][,fmode=@var{fmode}][,dmode=@var{dmode}] [,throttling.@var{option}=@var{value}[,throttling.@var{option}=@var{value}[,...]]] +@itemx -fsdev proxy,id=@var{id},socket=@var{socket}[,writeout=@var{writeout}][,readonly] +@itemx -fsdev proxy,id=@var{id},sock_fd=@var{sock_fd}[,writeout=@var{writeout}][,readonly] +@itemx -fsdev synth,id=@var{id}[,readonly] @findex -fsdev Define a new file system device. Valid options are: @table @option -@item @var{fsdriver} -This option specifies the fs driver backend to use. -Currently "local" and "proxy" file system drivers are supported. +@item local +Accesses to the filesystem are done by QEMU. +@item proxy +Accesses to the filesystem are done by virtfs-proxy-helper(1). +@item synth +Synthetic filesystem, only used by QTests. @item id=@var{id} -Specifies identifier for this device +Specifies identifier for this device. @item path=@var{path} Specifies the export path for the file system device. Files under this path will be available to the 9p client on the guest. @@ -1279,48 +1288,76 @@ Enables exporting 9p share as a readonly mount for guests. By default read-write access is given. @item socket=@var{socket} Enables proxy filesystem driver to use passed socket file for communicating -with virtfs-proxy-helper +with virtfs-proxy-helper(1). @item sock_fd=@var{sock_fd} Enables proxy filesystem driver to use passed socket descriptor for -communicating with virtfs-proxy-helper. Usually a helper like libvirt -will create socketpair and pass one of the fds as sock_fd +communicating with virtfs-proxy-helper(1). Usually a helper like libvirt +will create socketpair and pass one of the fds as sock_fd. @item fmode=@var{fmode} Specifies the default mode for newly created files on the host. Works only with security models "mapped-xattr" and "mapped-file". @item dmode=@var{dmode} Specifies the default mode for newly created directories on the host. Works only with security models "mapped-xattr" and "mapped-file". +@item throttling.bps-total=@var{b},throttling.bps-read=@var{r},throttling.bps-write=@var{w} +Specify bandwidth throttling limits in bytes per second, either for all request +types or for reads or writes only. +@item throttling.bps-total-max=@var{bm},bps-read-max=@var{rm},bps-write-max=@var{wm} +Specify bursts in bytes per second, either for all request types or for reads +or writes only. Bursts allow the guest I/O to spike above the limit +temporarily. +@item throttling.iops-total=@var{i},throttling.iops-read=@var{r}, throttling.iops-write=@var{w} +Specify request rate limits in requests per second, either for all request +types or for reads or writes only. +@item throttling.iops-total-max=@var{im},throttling.iops-read-max=@var{irm}, throttling.iops-write-max=@var{iwm} +Specify bursts in requests per second, either for all request types or for reads +or writes only. Bursts allow the guest I/O to spike above the limit temporarily. +@item throttling.iops-size=@var{is} +Let every @var{is} bytes of a request count as a new request for iops +throttling purposes. @end table --fsdev option is used along with -device driver "virtio-9p-pci". -@item -device virtio-9p-pci,fsdev=@var{id},mount_tag=@var{mount_tag} -Options for virtio-9p-pci driver are: +-fsdev option is used along with -device driver "virtio-9p-...". +@item -device virtio-9p-@var{type},fsdev=@var{id},mount_tag=@var{mount_tag} +Options for virtio-9p-... driver are: @table @option +@item @var{type} +Specifies the variant to be used. Supported values are "pci", "ccw" or "device", +depending on the machine type. @item fsdev=@var{id} -Specifies the id value specified along with -fsdev option +Specifies the id value specified along with -fsdev option. @item mount_tag=@var{mount_tag} -Specifies the tag name to be used by the guest to mount this export point +Specifies the tag name to be used by the guest to mount this export point. @end table ETEXI DEF("virtfs", HAS_ARG, QEMU_OPTION_virtfs, - "-virtfs local,path=path,mount_tag=tag,security_model=[mapped-xattr|mapped-file|passthrough|none]\n" - " [,id=id][,writeout=immediate][,readonly][,socket=socket|sock_fd=sock_fd][,fmode=fmode][,dmode=dmode]\n", + "-virtfs local,path=path,mount_tag=tag,security_model=mapped-xattr|mapped-file|passthrough|none\n" + " [,id=id][,writeout=immediate][,readonly][,fmode=fmode][,dmode=dmode]\n" + "-virtfs proxy,mount_tag=tag,socket=socket[,id=id][,writeout=immediate][,readonly]\n" + "-virtfs proxy,mount_tag=tag,sock_fd=sock_fd[,id=id][,writeout=immediate][,readonly]\n" + "-virtfs synth,mount_tag=tag[,id=id][,readonly]\n", QEMU_ARCH_ALL) STEXI -@item -virtfs @var{fsdriver}[,path=@var{path}],mount_tag=@var{mount_tag}[,security_model=@var{security_model}][,writeout=@var{writeout}][,readonly][,socket=@var{socket}|sock_fd=@var{sock_fd}][,fmode=@var{fmode}][,dmode=@var{dmode}] +@item -virtfs local,path=@var{path},mount_tag=@var{mount_tag} ,security_model=@var{security_model}[,writeout=@var{writeout}][,readonly] [,fmode=@var{fmode}][,dmode=@var{dmode}] +@itemx -virtfs proxy,socket=@var{socket},mount_tag=@var{mount_tag} [,writeout=@var{writeout}][,readonly] +@itemx -virtfs proxy,sock_fd=@var{sock_fd},mount_tag=@var{mount_tag} [,writeout=@var{writeout}][,readonly] +@itemx -virtfs synth,mount_tag=@var{mount_tag} @findex -virtfs -The general form of a Virtual File system pass-through options are: +Define a new filesystem device and expose it to the guest using a virtio-9p-device. The general form of a Virtual File system pass-through options are: @table @option -@item @var{fsdriver} -This option specifies the fs driver backend to use. -Currently "local" and "proxy" file system drivers are supported. +@item local +Accesses to the filesystem are done by QEMU. +@item proxy +Accesses to the filesystem are done by virtfs-proxy-helper(1). +@item synth +Synthetic filesystem, only used by QTests. @item id=@var{id} -Specifies identifier for this device +Specifies identifier for the filesystem device @item path=@var{path} Specifies the export path for the file system device. Files under this path will be available to the 9p client on the guest. @@ -1348,17 +1385,19 @@ Enables exporting 9p share as a readonly mount for guests. By default read-write access is given. @item socket=@var{socket} Enables proxy filesystem driver to use passed socket file for -communicating with virtfs-proxy-helper. Usually a helper like libvirt -will create socketpair and pass one of the fds as sock_fd +communicating with virtfs-proxy-helper(1). Usually a helper like libvirt +will create socketpair and pass one of the fds as sock_fd. @item sock_fd Enables proxy filesystem driver to use passed 'sock_fd' as the socket -descriptor for interfacing with virtfs-proxy-helper +descriptor for interfacing with virtfs-proxy-helper(1). @item fmode=@var{fmode} Specifies the default mode for newly created files on the host. Works only with security models "mapped-xattr" and "mapped-file". @item dmode=@var{dmode} Specifies the default mode for newly created directories on the host. Works only with security models "mapped-xattr" and "mapped-file". +@item mount_tag=@var{mount_tag} +Specifies the tag name to be used by the guest to mount this export point. @end table ETEXI -- cgit v1.1