From e2be442e791fa1150aa835c684acc6d7189de3e1 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 4 Sep 2017 10:55:51 +0900 Subject: [PATCH] systemd-mount: allow to specify an arbitrary string for arg_mount_what when vfs is used Fixes #6591. --- src/basic/mount-util.c | 26 ++++++++++++++++++++++++++ src/basic/mount-util.h | 1 + src/mount/mount-tool.c | 8 +++++++- 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/basic/mount-util.c b/src/basic/mount-util.c index 7b9400b47c..cff44116c8 100644 --- a/src/basic/mount-util.c +++ b/src/basic/mount-util.c @@ -552,6 +552,32 @@ bool fstype_is_network(const char *fstype) { return nulstr_contains(table, fstype); } +bool fstype_is_api_vfs(const char *fstype) { + static const char table[] = + "autofs\0" + "bpf\0" + "cgroup\0" + "cgroup2\0" + "configfs\0" + "cpuset\0" + "debugfs\0" + "devpts\0" + "devtmpfs\0" + "efivarfs\0" + "hugetlbfs\0" + "mqueue\0" + "proc\0" + "pstore\0" + "ramfs\0" + "securityfs\0" + "sysfs\0" + "tmpfs\0" + "tracefs\0" + ; + + return nulstr_contains(table, fstype); +} + int repeat_unmount(const char *path, int flags) { bool done = false; diff --git a/src/basic/mount-util.h b/src/basic/mount-util.h index 2e24a184c5..70af11c2ff 100644 --- a/src/basic/mount-util.h +++ b/src/basic/mount-util.h @@ -44,6 +44,7 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(FILE*, endmntent); #define _cleanup_endmntent_ _cleanup_(endmntentp) bool fstype_is_network(const char *fstype); +bool fstype_is_api_vfs(const char *fstype); union file_handle_union { struct file_handle handle; diff --git a/src/mount/mount-tool.c b/src/mount/mount-tool.c index 10bb5dda63..3c974addda 100644 --- a/src/mount/mount-tool.c +++ b/src/mount/mount-tool.c @@ -30,6 +30,7 @@ #include "fd-util.h" #include "fileio.h" #include "fstab-util.h" +#include "mount-util.h" #include "pager.h" #include "parse-util.h" #include "path-util.h" @@ -330,7 +331,12 @@ static int parse_argv(int argc, char *argv[]) { return -EINVAL; } - if (arg_transport == BUS_TRANSPORT_LOCAL) { + if (arg_mount_type && (fstype_is_api_vfs(arg_mount_type) || fstype_is_network(arg_mount_type))) { + arg_mount_what = strdup(argv[optind]); + if (!arg_mount_what) + return log_oom(); + + } else if (arg_transport == BUS_TRANSPORT_LOCAL) { _cleanup_free_ char *u = NULL, *p = NULL; u = fstab_node_to_udev_node(argv[optind]);