Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[cascardo/linux.git] / fs / proc / base.c
index b4fe0ee..772efa4 100644 (file)
@@ -376,37 +376,6 @@ static const struct file_operations proc_lstats_operations = {
 
 #endif
 
-#ifdef CONFIG_CGROUPS
-static int cgroup_open(struct inode *inode, struct file *file)
-{
-       struct pid *pid = PROC_I(inode)->pid;
-       return single_open(file, proc_cgroup_show, pid);
-}
-
-static const struct file_operations proc_cgroup_operations = {
-       .open           = cgroup_open,
-       .read           = seq_read,
-       .llseek         = seq_lseek,
-       .release        = single_release,
-};
-#endif
-
-#ifdef CONFIG_PROC_PID_CPUSET
-
-static int cpuset_open(struct inode *inode, struct file *file)
-{
-       struct pid *pid = PROC_I(inode)->pid;
-       return single_open(file, proc_cpuset_show, pid);
-}
-
-static const struct file_operations proc_cpuset_operations = {
-       .open           = cpuset_open,
-       .read           = seq_read,
-       .llseek         = seq_lseek,
-       .release        = single_release,
-};
-#endif
-
 static int proc_oom_score(struct seq_file *m, struct pid_namespace *ns,
                          struct pid *pid, struct task_struct *task)
 {
@@ -632,29 +601,35 @@ static const struct file_operations proc_single_file_operations = {
        .release        = single_release,
 };
 
-static int __mem_open(struct inode *inode, struct file *file, unsigned int mode)
+
+struct mm_struct *proc_mem_open(struct inode *inode, unsigned int mode)
 {
-       struct task_struct *task = get_proc_task(file_inode(file));
-       struct mm_struct *mm;
+       struct task_struct *task = get_proc_task(inode);
+       struct mm_struct *mm = ERR_PTR(-ESRCH);
 
-       if (!task)
-               return -ESRCH;
+       if (task) {
+               mm = mm_access(task, mode);
+               put_task_struct(task);
 
-       mm = mm_access(task, mode);
-       put_task_struct(task);
+               if (!IS_ERR_OR_NULL(mm)) {
+                       /* ensure this mm_struct can't be freed */
+                       atomic_inc(&mm->mm_count);
+                       /* but do not pin its memory */
+                       mmput(mm);
+               }
+       }
+
+       return mm;
+}
+
+static int __mem_open(struct inode *inode, struct file *file, unsigned int mode)
+{
+       struct mm_struct *mm = proc_mem_open(inode, mode);
 
        if (IS_ERR(mm))
                return PTR_ERR(mm);
 
-       if (mm) {
-               /* ensure this mm_struct can't be freed */
-               atomic_inc(&mm->mm_count);
-               /* but do not pin its memory */
-               mmput(mm);
-       }
-
        file->private_data = mm;
-
        return 0;
 }
 
@@ -2569,10 +2544,10 @@ static const struct pid_entry tgid_base_stuff[] = {
        REG("latency",  S_IRUGO, proc_lstats_operations),
 #endif
 #ifdef CONFIG_PROC_PID_CPUSET
-       REG("cpuset",     S_IRUGO, proc_cpuset_operations),
+       ONE("cpuset",     S_IRUGO, proc_cpuset_show),
 #endif
 #ifdef CONFIG_CGROUPS
-       REG("cgroup",  S_IRUGO, proc_cgroup_operations),
+       ONE("cgroup",  S_IRUGO, proc_cgroup_show),
 #endif
        ONE("oom_score",  S_IRUGO, proc_oom_score),
        REG("oom_adj",    S_IRUGO|S_IWUSR, proc_oom_adj_operations),
@@ -2639,8 +2614,7 @@ static void proc_flush_task_mnt(struct vfsmount *mnt, pid_t pid, pid_t tgid)
        /* no ->d_hash() rejects on procfs */
        dentry = d_hash_and_lookup(mnt->mnt_root, &name);
        if (dentry) {
-               shrink_dcache_parent(dentry);
-               d_drop(dentry);
+               d_invalidate(dentry);
                dput(dentry);
        }
 
@@ -2660,8 +2634,7 @@ static void proc_flush_task_mnt(struct vfsmount *mnt, pid_t pid, pid_t tgid)
        name.len = snprintf(buf, sizeof(buf), "%d", pid);
        dentry = d_hash_and_lookup(dir, &name);
        if (dentry) {
-               shrink_dcache_parent(dentry);
-               d_drop(dentry);
+               d_invalidate(dentry);
                dput(dentry);
        }
 
@@ -2915,10 +2888,10 @@ static const struct pid_entry tid_base_stuff[] = {
        REG("latency",  S_IRUGO, proc_lstats_operations),
 #endif
 #ifdef CONFIG_PROC_PID_CPUSET
-       REG("cpuset",    S_IRUGO, proc_cpuset_operations),
+       ONE("cpuset",    S_IRUGO, proc_cpuset_show),
 #endif
 #ifdef CONFIG_CGROUPS
-       REG("cgroup",  S_IRUGO, proc_cgroup_operations),
+       ONE("cgroup",  S_IRUGO, proc_cgroup_show),
 #endif
        ONE("oom_score", S_IRUGO, proc_oom_score),
        REG("oom_adj",   S_IRUGO|S_IWUSR, proc_oom_adj_operations),