]> git.proxmox.com Git - mirror_ubuntu-disco-kernel.git/commitdiff
proc: introduce a proc_pid_ns helper
authorChristoph Hellwig <hch@lst.de>
Wed, 16 May 2018 05:19:01 +0000 (07:19 +0200)
committerChristoph Hellwig <hch@lst.de>
Wed, 16 May 2018 05:23:35 +0000 (07:23 +0200)
Factor out retrieving the per-sb pid namespaces from the sb private data
into an easier to understand helper.

Suggested-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
fs/proc/array.c
fs/proc/base.c
fs/proc/self.c
fs/proc/thread_self.c
include/linux/proc_fs.h

index ae2c807fd719540312d18a94c7676ceb51b10f12..911f66924d813de2bf556014f82902758c347039 100644 (file)
@@ -677,12 +677,7 @@ out:
 
 static int children_seq_show(struct seq_file *seq, void *v)
 {
-       struct inode *inode = seq->private;
-       pid_t pid;
-
-       pid = pid_nr_ns(v, inode->i_sb->s_fs_info);
-       seq_printf(seq, "%d ", pid);
-
+       seq_printf(seq, "%d ", pid_nr_ns(v, proc_pid_ns(seq->private)));
        return 0;
 }
 
index 1b2ede6abcdfc97f1ab87244a18e0cb4c9035e5f..29237cad19fdc03b81f00e6a6b6680cb6cf814a3 100644 (file)
@@ -698,7 +698,7 @@ static bool has_pid_permissions(struct pid_namespace *pid,
 
 static int proc_pid_permission(struct inode *inode, int mask)
 {
-       struct pid_namespace *pid = inode->i_sb->s_fs_info;
+       struct pid_namespace *pid = proc_pid_ns(inode);
        struct task_struct *task;
        bool has_perms;
 
@@ -733,13 +733,11 @@ static const struct inode_operations proc_def_inode_operations = {
 static int proc_single_show(struct seq_file *m, void *v)
 {
        struct inode *inode = m->private;
-       struct pid_namespace *ns;
-       struct pid *pid;
+       struct pid_namespace *ns = proc_pid_ns(inode);
+       struct pid *pid = proc_pid(inode);
        struct task_struct *task;
        int ret;
 
-       ns = inode->i_sb->s_fs_info;
-       pid = proc_pid(inode);
        task = get_pid_task(pid, PIDTYPE_PID);
        if (!task)
                return -ESRCH;
@@ -1410,7 +1408,7 @@ static const struct file_operations proc_fail_nth_operations = {
 static int sched_show(struct seq_file *m, void *v)
 {
        struct inode *inode = m->private;
-       struct pid_namespace *ns = inode->i_sb->s_fs_info;
+       struct pid_namespace *ns = proc_pid_ns(inode);
        struct task_struct *p;
 
        p = get_proc_task(inode);
@@ -1782,8 +1780,8 @@ int pid_getattr(const struct path *path, struct kstat *stat,
                u32 request_mask, unsigned int query_flags)
 {
        struct inode *inode = d_inode(path->dentry);
+       struct pid_namespace *pid = proc_pid_ns(inode);
        struct task_struct *task;
-       struct pid_namespace *pid = path->dentry->d_sb->s_fs_info;
 
        generic_fillattr(inode, stat);
 
@@ -2337,7 +2335,7 @@ static int proc_timers_open(struct inode *inode, struct file *file)
                return -ENOMEM;
 
        tp->pid = proc_pid(inode);
-       tp->ns = inode->i_sb->s_fs_info;
+       tp->ns = proc_pid_ns(inode);
        return 0;
 }
 
@@ -3239,7 +3237,7 @@ retry:
 int proc_pid_readdir(struct file *file, struct dir_context *ctx)
 {
        struct tgid_iter iter;
-       struct pid_namespace *ns = file_inode(file)->i_sb->s_fs_info;
+       struct pid_namespace *ns = proc_pid_ns(file_inode(file));
        loff_t pos = ctx->pos;
 
        if (pos >= PID_MAX_LIMIT + TGID_OFFSET)
@@ -3588,7 +3586,7 @@ static int proc_task_readdir(struct file *file, struct dir_context *ctx)
        /* f_version caches the tgid value that the last readdir call couldn't
         * return. lseek aka telldir automagically resets f_version to 0.
         */
-       ns = inode->i_sb->s_fs_info;
+       ns = proc_pid_ns(inode);
        tid = (int)file->f_version;
        file->f_version = 0;
        for (task = first_tid(proc_pid(inode), tid, ctx->pos - 2, ns);
index 4d7d061696b3d81f8e43edfdce935bd4a97fd814..127265e5c55f81d1ec3d780dad1e7b23f86a8caf 100644 (file)
@@ -12,7 +12,7 @@ static const char *proc_self_get_link(struct dentry *dentry,
                                      struct inode *inode,
                                      struct delayed_call *done)
 {
-       struct pid_namespace *ns = inode->i_sb->s_fs_info;
+       struct pid_namespace *ns = proc_pid_ns(inode);
        pid_t tgid = task_tgid_nr_ns(current, ns);
        char *name;
 
@@ -36,7 +36,7 @@ static unsigned self_inum __ro_after_init;
 int proc_setup_self(struct super_block *s)
 {
        struct inode *root_inode = d_inode(s->s_root);
-       struct pid_namespace *ns = s->s_fs_info;
+       struct pid_namespace *ns = proc_pid_ns(root_inode);
        struct dentry *self;
        
        inode_lock(root_inode);
index 9d2efaca499fd0b136cc518a20babf8919ba18b6..b905010ca9ebafe098766a66af8f99d96e4f4237 100644 (file)
@@ -12,7 +12,7 @@ static const char *proc_thread_self_get_link(struct dentry *dentry,
                                             struct inode *inode,
                                             struct delayed_call *done)
 {
-       struct pid_namespace *ns = inode->i_sb->s_fs_info;
+       struct pid_namespace *ns = proc_pid_ns(inode);
        pid_t tgid = task_tgid_nr_ns(current, ns);
        pid_t pid = task_pid_nr_ns(current, ns);
        char *name;
@@ -36,7 +36,7 @@ static unsigned thread_self_inum __ro_after_init;
 int proc_setup_thread_self(struct super_block *s)
 {
        struct inode *root_inode = d_inode(s->s_root);
-       struct pid_namespace *ns = s->s_fs_info;
+       struct pid_namespace *ns = proc_pid_ns(root_inode);
        struct dentry *thread_self;
 
        inode_lock(root_inode);
index 928ef9e4d912513bcee0b366f4cf781d534d55cd..4edcde51063196088f1a6f97f6659f0175623ae8 100644 (file)
@@ -83,4 +83,10 @@ struct ns_common;
 int open_related_ns(struct ns_common *ns,
                   struct ns_common *(*get_ns)(struct ns_common *ns));
 
+/* get the associated pid namespace for a file in procfs */
+static inline struct pid_namespace *proc_pid_ns(struct inode *inode)
+{
+       return inode->i_sb->s_fs_info;
+}
+
 #endif /* _LINUX_PROC_FS_H */