Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 33dd955d authored by Al Viro's avatar Al Viro
Browse files

Merge branch 'work.sys_wait' into misc.alpha

parents 9ba3eb51 92ebce5a
Loading
Loading
Loading
Loading
+14 −37
Original line number Original line Diff line number Diff line
@@ -1178,46 +1178,23 @@ SYSCALL_DEFINE2(osf_getrusage, int, who, struct rusage32 __user *, ru)
SYSCALL_DEFINE4(osf_wait4, pid_t, pid, int __user *, ustatus, int, options,
SYSCALL_DEFINE4(osf_wait4, pid_t, pid, int __user *, ustatus, int, options,
		struct rusage32 __user *, ur)
		struct rusage32 __user *, ur)
{
{
	struct rusage r;
	long ret, err;
	unsigned int status = 0;
	unsigned int status = 0;
	mm_segment_t old_fs;
	struct rusage r;

	long err = kernel_wait4(pid, &status, options, &r);
	if (err <= 0)
		return err;
	if (put_user(status, ustatus))
		return -EFAULT;
	if (!ur)
	if (!ur)
		return sys_wait4(pid, ustatus, options, NULL);
		return err;

	if (put_tv32(&ur->ru_utime, &r.ru_utime))
	old_fs = get_fs();
		
	set_fs (KERNEL_DS);
	ret = sys_wait4(pid, (unsigned int __user *) &status, options,
			(struct rusage __user *) &r);
	set_fs (old_fs);

	if (!access_ok(VERIFY_WRITE, ur, sizeof(*ur)))
		return -EFAULT;
		return -EFAULT;

	if (put_tv32(&ur->ru_stime, &r.ru_stime))
	err = 0;
		return -EFAULT;
	err |= put_user(status, ustatus);
	if (copy_to_user(&ur->ru_maxrss, &r.ru_maxrss,
	err |= __put_user(r.ru_utime.tv_sec, &ur->ru_utime.tv_sec);
	      sizeof(struct rusage32) - offsetof(struct rusage32, ru_maxrss)))
	err |= __put_user(r.ru_utime.tv_usec, &ur->ru_utime.tv_usec);
		return -EFAULT;
	err |= __put_user(r.ru_stime.tv_sec, &ur->ru_stime.tv_sec);
	return err;
	err |= __put_user(r.ru_stime.tv_usec, &ur->ru_stime.tv_usec);
	err |= __put_user(r.ru_maxrss, &ur->ru_maxrss);
	err |= __put_user(r.ru_ixrss, &ur->ru_ixrss);
	err |= __put_user(r.ru_idrss, &ur->ru_idrss);
	err |= __put_user(r.ru_isrss, &ur->ru_isrss);
	err |= __put_user(r.ru_minflt, &ur->ru_minflt);
	err |= __put_user(r.ru_majflt, &ur->ru_majflt);
	err |= __put_user(r.ru_nswap, &ur->ru_nswap);
	err |= __put_user(r.ru_inblock, &ur->ru_inblock);
	err |= __put_user(r.ru_oublock, &ur->ru_oublock);
	err |= __put_user(r.ru_msgsnd, &ur->ru_msgsnd);
	err |= __put_user(r.ru_msgrcv, &ur->ru_msgrcv);
	err |= __put_user(r.ru_nsignals, &ur->ru_nsignals);
	err |= __put_user(r.ru_nvcsw, &ur->ru_nvcsw);
	err |= __put_user(r.ru_nivcsw, &ur->ru_nivcsw);

	return err ? err : ret;
}
}


/*
/*
+1 −1
Original line number Original line Diff line number Diff line
@@ -703,7 +703,7 @@ extern struct movsl_mask {
#define unsafe_put_user(x, ptr, err_label)					\
#define unsafe_put_user(x, ptr, err_label)					\
do {										\
do {										\
	int __pu_err;								\
	int __pu_err;								\
	__put_user_size((x), (ptr), sizeof(*(ptr)), __pu_err, -EFAULT);		\
	__put_user_size((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr)), __pu_err, -EFAULT);		\
	if (unlikely(__pu_err)) goto err_label;					\
	if (unlikely(__pu_err)) goto err_label;					\
} while (0)
} while (0)


+1 −1
Original line number Original line Diff line number Diff line
@@ -6,7 +6,7 @@


struct task_struct;
struct task_struct;


int getrusage(struct task_struct *p, int who, struct rusage __user *ru);
void getrusage(struct task_struct *p, int who, struct rusage *ru);
int do_prlimit(struct task_struct *tsk, unsigned int resource,
int do_prlimit(struct task_struct *tsk, unsigned int resource,
		struct rlimit *new_rlim, struct rlimit *old_rlim);
		struct rlimit *new_rlim, struct rlimit *old_rlim);


+2 −0
Original line number Original line Diff line number Diff line
@@ -9,6 +9,7 @@
#include <linux/sched.h>
#include <linux/sched.h>


struct task_struct;
struct task_struct;
struct rusage;
union thread_union;
union thread_union;


/*
/*
@@ -74,6 +75,7 @@ extern long _do_fork(unsigned long, unsigned long, unsigned long, int __user *,
extern long do_fork(unsigned long, unsigned long, unsigned long, int __user *, int __user *);
extern long do_fork(unsigned long, unsigned long, unsigned long, int __user *, int __user *);
struct task_struct *fork_idle(int);
struct task_struct *fork_idle(int);
extern pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
extern pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
extern long kernel_wait4(pid_t, int *, int, struct rusage *);


extern void free_task(struct task_struct *tsk);
extern void free_task(struct task_struct *tsk);


+0 −66
Original line number Original line Diff line number Diff line
@@ -543,72 +543,6 @@ int put_compat_rusage(const struct rusage *r, struct compat_rusage __user *ru)
	return 0;
	return 0;
}
}


COMPAT_SYSCALL_DEFINE4(wait4,
	compat_pid_t, pid,
	compat_uint_t __user *, stat_addr,
	int, options,
	struct compat_rusage __user *, ru)
{
	if (!ru) {
		return sys_wait4(pid, stat_addr, options, NULL);
	} else {
		struct rusage r;
		int ret;
		unsigned int status;
		mm_segment_t old_fs = get_fs();

		set_fs (KERNEL_DS);
		ret = sys_wait4(pid,
				(stat_addr ?
				 (unsigned int __user *) &status : NULL),
				options, (struct rusage __user *) &r);
		set_fs (old_fs);

		if (ret > 0) {
			if (put_compat_rusage(&r, ru))
				return -EFAULT;
			if (stat_addr && put_user(status, stat_addr))
				return -EFAULT;
		}
		return ret;
	}
}

COMPAT_SYSCALL_DEFINE5(waitid,
		int, which, compat_pid_t, pid,
		struct compat_siginfo __user *, uinfo, int, options,
		struct compat_rusage __user *, uru)
{
	siginfo_t info;
	struct rusage ru;
	long ret;
	mm_segment_t old_fs = get_fs();

	memset(&info, 0, sizeof(info));

	set_fs(KERNEL_DS);
	ret = sys_waitid(which, pid, (siginfo_t __user *)&info, options,
			 uru ? (struct rusage __user *)&ru : NULL);
	set_fs(old_fs);

	if ((ret < 0) || (info.si_signo == 0))
		return ret;

	if (uru) {
		/* sys_waitid() overwrites everything in ru */
		if (COMPAT_USE_64BIT_TIME)
			ret = copy_to_user(uru, &ru, sizeof(ru));
		else
			ret = put_compat_rusage(&ru, uru);
		if (ret)
			return -EFAULT;
	}

	BUG_ON(info.si_code & __SI_MASK);
	info.si_code |= __SI_CHLD;
	return copy_siginfo_to_user32(uinfo, &info);
}

static int compat_get_user_cpu_mask(compat_ulong_t __user *user_mask_ptr,
static int compat_get_user_cpu_mask(compat_ulong_t __user *user_mask_ptr,
				    unsigned len, struct cpumask *new_mask)
				    unsigned len, struct cpumask *new_mask)
{
{
Loading