]> git.baikalelectronics.ru Git - kernel.git/commitdiff
cifs: export supported mount options via new mount_params /proc file
authorAurelien Aptel <aaptel@suse.com>
Thu, 18 Mar 2021 12:52:59 +0000 (13:52 +0100)
committerSteve French <stfrench@microsoft.com>
Sun, 25 Apr 2021 21:28:24 +0000 (16:28 -0500)
Can aid in making mount problems easier to diagnose

Signed-off-by: Aurelien Aptel <aaptel@suse.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifs/cifs_debug.c

index d8ae961a510fea1d1c332a448a03c2e60650a6a3..68e8e5b2784196270ce65acf7cfcf89defdae897 100644 (file)
@@ -17,6 +17,7 @@
 #include "cifsproto.h"
 #include "cifs_debug.h"
 #include "cifsfs.h"
+#include "fs_context.h"
 #ifdef CONFIG_CIFS_DFS_UPCALL
 #include "dfs_cache.h"
 #endif
@@ -696,6 +697,7 @@ static const struct proc_ops cifs_lookup_cache_proc_ops;
 static const struct proc_ops traceSMB_proc_ops;
 static const struct proc_ops cifs_security_flags_proc_ops;
 static const struct proc_ops cifs_linux_ext_proc_ops;
+static const struct proc_ops cifs_mount_params_proc_ops;
 
 void
 cifs_proc_init(void)
@@ -720,6 +722,8 @@ cifs_proc_init(void)
        proc_create("LookupCacheEnabled", 0644, proc_fs_cifs,
                    &cifs_lookup_cache_proc_ops);
 
+       proc_create("mount_params", 0444, proc_fs_cifs, &cifs_mount_params_proc_ops);
+
 #ifdef CONFIG_CIFS_DFS_UPCALL
        proc_create("dfscache", 0644, proc_fs_cifs, &dfscache_proc_ops);
 #endif
@@ -758,6 +762,7 @@ cifs_proc_clean(void)
        remove_proc_entry("SecurityFlags", proc_fs_cifs);
        remove_proc_entry("LinuxExtensionsEnabled", proc_fs_cifs);
        remove_proc_entry("LookupCacheEnabled", proc_fs_cifs);
+       remove_proc_entry("mount_params", proc_fs_cifs);
 
 #ifdef CONFIG_CIFS_DFS_UPCALL
        remove_proc_entry("dfscache", proc_fs_cifs);
@@ -1017,6 +1022,51 @@ static const struct proc_ops cifs_security_flags_proc_ops = {
        .proc_release   = single_release,
        .proc_write     = cifs_security_flags_proc_write,
 };
+
+/* To make it easier to debug, can help to show mount params */
+static int cifs_mount_params_proc_show(struct seq_file *m, void *v)
+{
+       const struct fs_parameter_spec *p;
+       const char *type;
+
+       for (p = smb3_fs_parameters; p->name; p++) {
+               /* cannot use switch with pointers... */
+               if (!p->type) {
+                       if (p->flags == fs_param_neg_with_no)
+                               type = "noflag";
+                       else
+                               type = "flag";
+               } else if (p->type == fs_param_is_bool)
+                       type = "bool";
+               else if (p->type == fs_param_is_u32)
+                       type = "u32";
+               else if (p->type == fs_param_is_u64)
+                       type = "u64";
+               else if (p->type == fs_param_is_string)
+                       type = "string";
+               else
+                       type = "unknown";
+
+               seq_printf(m, "%s:%s\n", p->name, type);
+       }
+
+       return 0;
+}
+
+static int cifs_mount_params_proc_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, cifs_mount_params_proc_show, NULL);
+}
+
+static const struct proc_ops cifs_mount_params_proc_ops = {
+       .proc_open      = cifs_mount_params_proc_open,
+       .proc_read      = seq_read,
+       .proc_lseek     = seq_lseek,
+       .proc_release   = single_release,
+       /* No need for write for now */
+       /* .proc_write  = cifs_mount_params_proc_write, */
+};
+
 #else
 inline void cifs_proc_init(void)
 {