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>
This commit is contained in:
61
fs/9p/v9fs.c
61
fs/9p/v9fs.c
@@ -33,6 +33,7 @@
|
||||
#include <linux/parser.h>
|
||||
#include <linux/idr.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <net/9p/9p.h>
|
||||
#include <net/9p/client.h>
|
||||
#include <net/9p/transport.h>
|
||||
@@ -82,6 +83,13 @@ static const match_table_t tokens = {
|
||||
{Opt_err, NULL}
|
||||
};
|
||||
|
||||
static const char *const v9fs_cache_modes[nr__p9_cache_modes] = {
|
||||
[CACHE_NONE] = "none",
|
||||
[CACHE_MMAP] = "mmap",
|
||||
[CACHE_LOOSE] = "loose",
|
||||
[CACHE_FSCACHE] = "fscache",
|
||||
};
|
||||
|
||||
/* Interpret mount options for cache mode */
|
||||
static int get_cache_mode(char *s)
|
||||
{
|
||||
@@ -104,6 +112,58 @@ static int get_cache_mode(char *s)
|
||||
return version;
|
||||
}
|
||||
|
||||
/*
|
||||
* Display the mount options in /proc/mounts.
|
||||
*/
|
||||
int v9fs_show_options(struct seq_file *m, struct dentry *root)
|
||||
{
|
||||
struct v9fs_session_info *v9ses = root->d_sb->s_fs_info;
|
||||
|
||||
if (v9ses->debug)
|
||||
seq_printf(m, ",debug=%x", v9ses->debug);
|
||||
if (!uid_eq(v9ses->dfltuid, V9FS_DEFUID))
|
||||
seq_printf(m, ",dfltuid=%u",
|
||||
from_kuid_munged(&init_user_ns, v9ses->dfltuid));
|
||||
if (!gid_eq(v9ses->dfltgid, V9FS_DEFGID))
|
||||
seq_printf(m, ",dfltgid=%u",
|
||||
from_kgid_munged(&init_user_ns, v9ses->dfltgid));
|
||||
if (v9ses->afid != ~0)
|
||||
seq_printf(m, ",afid=%u", v9ses->afid);
|
||||
if (strcmp(v9ses->uname, V9FS_DEFUSER) != 0)
|
||||
seq_printf(m, ",uname=%s", v9ses->uname);
|
||||
if (strcmp(v9ses->aname, V9FS_DEFANAME) != 0)
|
||||
seq_printf(m, ",aname=%s", v9ses->aname);
|
||||
if (v9ses->nodev)
|
||||
seq_puts(m, ",nodevmap");
|
||||
if (v9ses->cache)
|
||||
seq_printf(m, ",%s", v9fs_cache_modes[v9ses->cache]);
|
||||
#ifdef CONFIG_9P_FSCACHE
|
||||
if (v9ses->cachetag && v9ses->cache == CACHE_FSCACHE)
|
||||
seq_printf(m, ",cachetag=%s", v9ses->cachetag);
|
||||
#endif
|
||||
|
||||
switch (v9ses->flags & V9FS_ACCESS_MASK) {
|
||||
case V9FS_ACCESS_USER:
|
||||
seq_puts(m, ",access=user");
|
||||
break;
|
||||
case V9FS_ACCESS_ANY:
|
||||
seq_puts(m, ",access=any");
|
||||
break;
|
||||
case V9FS_ACCESS_CLIENT:
|
||||
seq_puts(m, ",access=client");
|
||||
break;
|
||||
case V9FS_ACCESS_SINGLE:
|
||||
seq_printf(m, ",access=%u",
|
||||
from_kuid_munged(&init_user_ns, v9ses->uid));
|
||||
break;
|
||||
}
|
||||
|
||||
if (v9ses->flags & V9FS_POSIX_ACL)
|
||||
seq_puts(m, ",posixacl");
|
||||
|
||||
return p9_show_client_options(m, v9ses->clnt);
|
||||
}
|
||||
|
||||
/**
|
||||
* v9fs_parse_options - parse mount options into session structure
|
||||
* @v9ses: existing v9fs session information
|
||||
@@ -230,6 +290,7 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts)
|
||||
break;
|
||||
case Opt_cachetag:
|
||||
#ifdef CONFIG_9P_FSCACHE
|
||||
kfree(v9ses->cachetag);
|
||||
v9ses->cachetag = match_strdup(&args[0]);
|
||||
#endif
|
||||
break;
|
||||
|
@@ -67,6 +67,7 @@ enum p9_cache_modes {
|
||||
CACHE_MMAP,
|
||||
CACHE_LOOSE,
|
||||
CACHE_FSCACHE,
|
||||
nr__p9_cache_modes
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -137,6 +138,8 @@ static inline struct v9fs_inode *V9FS_I(const struct inode *inode)
|
||||
return container_of(inode, struct v9fs_inode, vfs_inode);
|
||||
}
|
||||
|
||||
extern int v9fs_show_options(struct seq_file *m, struct dentry *root);
|
||||
|
||||
struct p9_fid *v9fs_session_init(struct v9fs_session_info *, const char *,
|
||||
char *);
|
||||
extern void v9fs_session_close(struct v9fs_session_info *v9ses);
|
||||
|
@@ -33,7 +33,6 @@
|
||||
#include <linux/string.h>
|
||||
#include <linux/inet.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/mount.h>
|
||||
#include <linux/idr.h>
|
||||
#include <linux/sched.h>
|
||||
@@ -104,7 +103,6 @@ v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses,
|
||||
sb->s_flags |= MS_POSIXACL;
|
||||
#endif
|
||||
|
||||
save_mount_options(sb, data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -349,7 +347,7 @@ static const struct super_operations v9fs_super_ops = {
|
||||
.destroy_inode = v9fs_destroy_inode,
|
||||
.statfs = simple_statfs,
|
||||
.evict_inode = v9fs_evict_inode,
|
||||
.show_options = generic_show_options,
|
||||
.show_options = v9fs_show_options,
|
||||
.umount_begin = v9fs_umount_begin,
|
||||
.write_inode = v9fs_write_inode,
|
||||
};
|
||||
@@ -360,7 +358,7 @@ static const struct super_operations v9fs_super_ops_dotl = {
|
||||
.statfs = v9fs_statfs,
|
||||
.drop_inode = v9fs_drop_inode,
|
||||
.evict_inode = v9fs_evict_inode,
|
||||
.show_options = generic_show_options,
|
||||
.show_options = v9fs_show_options,
|
||||
.umount_begin = v9fs_umount_begin,
|
||||
.write_inode = v9fs_write_inode_dotl,
|
||||
};
|
||||
|
Reference in New Issue
Block a user