Index: head/sys/compat/linux/linux_misc.c =================================================================== --- head/sys/compat/linux/linux_misc.c +++ head/sys/compat/linux/linux_misc.c @@ -1207,12 +1207,8 @@ int linux_nice(struct thread *td, struct linux_nice_args *args) { - struct setpriority_args bsd_args; - bsd_args.which = PRIO_PROCESS; - bsd_args.who = 0; /* current process */ - bsd_args.prio = args->inc; - return (sys_setpriority(td, &bsd_args)); + return (kern_setpriority(td, PRIO_PROCESS, 0, args->inc)); } #endif /* __i386__ || (__amd64__ && COMPAT_LINUX32) */ Index: head/sys/kern/kern_resource.c =================================================================== --- head/sys/kern/kern_resource.c +++ head/sys/kern/kern_resource.c @@ -175,24 +175,31 @@ int sys_setpriority(struct thread *td, struct setpriority_args *uap) { + + return (kern_setpriority(td, uap->which, uap->who, uap->prio)); +} + +int +kern_setpriority(struct thread *td, int which, int who, int prio) +{ struct proc *curp, *p; struct pgrp *pg; int found = 0, error = 0; curp = td->td_proc; - switch (uap->which) { + switch (which) { case PRIO_PROCESS: - if (uap->who == 0) { + if (who == 0) { PROC_LOCK(curp); - error = donice(td, curp, uap->prio); + error = donice(td, curp, prio); PROC_UNLOCK(curp); } else { - p = pfind(uap->who); + p = pfind(who); if (p == NULL) break; error = p_cansee(td, p); if (error == 0) - error = donice(td, p, uap->prio); + error = donice(td, p, prio); PROC_UNLOCK(p); } found++; @@ -200,11 +207,11 @@ case PRIO_PGRP: sx_slock(&proctree_lock); - if (uap->who == 0) { + if (who == 0) { pg = curp->p_pgrp; PGRP_LOCK(pg); } else { - pg = pgfind(uap->who); + pg = pgfind(who); if (pg == NULL) { sx_sunlock(&proctree_lock); break; @@ -215,7 +222,7 @@ PROC_LOCK(p); if (p->p_state == PRS_NORMAL && p_cansee(td, p) == 0) { - error = donice(td, p, uap->prio); + error = donice(td, p, prio); found++; } PROC_UNLOCK(p); @@ -224,15 +231,15 @@ break; case PRIO_USER: - if (uap->who == 0) - uap->who = td->td_ucred->cr_uid; + if (who == 0) + who = td->td_ucred->cr_uid; sx_slock(&allproc_lock); FOREACH_PROC_IN_SYSTEM(p) { PROC_LOCK(p); if (p->p_state == PRS_NORMAL && - p->p_ucred->cr_uid == uap->who && + p->p_ucred->cr_uid == who && p_cansee(td, p) == 0) { - error = donice(td, p, uap->prio); + error = donice(td, p, prio); found++; } PROC_UNLOCK(p); Index: head/sys/sys/syscallsubr.h =================================================================== --- head/sys/sys/syscallsubr.h +++ head/sys/sys/syscallsubr.h @@ -251,6 +251,7 @@ int kern_setgroups(struct thread *td, u_int ngrp, gid_t *groups); int kern_setitimer(struct thread *, u_int, struct itimerval *, struct itimerval *); +int kern_setpriority(struct thread *td, int which, int who, int prio); int kern_setrlimit(struct thread *, u_int, struct rlimit *); int kern_setsockopt(struct thread *td, int s, int level, int name, const void *optval, enum uio_seg valseg, socklen_t valsize);