diff options
author | David Howells <dhowells@redhat.com> | 2017-07-05 11:25:37 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2017-07-11 06:08:58 -0400 |
commit | c4fac9100456995c10b65c13be84554258ed7fc8 (patch) | |
tree | ea395c955dfac2337eff1a4608caea5f3a26701b /fs/9p/v9fs.c | |
parent | 86a1da6d30ad727c2a9cc5d6a51bff6d830036b5 (diff) |
9p: Implement show_options
Implement the show_options superblock op for 9p as part of a bid to get
rid of s_options and generic_show_options() to make it easier to implement
a context-based mount where the mount options can be passed individually
over a file descriptor.
Signed-off-by: David Howells <dhowells@redhat.com>
cc: Eric Van Hensbergen <ericvh@gmail.com>
cc: Ron Minnich <rminnich@sandia.gov>
cc: Latchesar Ionkov <lucho@ionkov.net>
cc: v9fs-developer@lists.sourceforge.net
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/9p/v9fs.c')
-rw-r--r-- | fs/9p/v9fs.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/fs/9p/v9fs.c b/fs/9p/v9fs.c index c202930086ed..8fb89ddc6cc7 100644 --- a/fs/9p/v9fs.c +++ b/fs/9p/v9fs.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/parser.h> | 33 | #include <linux/parser.h> |
34 | #include <linux/idr.h> | 34 | #include <linux/idr.h> |
35 | #include <linux/slab.h> | 35 | #include <linux/slab.h> |
36 | #include <linux/seq_file.h> | ||
36 | #include <net/9p/9p.h> | 37 | #include <net/9p/9p.h> |
37 | #include <net/9p/client.h> | 38 | #include <net/9p/client.h> |
38 | #include <net/9p/transport.h> | 39 | #include <net/9p/transport.h> |
@@ -82,6 +83,13 @@ static const match_table_t tokens = { | |||
82 | {Opt_err, NULL} | 83 | {Opt_err, NULL} |
83 | }; | 84 | }; |
84 | 85 | ||
86 | static const char *const v9fs_cache_modes[nr__p9_cache_modes] = { | ||
87 | [CACHE_NONE] = "none", | ||
88 | [CACHE_MMAP] = "mmap", | ||
89 | [CACHE_LOOSE] = "loose", | ||
90 | [CACHE_FSCACHE] = "fscache", | ||
91 | }; | ||
92 | |||
85 | /* Interpret mount options for cache mode */ | 93 | /* Interpret mount options for cache mode */ |
86 | static int get_cache_mode(char *s) | 94 | static int get_cache_mode(char *s) |
87 | { | 95 | { |
@@ -104,6 +112,58 @@ static int get_cache_mode(char *s) | |||
104 | return version; | 112 | return version; |
105 | } | 113 | } |
106 | 114 | ||
115 | /* | ||
116 | * Display the mount options in /proc/mounts. | ||
117 | */ | ||
118 | int v9fs_show_options(struct seq_file *m, struct dentry *root) | ||
119 | { | ||
120 | struct v9fs_session_info *v9ses = root->d_sb->s_fs_info; | ||
121 | |||
122 | if (v9ses->debug) | ||
123 | seq_printf(m, ",debug=%x", v9ses->debug); | ||
124 | if (!uid_eq(v9ses->dfltuid, V9FS_DEFUID)) | ||
125 | seq_printf(m, ",dfltuid=%u", | ||
126 | from_kuid_munged(&init_user_ns, v9ses->dfltuid)); | ||
127 | if (!gid_eq(v9ses->dfltgid, V9FS_DEFGID)) | ||
128 | seq_printf(m, ",dfltgid=%u", | ||
129 | from_kgid_munged(&init_user_ns, v9ses->dfltgid)); | ||
130 | if (v9ses->afid != ~0) | ||
131 | seq_printf(m, ",afid=%u", v9ses->afid); | ||
132 | if (strcmp(v9ses->uname, V9FS_DEFUSER) != 0) | ||
133 | seq_printf(m, ",uname=%s", v9ses->uname); | ||
134 | if (strcmp(v9ses->aname, V9FS_DEFANAME) != 0) | ||
135 | seq_printf(m, ",aname=%s", v9ses->aname); | ||
136 | if (v9ses->nodev) | ||
137 | seq_puts(m, ",nodevmap"); | ||
138 | if (v9ses->cache) | ||
139 | seq_printf(m, ",%s", v9fs_cache_modes[v9ses->cache]); | ||
140 | #ifdef CONFIG_9P_FSCACHE | ||
141 | if (v9ses->cachetag && v9ses->cache == CACHE_FSCACHE) | ||
142 | seq_printf(m, ",cachetag=%s", v9ses->cachetag); | ||
143 | #endif | ||
144 | |||
145 | switch (v9ses->flags & V9FS_ACCESS_MASK) { | ||
146 | case V9FS_ACCESS_USER: | ||
147 | seq_puts(m, ",access=user"); | ||
148 | break; | ||
149 | case V9FS_ACCESS_ANY: | ||
150 | seq_puts(m, ",access=any"); | ||
151 | break; | ||
152 | case V9FS_ACCESS_CLIENT: | ||
153 | seq_puts(m, ",access=client"); | ||
154 | break; | ||
155 | case V9FS_ACCESS_SINGLE: | ||
156 | seq_printf(m, ",access=%u", | ||
157 | from_kuid_munged(&init_user_ns, v9ses->uid)); | ||
158 | break; | ||
159 | } | ||
160 | |||
161 | if (v9ses->flags & V9FS_POSIX_ACL) | ||
162 | seq_puts(m, ",posixacl"); | ||
163 | |||
164 | return p9_show_client_options(m, v9ses->clnt); | ||
165 | } | ||
166 | |||
107 | /** | 167 | /** |
108 | * v9fs_parse_options - parse mount options into session structure | 168 | * v9fs_parse_options - parse mount options into session structure |
109 | * @v9ses: existing v9fs session information | 169 | * @v9ses: existing v9fs session information |
@@ -230,6 +290,7 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts) | |||
230 | break; | 290 | break; |
231 | case Opt_cachetag: | 291 | case Opt_cachetag: |
232 | #ifdef CONFIG_9P_FSCACHE | 292 | #ifdef CONFIG_9P_FSCACHE |
293 | kfree(v9ses->cachetag); | ||
233 | v9ses->cachetag = match_strdup(&args[0]); | 294 | v9ses->cachetag = match_strdup(&args[0]); |
234 | #endif | 295 | #endif |
235 | break; | 296 | break; |