]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - fs/9p/v9fs.c
Merge tag 'powerpc-4.13-3' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc...
[mirror_ubuntu-artful-kernel.git] / fs / 9p / v9fs.c
index c202930086edb6fd22e0645cdc5264071af28d1f..8fb89ddc6cc7ec3be59236cd5e493ffcc44719ae 100644 (file)
@@ -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;