diff options
Diffstat (limited to 'sys/compat')
-rw-r--r-- | sys/compat/linuxkpi/common/include/linux/sched.h | 3 | ||||
-rw-r--r-- | sys/compat/linuxkpi/common/src/linux_current.c | 31 |
2 files changed, 32 insertions, 2 deletions
diff --git a/sys/compat/linuxkpi/common/include/linux/sched.h b/sys/compat/linuxkpi/common/include/linux/sched.h index 4439fc00c092..677e18e3ff5d 100644 --- a/sys/compat/linuxkpi/common/include/linux/sched.h +++ b/sys/compat/linuxkpi/common/include/linux/sched.h @@ -74,8 +74,7 @@ struct task_struct { #define current ((struct task_struct *)curthread->td_lkpi_task) -#define task_pid_group_leader(task) \ - FIRST_THREAD_IN_PROC((task)->task_thread->td_proc)->td_tid +#define task_pid_group_leader(task) (task)->task_thread->td_proc->p_pid #define task_pid(task) ((task)->pid) #define task_pid_nr(task) ((task)->pid) #define get_pid(x) (x) diff --git a/sys/compat/linuxkpi/common/src/linux_current.c b/sys/compat/linuxkpi/common/src/linux_current.c index fb33aed92846..ca0fb0c4f327 100644 --- a/sys/compat/linuxkpi/common/src/linux_current.c +++ b/sys/compat/linuxkpi/common/src/linux_current.c @@ -158,13 +158,28 @@ struct task_struct * linux_pid_task(pid_t pid) { struct thread *td; + struct proc *p; + /* try to find corresponding thread */ td = tdfind(pid, -1); if (td != NULL) { struct task_struct *ts = td->td_lkpi_task; PROC_UNLOCK(td->td_proc); return (ts); } + + /* try to find corresponding procedure */ + p = pfind(pid); + if (p != NULL) { + FOREACH_THREAD_IN_PROC(p, td) { + struct task_struct *ts = td->td_lkpi_task; + if (ts != NULL) { + PROC_UNLOCK(p); + return (ts); + } + } + PROC_UNLOCK(p); + } return (NULL); } @@ -172,7 +187,9 @@ struct task_struct * linux_get_pid_task(pid_t pid) { struct thread *td; + struct proc *p; + /* try to find corresponding thread */ td = tdfind(pid, -1); if (td != NULL) { struct task_struct *ts = td->td_lkpi_task; @@ -181,6 +198,20 @@ linux_get_pid_task(pid_t pid) PROC_UNLOCK(td->td_proc); return (ts); } + + /* try to find corresponding procedure */ + p = pfind(pid); + if (p != NULL) { + FOREACH_THREAD_IN_PROC(p, td) { + struct task_struct *ts = td->td_lkpi_task; + if (ts != NULL) { + get_task_struct(ts); + PROC_UNLOCK(p); + return (ts); + } + } + PROC_UNLOCK(p); + } return (NULL); } |