struct task_struct *g, *p; 
struct task_struct *p; 
find_thread_for_addr (struct task_struct *child, unsigned long addr){	struct task_struct *g, *p;	struct mm_struct *mm;	struct list_head *this, *next;	int mm_users;	if (!(mm = get_task_mm(child)))		return child;	/* -1 because of our get_task_mm(): */	mm_users = atomic_read(&mm->mm_users) - 1;	if (mm_users <= 1)		goto out;		/* not multi-threaded */	/*	 * Traverse the current process' children list.  Every task that	 * one attaches to becomes a child.  And it is only attached children	 * of the debugger that are of interest (ptrace_check_attach checks	 * for this).	 */ 	list_for_each_safe(this, next, &current->children) {		p = list_entry(this, struct task_struct, sibling);		if (p->mm != mm)			continue;		if (thread_matches(p, addr)) {			child = p;			goto out;		}	}  out:	mmput(mm);	return child;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/0e1f60609258e18ec0a0477c646101212822d387/ptrace.c/buggy/arch/ia64/kernel/ptrace.c