[PATCH 05/21] userns: Make seq_file's user namespace accessible

Eric W. Biederman ebiederm at xmission.com
Mon Aug 13 20:18:19 UTC 2012

From: "Eric W. Biederman" <ebiederm at xmission.com>

struct file already has a user namespace associated with it
in file->f_cred->user_ns, unfortunately because struct
seq_file has no struct file backpointer associated with
it, it is difficult to get at the user namespace in seq_file
context.  Therefore add a helper function seq_user_ns to return
the associated user namespace and a user_ns field to struct
seq_file to be used in implementing seq_user_ns.

Cc: Al Viro <viro at ZenIV.linux.org.uk>
Cc: Eric Dumazet <eric.dumazet at gmail.com>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu at jp.fujitsu.com>
Cc: Alexey Dobriyan <adobriyan at gmail.com>
Acked-by: Serge Hallyn <serge.hallyn at canonical.com>
Signed-off-by: Eric W. Biederman <ebiederm at xmission.com>
 fs/seq_file.c            |    4 ++++
 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 14cf9de..99dffab 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));
 	p->op = op;
+	p->user_ns = file->f_cred->user_ns;
 	 * 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 83c44ee..68a04a3 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;
+	struct user_namespace *user_ns;
 	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)
+	return seq->user_ns;
+	extern struct user_namespace init_user_ns;
+	return &init_user_ns;
 #define SEQ_START_TOKEN ((void *)1)
  * Helpers for iteration over list_head-s in seq_files

More information about the Containers mailing list