This will be used in next patches. No functionality change.

Signed-off-by: Kirill Tkhai <[email protected]>
---
 fs/proc/array.c |   28 ++++++++++++++++------------
 1 file changed, 16 insertions(+), 12 deletions(-)

diff --git a/fs/proc/array.c b/fs/proc/array.c
index fd02a9e..e2f21c0 100644
--- a/fs/proc/array.c
+++ b/fs/proc/array.c
@@ -576,9 +576,7 @@ get_children_pid(struct inode *inode, struct pid *pid_prev, 
loff_t pos)
        struct task_struct *start, *task;
        struct pid *pid = NULL;
 
-       read_lock(&tasklist_lock);
-
-       start = pid_task(proc_pid(inode), PIDTYPE_PID);
+       start = get_pid_task(proc_pid(inode), PIDTYPE_PID);
        if (!start)
                goto out;
 
@@ -586,18 +584,21 @@ get_children_pid(struct inode *inode, struct pid 
*pid_prev, loff_t pos)
         * Lets try to continue searching first, this gives
         * us significant speedup on children-rich processes.
         */
-       if (pid_prev) {
-               task = pid_task(pid_prev, PIDTYPE_PID);
-               if (task && task->real_parent == start &&
-                   !(list_empty(&task->sibling))) {
-                       if (list_is_last(&task->sibling, &start->children))
-                               goto out;
+       task = get_pid_task(pid_prev, PIDTYPE_PID);
+       if (!task)
+               goto put_start;
+
+       read_lock(&tasklist_lock);
+       if (task->real_parent == start && !(list_empty(&task->sibling))) {
+               put_task_struct(task);
+               if (!list_is_last(&task->sibling, &start->children)) {
                        task = list_first_entry(&task->sibling,
-                                               struct task_struct, sibling);
+                                       struct task_struct, sibling);
                        pid = get_pid(task_pid(task));
-                       goto out;
                }
+               goto unlock;
        }
+       put_task_struct(task);
 
        /*
         * Slow search case.
@@ -621,8 +622,11 @@ get_children_pid(struct inode *inode, struct pid 
*pid_prev, loff_t pos)
                }
        }
 
-out:
+unlock:
        read_unlock(&tasklist_lock);
+put_start:
+       put_task_struct(start);
+out:
        return pid;
 }
 



--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to