Subject: [PATCH] pspace: fix hardlink counts in proc From: Eric W. Biederman Date: 1134575830 -0700 Fix the sysvipc directory Fix the /proc//task directory Fix /proc// to account for the addition of sysvipc Fix /proc//task/ to account for the addtion of sysvipc --- fs/proc/base.c | 25 +++++++++++++++++++------ 1 files changed, 19 insertions(+), 6 deletions(-) 885416e72b0058e4ebd786f2e7fc7b2e30fcf7f5 diff --git a/fs/proc/base.c b/fs/proc/base.c index 9d0ea33..4b8756a 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -1791,6 +1791,18 @@ static struct file_operations proc_task_ /* * proc directories can do almost nothing.. */ +static int proc_task_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) +{ + struct inode *inode = dentry->d_inode; + struct task_struct *p = proc_task(inode); + generic_fillattr(inode, stat); + + stat->nlink = inode->i_nlink; + if (task_alive(p) && p->signal) + stat->nlink += atomic_read(&p->signal->count); + return 0; +} + static struct inode_operations proc_fd_inode_operations = { .lookup = proc_lookupfd, .permission = proc_permission, @@ -1799,6 +1811,7 @@ static struct inode_operations proc_fd_i static struct inode_operations proc_task_inode_operations = { .lookup = proc_task_lookup, .permission = proc_task_permission, + .getattr = proc_task_getattr, }; #ifdef CONFIG_SECURITY @@ -1928,7 +1941,7 @@ static struct dentry *proc_pident_lookup ei->op.proc_read = proc_loadavg; break; case PROC_TGID_TASK: - inode->i_nlink = 2 + get_tid_list(pspace, 2, NULL, dir); + inode->i_nlink = 2; inode->i_op = &proc_task_inode_operations; inode->i_fop = &proc_task_operations; break; @@ -2027,6 +2040,7 @@ static struct dentry *proc_pident_lookup #ifdef CONFIG_SYSVIPC case PROC_TID_SYSVIPC: case PROC_TGID_SYSVIPC: + inode->i_nlink = 2; inode->i_op = &proc_sysvipc_inode_operations; inode->i_fop = &proc_sysvipc_operations; break; @@ -2331,9 +2345,9 @@ struct dentry *proc_pid_lookup(struct in inode->i_op = &proc_tgid_base_inode_operations; inode->i_fop = &proc_tgid_base_operations; #ifdef CONFIG_SECURITY - inode->i_nlink = 5; + inode->i_nlink = 6; #else - inode->i_nlink = 4; + inode->i_nlink = 5; #endif } @@ -2392,9 +2406,9 @@ static struct dentry *proc_task_lookup(s inode->i_fop = &proc_tid_base_operations; inode->i_flags|=S_IMMUTABLE; #ifdef CONFIG_SECURITY - inode->i_nlink = 4; + inode->i_nlink = 5; #else - inode->i_nlink = 3; + inode->i_nlink = 4; #endif dentry->d_op = &pid_base_dentry_operations; @@ -2588,7 +2602,6 @@ static int proc_task_readdir(struct file } nr_tids = get_tid_list(pspace, pos, tid_array, inode); - inode->i_nlink = pos + nr_tids; for (i = 0; i < nr_tids; i++) { unsigned long j = PROC_NUMBUF; -- 1.0.GIT