diff options
Diffstat (limited to 'kernel/exit.c')
| -rw-r--r-- | kernel/exit.c | 294 |
1 files changed, 148 insertions, 146 deletions
diff --git a/kernel/exit.c b/kernel/exit.c index b6c90b5ef509..869dc221733e 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
| @@ -12,7 +12,6 @@ | |||
| 12 | #include <linux/completion.h> | 12 | #include <linux/completion.h> |
| 13 | #include <linux/personality.h> | 13 | #include <linux/personality.h> |
| 14 | #include <linux/tty.h> | 14 | #include <linux/tty.h> |
| 15 | #include <linux/mnt_namespace.h> | ||
| 16 | #include <linux/iocontext.h> | 15 | #include <linux/iocontext.h> |
| 17 | #include <linux/key.h> | 16 | #include <linux/key.h> |
| 18 | #include <linux/security.h> | 17 | #include <linux/security.h> |
| @@ -375,9 +374,8 @@ static void set_special_pids(struct pid *pid) | |||
| 375 | } | 374 | } |
| 376 | 375 | ||
| 377 | /* | 376 | /* |
| 378 | * Let kernel threads use this to say that they | 377 | * Let kernel threads use this to say that they allow a certain signal. |
| 379 | * allow a certain signal (since daemonize() will | 378 | * Must not be used if kthread was cloned with CLONE_SIGHAND. |
| 380 | * have disabled all of them by default). | ||
| 381 | */ | 379 | */ |
| 382 | int allow_signal(int sig) | 380 | int allow_signal(int sig) |
| 383 | { | 381 | { |
| @@ -385,14 +383,14 @@ int allow_signal(int sig) | |||
| 385 | return -EINVAL; | 383 | return -EINVAL; |
| 386 | 384 | ||
| 387 | spin_lock_irq(¤t->sighand->siglock); | 385 | spin_lock_irq(¤t->sighand->siglock); |
| 386 | /* This is only needed for daemonize()'ed kthreads */ | ||
| 388 | sigdelset(¤t->blocked, sig); | 387 | sigdelset(¤t->blocked, sig); |
| 389 | if (!current->mm) { | 388 | /* |
| 390 | /* Kernel threads handle their own signals. | 389 | * Kernel threads handle their own signals. Let the signal code |
| 391 | Let the signal code know it'll be handled, so | 390 | * know it'll be handled, so that they don't get converted to |
| 392 | that they don't get converted to SIGKILL or | 391 | * SIGKILL or just silently dropped. |
| 393 | just silently dropped */ | 392 | */ |
| 394 | current->sighand->action[(sig)-1].sa.sa_handler = (void __user *)2; | 393 | current->sighand->action[(sig)-1].sa.sa_handler = (void __user *)2; |
| 395 | } | ||
| 396 | recalc_sigpending(); | 394 | recalc_sigpending(); |
| 397 | spin_unlock_irq(¤t->sighand->siglock); | 395 | spin_unlock_irq(¤t->sighand->siglock); |
| 398 | return 0; | 396 | return 0; |
| @@ -591,7 +589,7 @@ retry: | |||
| 591 | /* | 589 | /* |
| 592 | * Search in the siblings | 590 | * Search in the siblings |
| 593 | */ | 591 | */ |
| 594 | list_for_each_entry(c, &p->parent->children, sibling) { | 592 | list_for_each_entry(c, &p->real_parent->children, sibling) { |
| 595 | if (c->mm == mm) | 593 | if (c->mm == mm) |
| 596 | goto assign_new_owner; | 594 | goto assign_new_owner; |
| 597 | } | 595 | } |
| @@ -758,7 +756,7 @@ static void reparent_thread(struct task_struct *father, struct task_struct *p, | |||
| 758 | p->exit_signal = SIGCHLD; | 756 | p->exit_signal = SIGCHLD; |
| 759 | 757 | ||
| 760 | /* If it has exited notify the new parent about this child's death. */ | 758 | /* If it has exited notify the new parent about this child's death. */ |
| 761 | if (!p->ptrace && | 759 | if (!task_ptrace(p) && |
| 762 | p->exit_state == EXIT_ZOMBIE && thread_group_empty(p)) { | 760 | p->exit_state == EXIT_ZOMBIE && thread_group_empty(p)) { |
| 763 | do_notify_parent(p, p->exit_signal); | 761 | do_notify_parent(p, p->exit_signal); |
| 764 | if (task_detached(p)) { | 762 | if (task_detached(p)) { |
| @@ -783,7 +781,7 @@ static void forget_original_parent(struct task_struct *father) | |||
| 783 | list_for_each_entry_safe(p, n, &father->children, sibling) { | 781 | list_for_each_entry_safe(p, n, &father->children, sibling) { |
| 784 | p->real_parent = reaper; | 782 | p->real_parent = reaper; |
| 785 | if (p->parent == father) { | 783 | if (p->parent == father) { |
| 786 | BUG_ON(p->ptrace); | 784 | BUG_ON(task_ptrace(p)); |
| 787 | p->parent = p->real_parent; | 785 | p->parent = p->real_parent; |
| 788 | } | 786 | } |
| 789 | reparent_thread(father, p, &dead_children); | 787 | reparent_thread(father, p, &dead_children); |
| @@ -1081,6 +1079,18 @@ SYSCALL_DEFINE1(exit_group, int, error_code) | |||
| 1081 | return 0; | 1079 | return 0; |
| 1082 | } | 1080 | } |
| 1083 | 1081 | ||
| 1082 | struct wait_opts { | ||
| 1083 | enum pid_type wo_type; | ||
| 1084 | int wo_flags; | ||
| 1085 | struct pid *wo_pid; | ||
| 1086 | |||
| 1087 | struct siginfo __user *wo_info; | ||
| 1088 | int __user *wo_stat; | ||
| 1089 | struct rusage __user *wo_rusage; | ||
| 1090 | |||
| 1091 | int notask_error; | ||
| 1092 | }; | ||
| 1093 | |||
| 1084 | static struct pid *task_pid_type(struct task_struct *task, enum pid_type type) | 1094 | static struct pid *task_pid_type(struct task_struct *task, enum pid_type type) |
| 1085 | { | 1095 | { |
| 1086 | struct pid *pid = NULL; | 1096 | struct pid *pid = NULL; |
| @@ -1091,13 +1101,12 @@ static struct pid *task_pid_type(struct task_struct *task, enum pid_type type) | |||
| 1091 | return pid; | 1101 | return pid; |
| 1092 | } | 1102 | } |
| 1093 | 1103 | ||
| 1094 | static int eligible_child(enum pid_type type, struct pid *pid, int options, | 1104 | static int eligible_child(struct wait_opts *wo, struct task_struct *p) |
| 1095 | struct task_struct *p) | ||
| 1096 | { | 1105 | { |
| 1097 | int err; | 1106 | int err; |
| 1098 | 1107 | ||
| 1099 | if (type < PIDTYPE_MAX) { | 1108 | if (wo->wo_type < PIDTYPE_MAX) { |
| 1100 | if (task_pid_type(p, type) != pid) | 1109 | if (task_pid_type(p, wo->wo_type) != wo->wo_pid) |
| 1101 | return 0; | 1110 | return 0; |
| 1102 | } | 1111 | } |
| 1103 | 1112 | ||
| @@ -1106,8 +1115,8 @@ static int eligible_child(enum pid_type type, struct pid *pid, int options, | |||
| 1106 | * set; otherwise, wait for non-clone children *only*. (Note: | 1115 | * set; otherwise, wait for non-clone children *only*. (Note: |
| 1107 | * A "clone" child here is one that reports to its parent | 1116 | * A "clone" child here is one that reports to its parent |
| 1108 | * using a signal other than SIGCHLD.) */ | 1117 | * using a signal other than SIGCHLD.) */ |
| 1109 | if (((p->exit_signal != SIGCHLD) ^ ((options & __WCLONE) != 0)) | 1118 | if (((p->exit_signal != SIGCHLD) ^ !!(wo->wo_flags & __WCLONE)) |
| 1110 | && !(options & __WALL)) | 1119 | && !(wo->wo_flags & __WALL)) |
| 1111 | return 0; | 1120 | return 0; |
| 1112 | 1121 | ||
| 1113 | err = security_task_wait(p); | 1122 | err = security_task_wait(p); |
| @@ -1117,14 +1126,15 @@ static int eligible_child(enum pid_type type, struct pid *pid, int options, | |||
| 1117 | return 1; | 1126 | return 1; |
| 1118 | } | 1127 | } |
| 1119 | 1128 | ||
| 1120 | static int wait_noreap_copyout(struct task_struct *p, pid_t pid, uid_t uid, | 1129 | static int wait_noreap_copyout(struct wait_opts *wo, struct task_struct *p, |
| 1121 | int why, int status, | 1130 | pid_t pid, uid_t uid, int why, int status) |
| 1122 | struct siginfo __user *infop, | ||
| 1123 | struct rusage __user *rusagep) | ||
| 1124 | { | 1131 | { |
| 1125 | int retval = rusagep ? getrusage(p, RUSAGE_BOTH, rusagep) : 0; | 1132 | struct siginfo __user *infop; |
| 1133 | int retval = wo->wo_rusage | ||
| 1134 | ? getrusage(p, RUSAGE_BOTH, wo->wo_rusage) : 0; | ||
| 1126 | 1135 | ||
| 1127 | put_task_struct(p); | 1136 | put_task_struct(p); |
| 1137 | infop = wo->wo_info; | ||
| 1128 | if (!retval) | 1138 | if (!retval) |
| 1129 | retval = put_user(SIGCHLD, &infop->si_signo); | 1139 | retval = put_user(SIGCHLD, &infop->si_signo); |
| 1130 | if (!retval) | 1140 | if (!retval) |
| @@ -1148,19 +1158,18 @@ static int wait_noreap_copyout(struct task_struct *p, pid_t pid, uid_t uid, | |||
| 1148 | * the lock and this task is uninteresting. If we return nonzero, we have | 1158 | * the lock and this task is uninteresting. If we return nonzero, we have |
| 1149 | * released the lock and the system call should return. | 1159 | * released the lock and the system call should return. |
| 1150 | */ | 1160 | */ |
| 1151 | static int wait_task_zombie(struct task_struct *p, int options, | 1161 | static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p) |
| 1152 | struct siginfo __user *infop, | ||
| 1153 | int __user *stat_addr, struct rusage __user *ru) | ||
| 1154 | { | 1162 | { |
| 1155 | unsigned long state; | 1163 | unsigned long state; |
| 1156 | int retval, status, traced; | 1164 | int retval, status, traced; |
| 1157 | pid_t pid = task_pid_vnr(p); | 1165 | pid_t pid = task_pid_vnr(p); |
| 1158 | uid_t uid = __task_cred(p)->uid; | 1166 | uid_t uid = __task_cred(p)->uid; |
| 1167 | struct siginfo __user *infop; | ||
| 1159 | 1168 | ||
| 1160 | if (!likely(options & WEXITED)) | 1169 | if (!likely(wo->wo_flags & WEXITED)) |
| 1161 | return 0; | 1170 | return 0; |
| 1162 | 1171 | ||
| 1163 | if (unlikely(options & WNOWAIT)) { | 1172 | if (unlikely(wo->wo_flags & WNOWAIT)) { |
| 1164 | int exit_code = p->exit_code; | 1173 | int exit_code = p->exit_code; |
| 1165 | int why, status; | 1174 | int why, status; |
| 1166 | 1175 | ||
| @@ -1173,8 +1182,7 @@ static int wait_task_zombie(struct task_struct *p, int options, | |||
| 1173 | why = (exit_code & 0x80) ? CLD_DUMPED : CLD_KILLED; | 1182 | why = (exit_code & 0x80) ? CLD_DUMPED : CLD_KILLED; |
| 1174 | status = exit_code & 0x7f; | 1183 | status = exit_code & 0x7f; |
| 1175 | } | 1184 | } |
| 1176 | return wait_noreap_copyout(p, pid, uid, why, | 1185 | return wait_noreap_copyout(wo, p, pid, uid, why, status); |
| 1177 | status, infop, ru); | ||
| 1178 | } | 1186 | } |
| 1179 | 1187 | ||
| 1180 | /* | 1188 | /* |
| @@ -1188,11 +1196,13 @@ static int wait_task_zombie(struct task_struct *p, int options, | |||
| 1188 | } | 1196 | } |
| 1189 | 1197 | ||
| 1190 | traced = ptrace_reparented(p); | 1198 | traced = ptrace_reparented(p); |
| 1191 | 1199 | /* | |
| 1192 | if (likely(!traced)) { | 1200 | * It can be ptraced but not reparented, check |
| 1201 | * !task_detached() to filter out sub-threads. | ||
| 1202 | */ | ||
| 1203 | if (likely(!traced) && likely(!task_detached(p))) { | ||
| 1193 | struct signal_struct *psig; | 1204 | struct signal_struct *psig; |
| 1194 | struct signal_struct *sig; | 1205 | struct signal_struct *sig; |
| 1195 | struct task_cputime cputime; | ||
| 1196 | 1206 | ||
| 1197 | /* | 1207 | /* |
| 1198 | * The resource counters for the group leader are in its | 1208 | * The resource counters for the group leader are in its |
| @@ -1205,26 +1215,23 @@ static int wait_task_zombie(struct task_struct *p, int options, | |||
| 1205 | * p->signal fields, because they are only touched by | 1215 | * p->signal fields, because they are only touched by |
| 1206 | * __exit_signal, which runs with tasklist_lock | 1216 | * __exit_signal, which runs with tasklist_lock |
| 1207 | * write-locked anyway, and so is excluded here. We do | 1217 | * write-locked anyway, and so is excluded here. We do |
| 1208 | * need to protect the access to p->parent->signal fields, | 1218 | * need to protect the access to parent->signal fields, |
| 1209 | * as other threads in the parent group can be right | 1219 | * as other threads in the parent group can be right |
| 1210 | * here reaping other children at the same time. | 1220 | * here reaping other children at the same time. |
| 1211 | * | ||
| 1212 | * We use thread_group_cputime() to get times for the thread | ||
| 1213 | * group, which consolidates times for all threads in the | ||
| 1214 | * group including the group leader. | ||
| 1215 | */ | 1221 | */ |
| 1216 | thread_group_cputime(p, &cputime); | 1222 | spin_lock_irq(&p->real_parent->sighand->siglock); |
| 1217 | spin_lock_irq(&p->parent->sighand->siglock); | 1223 | psig = p->real_parent->signal; |
| 1218 | psig = p->parent->signal; | ||
| 1219 | sig = p->signal; | 1224 | sig = p->signal; |
| 1220 | psig->cutime = | 1225 | psig->cutime = |
| 1221 | cputime_add(psig->cutime, | 1226 | cputime_add(psig->cutime, |
| 1222 | cputime_add(cputime.utime, | 1227 | cputime_add(p->utime, |
| 1223 | sig->cutime)); | 1228 | cputime_add(sig->utime, |
| 1229 | sig->cutime))); | ||
| 1224 | psig->cstime = | 1230 | psig->cstime = |
| 1225 | cputime_add(psig->cstime, | 1231 | cputime_add(psig->cstime, |
| 1226 | cputime_add(cputime.stime, | 1232 | cputime_add(p->stime, |
| 1227 | sig->cstime)); | 1233 | cputime_add(sig->stime, |
| 1234 | sig->cstime))); | ||
| 1228 | psig->cgtime = | 1235 | psig->cgtime = |
| 1229 | cputime_add(psig->cgtime, | 1236 | cputime_add(psig->cgtime, |
| 1230 | cputime_add(p->gtime, | 1237 | cputime_add(p->gtime, |
| @@ -1246,7 +1253,7 @@ static int wait_task_zombie(struct task_struct *p, int options, | |||
| 1246 | sig->oublock + sig->coublock; | 1253 | sig->oublock + sig->coublock; |
| 1247 | task_io_accounting_add(&psig->ioac, &p->ioac); | 1254 | task_io_accounting_add(&psig->ioac, &p->ioac); |
| 1248 | task_io_accounting_add(&psig->ioac, &sig->ioac); | 1255 | task_io_accounting_add(&psig->ioac, &sig->ioac); |
| 1249 | spin_unlock_irq(&p->parent->sighand->siglock); | 1256 | spin_unlock_irq(&p->real_parent->sighand->siglock); |
| 1250 | } | 1257 | } |
| 1251 | 1258 | ||
| 1252 | /* | 1259 | /* |
| @@ -1255,11 +1262,14 @@ static int wait_task_zombie(struct task_struct *p, int options, | |||
| 1255 | */ | 1262 | */ |
| 1256 | read_unlock(&tasklist_lock); | 1263 | read_unlock(&tasklist_lock); |
| 1257 | 1264 | ||
| 1258 | retval = ru ? getrusage(p, RUSAGE_BOTH, ru) : 0; | 1265 | retval = wo->wo_rusage |
| 1266 | ? getrusage(p, RUSAGE_BOTH, wo->wo_rusage) : 0; | ||
| 1259 | status = (p->signal->flags & SIGNAL_GROUP_EXIT) | 1267 | status = (p->signal->flags & SIGNAL_GROUP_EXIT) |
| 1260 | ? p->signal->group_exit_code : p->exit_code; | 1268 | ? p->signal->group_exit_code : p->exit_code; |
| 1261 | if (!retval && stat_addr) | 1269 | if (!retval && wo->wo_stat) |
| 1262 | retval = put_user(status, stat_addr); | 1270 | retval = put_user(status, wo->wo_stat); |
| 1271 | |||
| 1272 | infop = wo->wo_info; | ||
| 1263 | if (!retval && infop) | 1273 | if (!retval && infop) |
| 1264 | retval = put_user(SIGCHLD, &infop->si_signo); | 1274 | retval = put_user(SIGCHLD, &infop->si_signo); |
| 1265 | if (!retval && infop) | 1275 | if (!retval && infop) |
| @@ -1327,15 +1337,18 @@ static int *task_stopped_code(struct task_struct *p, bool ptrace) | |||
| 1327 | * the lock and this task is uninteresting. If we return nonzero, we have | 1337 | * the lock and this task is uninteresting. If we return nonzero, we have |
| 1328 | * released the lock and the system call should return. | 1338 | * released the lock and the system call should return. |
| 1329 | */ | 1339 | */ |
| 1330 | static int wait_task_stopped(int ptrace, struct task_struct *p, | 1340 | static int wait_task_stopped(struct wait_opts *wo, |
| 1331 | int options, struct siginfo __user *infop, | 1341 | int ptrace, struct task_struct *p) |
| 1332 | int __user *stat_addr, struct rusage __user *ru) | ||
| 1333 | { | 1342 | { |
| 1343 | struct siginfo __user *infop; | ||
| 1334 | int retval, exit_code, *p_code, why; | 1344 | int retval, exit_code, *p_code, why; |
| 1335 | uid_t uid = 0; /* unneeded, required by compiler */ | 1345 | uid_t uid = 0; /* unneeded, required by compiler */ |
| 1336 | pid_t pid; | 1346 | pid_t pid; |
| 1337 | 1347 | ||
| 1338 | if (!(options & WUNTRACED)) | 1348 | /* |
| 1349 | * Traditionally we see ptrace'd stopped tasks regardless of options. | ||
| 1350 | */ | ||
| 1351 | if (!ptrace && !(wo->wo_flags & WUNTRACED)) | ||
| 1339 | return 0; | 1352 | return 0; |
| 1340 | 1353 | ||
| 1341 | exit_code = 0; | 1354 | exit_code = 0; |
| @@ -1349,7 +1362,7 @@ static int wait_task_stopped(int ptrace, struct task_struct *p, | |||
| 1349 | if (!exit_code) | 1362 | if (!exit_code) |
| 1350 | goto unlock_sig; | 1363 | goto unlock_sig; |
| 1351 | 1364 | ||
| 1352 | if (!unlikely(options & WNOWAIT)) | 1365 | if (!unlikely(wo->wo_flags & WNOWAIT)) |
| 1353 | *p_code = 0; | 1366 | *p_code = 0; |
| 1354 | 1367 | ||
| 1355 | /* don't need the RCU readlock here as we're holding a spinlock */ | 1368 | /* don't need the RCU readlock here as we're holding a spinlock */ |
| @@ -1371,14 +1384,15 @@ unlock_sig: | |||
| 1371 | why = ptrace ? CLD_TRAPPED : CLD_STOPPED; | 1384 | why = ptrace ? CLD_TRAPPED : CLD_STOPPED; |
| 1372 | read_unlock(&tasklist_lock); | 1385 | read_unlock(&tasklist_lock); |
| 1373 | 1386 | ||
| 1374 | if (unlikely(options & WNOWAIT)) | 1387 | if (unlikely(wo->wo_flags & WNOWAIT)) |
| 1375 | return wait_noreap_copyout(p, pid, uid, | 1388 | return wait_noreap_copyout(wo, p, pid, uid, why, exit_code); |
| 1376 | why, exit_code, | ||
| 1377 | infop, ru); | ||
| 1378 | 1389 | ||
| 1379 | retval = ru ? getrusage(p, RUSAGE_BOTH, ru) : 0; | 1390 | retval = wo->wo_rusage |
| 1380 | if (!retval && stat_addr) | 1391 | ? getrusage(p, RUSAGE_BOTH, wo->wo_rusage) : 0; |
| 1381 | retval = put_user((exit_code << 8) | 0x7f, stat_addr); | 1392 | if (!retval && wo->wo_stat) |
| 1393 | retval = put_user((exit_code << 8) | 0x7f, wo->wo_stat); | ||
| 1394 | |||
| 1395 | infop = wo->wo_info; | ||
| 1382 | if (!retval && infop) | 1396 | if (!retval && infop) |
| 1383 | retval = put_user(SIGCHLD, &infop->si_signo); | 1397 | retval = put_user(SIGCHLD, &infop->si_signo); |
| 1384 | if (!retval && infop) | 1398 | if (!retval && infop) |
| @@ -1405,15 +1419,13 @@ unlock_sig: | |||
| 1405 | * the lock and this task is uninteresting. If we return nonzero, we have | 1419 | * the lock and this task is uninteresting. If we return nonzero, we have |
| 1406 | * released the lock and the system call should return. | 1420 | * released the lock and the system call should return. |
| 1407 | */ | 1421 | */ |
| 1408 | static int wait_task_continued(struct task_struct *p, int options, | 1422 | static int wait_task_continued(struct wait_opts *wo, struct task_struct *p) |
| 1409 | struct siginfo __user *infop, | ||
| 1410 | int __user *stat_addr, struct rusage __user *ru) | ||
| 1411 | { | 1423 | { |
| 1412 | int retval; | 1424 | int retval; |
| 1413 | pid_t pid; | 1425 | pid_t pid; |
| 1414 | uid_t uid; | 1426 | uid_t uid; |
| 1415 | 1427 | ||
| 1416 | if (!unlikely(options & WCONTINUED)) | 1428 | if (!unlikely(wo->wo_flags & WCONTINUED)) |
| 1417 | return 0; | 1429 | return 0; |
| 1418 | 1430 | ||
| 1419 | if (!(p->signal->flags & SIGNAL_STOP_CONTINUED)) | 1431 | if (!(p->signal->flags & SIGNAL_STOP_CONTINUED)) |
| @@ -1425,7 +1437,7 @@ static int wait_task_continued(struct task_struct *p, int options, | |||
| 1425 | spin_unlock_irq(&p->sighand->siglock); | 1437 | spin_unlock_irq(&p->sighand->siglock); |
| 1426 | return 0; | 1438 | return 0; |
| 1427 | } | 1439 | } |
| 1428 | if (!unlikely(options & WNOWAIT)) | 1440 | if (!unlikely(wo->wo_flags & WNOWAIT)) |
| 1429 | p->signal->flags &= ~SIGNAL_STOP_CONTINUED; | 1441 | p->signal->flags &= ~SIGNAL_STOP_CONTINUED; |
| 1430 | uid = __task_cred(p)->uid; | 1442 | uid = __task_cred(p)->uid; |
| 1431 | spin_unlock_irq(&p->sighand->siglock); | 1443 | spin_unlock_irq(&p->sighand->siglock); |
| @@ -1434,17 +1446,17 @@ static int wait_task_continued(struct task_struct *p, int options, | |||
| 1434 | get_task_struct(p); | 1446 | get_task_struct(p); |
| 1435 | read_unlock(&tasklist_lock); | 1447 | read_unlock(&tasklist_lock); |
| 1436 | 1448 | ||
| 1437 | if (!infop) { | 1449 | if (!wo->wo_info) { |
| 1438 | retval = ru ? getrusage(p, RUSAGE_BOTH, ru) : 0; | 1450 | retval = wo->wo_rusage |
| 1451 | ? getrusage(p, RUSAGE_BOTH, wo->wo_rusage) : 0; | ||
| 1439 | put_task_struct(p); | 1452 | put_task_struct(p); |
| 1440 | if (!retval && stat_addr) | 1453 | if (!retval && wo->wo_stat) |
| 1441 | retval = put_user(0xffff, stat_addr); | 1454 | retval = put_user(0xffff, wo->wo_stat); |
| 1442 | if (!retval) | 1455 | if (!retval) |
| 1443 | retval = pid; | 1456 | retval = pid; |
| 1444 | } else { | 1457 | } else { |
| 1445 | retval = wait_noreap_copyout(p, pid, uid, | 1458 | retval = wait_noreap_copyout(wo, p, pid, uid, |
| 1446 | CLD_CONTINUED, SIGCONT, | 1459 | CLD_CONTINUED, SIGCONT); |
| 1447 | infop, ru); | ||
| 1448 | BUG_ON(retval == 0); | 1460 | BUG_ON(retval == 0); |
| 1449 | } | 1461 | } |
| 1450 | 1462 | ||
| @@ -1454,19 +1466,16 @@ static int wait_task_continued(struct task_struct *p, int options, | |||
| 1454 | /* | 1466 | /* |
| 1455 | * Consider @p for a wait by @parent. | 1467 | * Consider @p for a wait by @parent. |
| 1456 | * | 1468 | * |
| 1457 | * -ECHILD should be in *@notask_error before the first call. | 1469 | * -ECHILD should be in ->notask_error before the first call. |
| 1458 | * Returns nonzero for a final return, when we have unlocked tasklist_lock. | 1470 | * Returns nonzero for a final return, when we have unlocked tasklist_lock. |
| 1459 | * Returns zero if the search for a child should continue; | 1471 | * Returns zero if the search for a child should continue; |
| 1460 | * then *@notask_error is 0 if @p is an eligible child, | 1472 | * then ->notask_error is 0 if @p is an eligible child, |
| 1461 | * or another error from security_task_wait(), or still -ECHILD. | 1473 | * or another error from security_task_wait(), or still -ECHILD. |
| 1462 | */ | 1474 | */ |
| 1463 | static int wait_consider_task(struct task_struct *parent, int ptrace, | 1475 | static int wait_consider_task(struct wait_opts *wo, struct task_struct *parent, |
| 1464 | struct task_struct *p, int *notask_error, | 1476 | int ptrace, struct task_struct *p) |
| 1465 | enum pid_type type, struct pid *pid, int options, | ||
| 1466 | struct siginfo __user *infop, | ||
| 1467 | int __user *stat_addr, struct rusage __user *ru) | ||
| 1468 | { | 1477 | { |
| 1469 | int ret = eligible_child(type, pid, options, p); | 1478 | int ret = eligible_child(wo, p); |
| 1470 | if (!ret) | 1479 | if (!ret) |
| 1471 | return ret; | 1480 | return ret; |
| 1472 | 1481 | ||
| @@ -1478,17 +1487,17 @@ static int wait_consider_task(struct task_struct *parent, int ptrace, | |||
| 1478 | * to look for security policy problems, rather | 1487 | * to look for security policy problems, rather |
| 1479 | * than for mysterious wait bugs. | 1488 | * than for mysterious wait bugs. |
| 1480 | */ | 1489 | */ |
| 1481 | if (*notask_error) | 1490 | if (wo->notask_error) |
| 1482 | *notask_error = ret; | 1491 | wo->notask_error = ret; |
| 1483 | return 0; | 1492 | return 0; |
| 1484 | } | 1493 | } |
| 1485 | 1494 | ||
| 1486 | if (likely(!ptrace) && unlikely(p->ptrace)) { | 1495 | if (likely(!ptrace) && unlikely(task_ptrace(p))) { |
| 1487 | /* | 1496 | /* |
| 1488 | * This child is hidden by ptrace. | 1497 | * This child is hidden by ptrace. |
| 1489 | * We aren't allowed to see it now, but eventually we will. | 1498 | * We aren't allowed to see it now, but eventually we will. |
| 1490 | */ | 1499 | */ |
| 1491 | *notask_error = 0; | 1500 | wo->notask_error = 0; |
| 1492 | return 0; | 1501 | return 0; |
| 1493 | } | 1502 | } |
| 1494 | 1503 | ||
| @@ -1499,34 +1508,30 @@ static int wait_consider_task(struct task_struct *parent, int ptrace, | |||
| 1499 | * We don't reap group leaders with subthreads. | 1508 | * We don't reap group leaders with subthreads. |
| 1500 | */ | 1509 | */ |
| 1501 | if (p->exit_state == EXIT_ZOMBIE && !delay_group_leader(p)) | 1510 | if (p->exit_state == EXIT_ZOMBIE && !delay_group_leader(p)) |
| 1502 | return wait_task_zombie(p, options, infop, stat_addr, ru); | 1511 | return wait_task_zombie(wo, p); |
| 1503 | 1512 | ||
| 1504 | /* | 1513 | /* |
| 1505 | * It's stopped or running now, so it might | 1514 | * It's stopped or running now, so it might |
| 1506 | * later continue, exit, or stop again. | 1515 | * later continue, exit, or stop again. |
| 1507 | */ | 1516 | */ |
| 1508 | *notask_error = 0; | 1517 | wo->notask_error = 0; |
| 1509 | 1518 | ||
| 1510 | if (task_stopped_code(p, ptrace)) | 1519 | if (task_stopped_code(p, ptrace)) |
| 1511 | return wait_task_stopped(ptrace, p, options, | 1520 | return wait_task_stopped(wo, ptrace, p); |
| 1512 | infop, stat_addr, ru); | ||
| 1513 | 1521 | ||
| 1514 | return wait_task_continued(p, options, infop, stat_addr, ru); | 1522 | return wait_task_continued(wo, p); |
| 1515 | } | 1523 | } |
| 1516 | 1524 | ||
| 1517 | /* | 1525 | /* |
| 1518 | * Do the work of do_wait() for one thread in the group, @tsk. | 1526 | * Do the work of do_wait() for one thread in the group, @tsk. |
| 1519 | * | 1527 | * |
| 1520 | * -ECHILD should be in *@notask_error before the first call. | 1528 | * -ECHILD should be in ->notask_error before the first call. |
| 1521 | * Returns nonzero for a final return, when we have unlocked tasklist_lock. | 1529 | * Returns nonzero for a final return, when we have unlocked tasklist_lock. |
| 1522 | * Returns zero if the search for a child should continue; then | 1530 | * Returns zero if the search for a child should continue; then |
| 1523 | * *@notask_error is 0 if there were any eligible children, | 1531 | * ->notask_error is 0 if there were any eligible children, |
| 1524 | * or another error from security_task_wait(), or still -ECHILD. | 1532 | * or another error from security_task_wait(), or still -ECHILD. |
| 1525 | */ | 1533 | */ |
| 1526 | static int do_wait_thread(struct task_struct *tsk, int *notask_error, | 1534 | static int do_wait_thread(struct wait_opts *wo, struct task_struct *tsk) |
| 1527 | enum pid_type type, struct pid *pid, int options, | ||
| 1528 | struct siginfo __user *infop, int __user *stat_addr, | ||
| 1529 | struct rusage __user *ru) | ||
| 1530 | { | 1535 | { |
| 1531 | struct task_struct *p; | 1536 | struct task_struct *p; |
| 1532 | 1537 | ||
| @@ -1535,9 +1540,7 @@ static int do_wait_thread(struct task_struct *tsk, int *notask_error, | |||
| 1535 | * Do not consider detached threads. | 1540 | * Do not consider detached threads. |
| 1536 | */ | 1541 | */ |
| 1537 | if (!task_detached(p)) { | 1542 | if (!task_detached(p)) { |
| 1538 | int ret = wait_consider_task(tsk, 0, p, notask_error, | 1543 | int ret = wait_consider_task(wo, tsk, 0, p); |
| 1539 | type, pid, options, | ||
| 1540 | infop, stat_addr, ru); | ||
| 1541 | if (ret) | 1544 | if (ret) |
| 1542 | return ret; | 1545 | return ret; |
| 1543 | } | 1546 | } |
| @@ -1546,22 +1549,12 @@ static int do_wait_thread(struct task_struct *tsk, int *notask_error, | |||
| 1546 | return 0; | 1549 | return 0; |
| 1547 | } | 1550 | } |
| 1548 | 1551 | ||
| 1549 | static int ptrace_do_wait(struct task_struct *tsk, int *notask_error, | 1552 | static int ptrace_do_wait(struct wait_opts *wo, struct task_struct *tsk) |
| 1550 | enum pid_type type, struct pid *pid, int options, | ||
| 1551 | struct siginfo __user *infop, int __user *stat_addr, | ||
| 1552 | struct rusage __user *ru) | ||
| 1553 | { | 1553 | { |
| 1554 | struct task_struct *p; | 1554 | struct task_struct *p; |
| 1555 | 1555 | ||
| 1556 | /* | ||
| 1557 | * Traditionally we see ptrace'd stopped tasks regardless of options. | ||
| 1558 | */ | ||
| 1559 | options |= WUNTRACED; | ||
| 1560 | |||
| 1561 | list_for_each_entry(p, &tsk->ptraced, ptrace_entry) { | 1556 | list_for_each_entry(p, &tsk->ptraced, ptrace_entry) { |
| 1562 | int ret = wait_consider_task(tsk, 1, p, notask_error, | 1557 | int ret = wait_consider_task(wo, tsk, 1, p); |
| 1563 | type, pid, options, | ||
| 1564 | infop, stat_addr, ru); | ||
| 1565 | if (ret) | 1558 | if (ret) |
| 1566 | return ret; | 1559 | return ret; |
| 1567 | } | 1560 | } |
| @@ -1569,65 +1562,59 @@ static int ptrace_do_wait(struct task_struct *tsk, int *notask_error, | |||
| 1569 | return 0; | 1562 | return 0; |
| 1570 | } | 1563 | } |
| 1571 | 1564 | ||
| 1572 | static long do_wait(enum pid_type type, struct pid *pid, int options, | 1565 | static long do_wait(struct wait_opts *wo) |
| 1573 | struct siginfo __user *infop, int __user *stat_addr, | ||
| 1574 | struct rusage __user *ru) | ||
| 1575 | { | 1566 | { |
| 1576 | DECLARE_WAITQUEUE(wait, current); | 1567 | DECLARE_WAITQUEUE(wait, current); |
| 1577 | struct task_struct *tsk; | 1568 | struct task_struct *tsk; |
| 1578 | int retval; | 1569 | int retval; |
| 1579 | 1570 | ||
| 1580 | trace_sched_process_wait(pid); | 1571 | trace_sched_process_wait(wo->wo_pid); |
| 1581 | 1572 | ||
| 1582 | add_wait_queue(¤t->signal->wait_chldexit,&wait); | 1573 | add_wait_queue(¤t->signal->wait_chldexit,&wait); |
| 1583 | repeat: | 1574 | repeat: |
| 1584 | /* | 1575 | /* |
| 1585 | * If there is nothing that can match our critiera just get out. | 1576 | * If there is nothing that can match our critiera just get out. |
| 1586 | * We will clear @retval to zero if we see any child that might later | 1577 | * We will clear ->notask_error to zero if we see any child that |
| 1587 | * match our criteria, even if we are not able to reap it yet. | 1578 | * might later match our criteria, even if we are not able to reap |
| 1579 | * it yet. | ||
| 1588 | */ | 1580 | */ |
| 1589 | retval = -ECHILD; | 1581 | wo->notask_error = -ECHILD; |
| 1590 | if ((type < PIDTYPE_MAX) && (!pid || hlist_empty(&pid->tasks[type]))) | 1582 | if ((wo->wo_type < PIDTYPE_MAX) && |
| 1591 | goto end; | 1583 | (!wo->wo_pid || hlist_empty(&wo->wo_pid->tasks[wo->wo_type]))) |
| 1584 | goto notask; | ||
| 1592 | 1585 | ||
| 1593 | current->state = TASK_INTERRUPTIBLE; | 1586 | set_current_state(TASK_INTERRUPTIBLE); |
| 1594 | read_lock(&tasklist_lock); | 1587 | read_lock(&tasklist_lock); |
| 1595 | tsk = current; | 1588 | tsk = current; |
| 1596 | do { | 1589 | do { |
| 1597 | int tsk_result = do_wait_thread(tsk, &retval, | 1590 | retval = do_wait_thread(wo, tsk); |
| 1598 | type, pid, options, | 1591 | if (retval) |
| 1599 | infop, stat_addr, ru); | 1592 | goto end; |
| 1600 | if (!tsk_result) | 1593 | |
| 1601 | tsk_result = ptrace_do_wait(tsk, &retval, | 1594 | retval = ptrace_do_wait(wo, tsk); |
| 1602 | type, pid, options, | 1595 | if (retval) |
| 1603 | infop, stat_addr, ru); | ||
| 1604 | if (tsk_result) { | ||
| 1605 | /* | ||
| 1606 | * tasklist_lock is unlocked and we have a final result. | ||
| 1607 | */ | ||
| 1608 | retval = tsk_result; | ||
| 1609 | goto end; | 1596 | goto end; |
| 1610 | } | ||
| 1611 | 1597 | ||
| 1612 | if (options & __WNOTHREAD) | 1598 | if (wo->wo_flags & __WNOTHREAD) |
| 1613 | break; | 1599 | break; |
| 1614 | tsk = next_thread(tsk); | 1600 | } while_each_thread(current, tsk); |
| 1615 | BUG_ON(tsk->signal != current->signal); | ||
| 1616 | } while (tsk != current); | ||
| 1617 | read_unlock(&tasklist_lock); | 1601 | read_unlock(&tasklist_lock); |
| 1618 | 1602 | ||
| 1619 | if (!retval && !(options & WNOHANG)) { | 1603 | notask: |
| 1604 | retval = wo->notask_error; | ||
| 1605 | if (!retval && !(wo->wo_flags & WNOHANG)) { | ||
| 1620 | retval = -ERESTARTSYS; | 1606 | retval = -ERESTARTSYS; |
| 1621 | if (!signal_pending(current)) { | 1607 | if (!signal_pending(current)) { |
| 1622 | schedule(); | 1608 | schedule(); |
| 1623 | goto repeat; | 1609 | goto repeat; |
| 1624 | } | 1610 | } |
| 1625 | } | 1611 | } |
| 1626 | |||
| 1627 | end: | 1612 | end: |
| 1628 | current->state = TASK_RUNNING; | 1613 | __set_current_state(TASK_RUNNING); |
| 1629 | remove_wait_queue(¤t->signal->wait_chldexit,&wait); | 1614 | remove_wait_queue(¤t->signal->wait_chldexit,&wait); |
| 1630 | if (infop) { | 1615 | if (wo->wo_info) { |
| 1616 | struct siginfo __user *infop = wo->wo_info; | ||
| 1617 | |||
| 1631 | if (retval > 0) | 1618 | if (retval > 0) |
| 1632 | retval = 0; | 1619 | retval = 0; |
| 1633 | else { | 1620 | else { |
| @@ -1656,6 +1643,7 @@ end: | |||
| 1656 | SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *, | 1643 | SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *, |
| 1657 | infop, int, options, struct rusage __user *, ru) | 1644 | infop, int, options, struct rusage __user *, ru) |
| 1658 | { | 1645 | { |
| 1646 | struct wait_opts wo; | ||
| 1659 | struct pid *pid = NULL; | 1647 | struct pid *pid = NULL; |
| 1660 | enum pid_type type; | 1648 | enum pid_type type; |
| 1661 | long ret; | 1649 | long ret; |
| @@ -1685,7 +1673,14 @@ SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *, | |||
| 1685 | 1673 | ||
| 1686 | if (type < PIDTYPE_MAX) | 1674 | if (type < PIDTYPE_MAX) |
| 1687 | pid = find_get_pid(upid); | 1675 | pid = find_get_pid(upid); |
| 1688 | ret = do_wait(type, pid, options, infop, NULL, ru); | 1676 | |
| 1677 | wo.wo_type = type; | ||
| 1678 | wo.wo_pid = pid; | ||
| 1679 | wo.wo_flags = options; | ||
| 1680 | wo.wo_info = infop; | ||
| 1681 | wo.wo_stat = NULL; | ||
| 1682 | wo.wo_rusage = ru; | ||
| 1683 | ret = do_wait(&wo); | ||
| 1689 | put_pid(pid); | 1684 | put_pid(pid); |
| 1690 | 1685 | ||
| 1691 | /* avoid REGPARM breakage on x86: */ | 1686 | /* avoid REGPARM breakage on x86: */ |
| @@ -1696,6 +1691,7 @@ SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *, | |||
| 1696 | SYSCALL_DEFINE4(wait4, pid_t, upid, int __user *, stat_addr, | 1691 | SYSCALL_DEFINE4(wait4, pid_t, upid, int __user *, stat_addr, |
| 1697 | int, options, struct rusage __user *, ru) | 1692 | int, options, struct rusage __user *, ru) |
| 1698 | { | 1693 | { |
| 1694 | struct wait_opts wo; | ||
| 1699 | struct pid *pid = NULL; | 1695 | struct pid *pid = NULL; |
| 1700 | enum pid_type type; | 1696 | enum pid_type type; |
| 1701 | long ret; | 1697 | long ret; |
| @@ -1717,7 +1713,13 @@ SYSCALL_DEFINE4(wait4, pid_t, upid, int __user *, stat_addr, | |||
| 1717 | pid = find_get_pid(upid); | 1713 | pid = find_get_pid(upid); |
| 1718 | } | 1714 | } |
| 1719 | 1715 | ||
| 1720 | ret = do_wait(type, pid, options | WEXITED, NULL, stat_addr, ru); | 1716 | wo.wo_type = type; |
| 1717 | wo.wo_pid = pid; | ||
| 1718 | wo.wo_flags = options | WEXITED; | ||
| 1719 | wo.wo_info = NULL; | ||
| 1720 | wo.wo_stat = stat_addr; | ||
| 1721 | wo.wo_rusage = ru; | ||
| 1722 | ret = do_wait(&wo); | ||
| 1721 | put_pid(pid); | 1723 | put_pid(pid); |
| 1722 | 1724 | ||
| 1723 | /* avoid REGPARM breakage on x86: */ | 1725 | /* avoid REGPARM breakage on x86: */ |
