diff options
| -rw-r--r-- | fs/seq_file.c | 4 | ||||
| -rw-r--r-- | include/linux/seq_file.h | 14 | 
2 files changed, 18 insertions, 0 deletions
diff --git a/fs/seq_file.c b/fs/seq_file.c index 14cf9de1dbe..99dffab4c4e 100644 --- a/fs/seq_file.c +++ b/fs/seq_file.c @@ -9,6 +9,7 @@  #include <linux/export.h>  #include <linux/seq_file.h>  #include <linux/slab.h> +#include <linux/cred.h>  #include <asm/uaccess.h>  #include <asm/page.h> @@ -56,6 +57,9 @@ int seq_open(struct file *file, const struct seq_operations *op)  	memset(p, 0, sizeof(*p));  	mutex_init(&p->lock);  	p->op = op; +#ifdef CONFIG_USER_NS +	p->user_ns = file->f_cred->user_ns; +#endif  	/*  	 * Wrappers around seq_open(e.g. swaps_open) need to be diff --git a/include/linux/seq_file.h b/include/linux/seq_file.h index 83c44eefe69..68a04a343ca 100644 --- a/include/linux/seq_file.h +++ b/include/linux/seq_file.h @@ -13,6 +13,7 @@ struct file;  struct path;  struct inode;  struct dentry; +struct user_namespace;  struct seq_file {  	char *buf; @@ -25,6 +26,9 @@ struct seq_file {  	struct mutex lock;  	const struct seq_operations *op;  	int poll_event; +#ifdef CONFIG_USER_NS +	struct user_namespace *user_ns; +#endif  	void *private;  }; @@ -128,6 +132,16 @@ int seq_put_decimal_ull(struct seq_file *m, char delimiter,  int seq_put_decimal_ll(struct seq_file *m, char delimiter,  			long long num); +static inline struct user_namespace *seq_user_ns(struct seq_file *seq) +{ +#ifdef CONFIG_USER_NS +	return seq->user_ns; +#else +	extern struct user_namespace init_user_ns; +	return &init_user_ns; +#endif +} +  #define SEQ_START_TOKEN ((void *)1)  /*   * Helpers for iteration over list_head-s in seq_files  |