@@ -402,6 +402,7 @@ static const struct file_operations cifs_multiuser_mount_proc_fops;
static const struct file_operations cifs_security_flags_proc_fops;
static const struct file_operations cifs_experimental_proc_fops;
static const struct file_operations cifs_linux_ext_proc_fops;
+static const struct file_operations cifs_feat_proc_fops;
void
cifs_proc_init(void)
@@ -428,6 +429,8 @@ cifs_proc_init(void)
&cifs_security_flags_proc_fops);
proc_create("LookupCacheEnabled", 0, proc_fs_cifs,
&cifs_lookup_cache_proc_fops);
+ proc_create("features", 0, proc_fs_cifs,
+ &cifs_feat_proc_fops);
}
void
@@ -448,6 +451,7 @@ cifs_proc_clean(void)
remove_proc_entry("LinuxExtensionsEnabled", proc_fs_cifs);
remove_proc_entry("Experimental", proc_fs_cifs);
remove_proc_entry("LookupCacheEnabled", proc_fs_cifs);
+ remove_proc_entry("features", proc_fs_cifs);
remove_proc_entry("fs/cifs", NULL);
}
@@ -791,6 +795,38 @@ static const struct file_operations cifs_security_flags_proc_fops = {
.release = single_release,
.write = cifs_security_flags_proc_write,
};
+
+static int cifs_feat_proc_show(struct seq_file *m, void *v)
+{
+ seq_printf(m, "# CIFS features enabled\n");
+#ifdef CONFIG_CIFS_DFS_UPCALL
+ seq_printf(m, "dfs");
+ seq_putc(m, ' ');
+#endif
+#ifdef CONFIG_CIFS_UPCALL
+ seq_printf(m, "spnego");
+ seq_putc(m, ' ');
+#endif
+#ifdef CONFIG_CIFS_FSCACHE
+ seq_printf(m, "fsc");
+ seq_putc(m, ' ');
+#endif
+ seq_putc(m, '\n');
+ return 0;
+}
+
+static int cifs_feat_proc_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, cifs_feat_proc_show, NULL);
+}
+
+static const struct file_operations cifs_feat_proc_fops = {
+ .owner = THIS_MODULE,
+ .open = cifs_feat_proc_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
#else
inline void cifs_proc_init(void)
{