Subject: [PATCH] proc pspace bugfixes From: Eric W. Biederman Date: 1130706758 -0700 - Correctly reference count proc_root - In /proc/loadavg use the global nr_threads instead of the pspace local version - In /proc/loadavg harden the display so it will still work after the pspace has exited. --- fs/proc/base.c | 3 ++- fs/proc/inode.c | 7 ------- fs/proc/internal.h | 7 +++++++ 3 files changed, 9 insertions(+), 8 deletions(-) bff9c177e575b264d8a616f87393d8d1d6e7d67f diff --git a/fs/proc/base.c b/fs/proc/base.c index 7468211..7ad13ee 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -1154,7 +1154,7 @@ static int proc_loadavg(struct task_stru LOAD_INT(a), LOAD_FRAC(a), LOAD_INT(b), LOAD_FRAC(b), LOAD_INT(c), LOAD_FRAC(c), - nr_running(), pspace->nr_threads, pspace->last_pid); + nr_running(), nr_threads, pspace? pspace->last_pid : 0); return len; } @@ -1542,6 +1542,7 @@ struct inode *proc_pspace_make_inode(str inode->i_nlink = proc_root.nlink; inode->i_mode = S_IFDIR|S_IRUGO|S_IXUGO; ei->pde = &proc_root; + de_get(ei->pde); } return inode; } diff --git a/fs/proc/inode.c b/fs/proc/inode.c index 2fb25f7..a9b3a73 100644 --- a/fs/proc/inode.c +++ b/fs/proc/inode.c @@ -22,13 +22,6 @@ #include -static inline struct proc_dir_entry * de_get(struct proc_dir_entry *de) -{ - if (de) - atomic_inc(&de->count); - return de; -} - /* * Decrements the use count and checks for deferred deletion. */ diff --git a/fs/proc/internal.h b/fs/proc/internal.h index 715d479..c1ec992 100644 --- a/fs/proc/internal.h +++ b/fs/proc/internal.h @@ -57,3 +57,10 @@ extern void free_proc_entry(struct proc_ extern struct inode *proc_pspace_make_inode(struct super_block *sb, struct pspace *pspace); +static inline struct proc_dir_entry * de_get(struct proc_dir_entry *de) +{ + if (de) + atomic_inc(&de->count); + return de; +} + -- 1.0.GIT