xref: /OK3568_Linux_fs/kernel/fs/signalfd.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *  fs/signalfd.c
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  *  Copyright (C) 2003  Linus Torvalds
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  *  Mon Mar 5, 2007: Davide Libenzi <davidel@xmailserver.org>
8*4882a593Smuzhiyun  *      Changed ->read() to return a siginfo strcture instead of signal number.
9*4882a593Smuzhiyun  *      Fixed locking in ->poll().
10*4882a593Smuzhiyun  *      Added sighand-detach notification.
11*4882a593Smuzhiyun  *      Added fd re-use in sys_signalfd() syscall.
12*4882a593Smuzhiyun  *      Now using anonymous inode source.
13*4882a593Smuzhiyun  *      Thanks to Oleg Nesterov for useful code review and suggestions.
14*4882a593Smuzhiyun  *      More comments and suggestions from Arnd Bergmann.
15*4882a593Smuzhiyun  *  Sat May 19, 2007: Davi E. M. Arnaut <davi@haxent.com.br>
16*4882a593Smuzhiyun  *      Retrieve multiple signals with one read() call
17*4882a593Smuzhiyun  *  Sun Jul 15, 2007: Davide Libenzi <davidel@xmailserver.org>
18*4882a593Smuzhiyun  *      Attach to the sighand only during read() and poll().
19*4882a593Smuzhiyun  */
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #include <linux/file.h>
22*4882a593Smuzhiyun #include <linux/poll.h>
23*4882a593Smuzhiyun #include <linux/init.h>
24*4882a593Smuzhiyun #include <linux/fs.h>
25*4882a593Smuzhiyun #include <linux/sched.h>
26*4882a593Smuzhiyun #include <linux/slab.h>
27*4882a593Smuzhiyun #include <linux/kernel.h>
28*4882a593Smuzhiyun #include <linux/signal.h>
29*4882a593Smuzhiyun #include <linux/list.h>
30*4882a593Smuzhiyun #include <linux/anon_inodes.h>
31*4882a593Smuzhiyun #include <linux/signalfd.h>
32*4882a593Smuzhiyun #include <linux/syscalls.h>
33*4882a593Smuzhiyun #include <linux/proc_fs.h>
34*4882a593Smuzhiyun #include <linux/compat.h>
35*4882a593Smuzhiyun 
signalfd_cleanup(struct sighand_struct * sighand)36*4882a593Smuzhiyun void signalfd_cleanup(struct sighand_struct *sighand)
37*4882a593Smuzhiyun {
38*4882a593Smuzhiyun 	wake_up_pollfree(&sighand->signalfd_wqh);
39*4882a593Smuzhiyun }
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun struct signalfd_ctx {
42*4882a593Smuzhiyun 	sigset_t sigmask;
43*4882a593Smuzhiyun };
44*4882a593Smuzhiyun 
signalfd_release(struct inode * inode,struct file * file)45*4882a593Smuzhiyun static int signalfd_release(struct inode *inode, struct file *file)
46*4882a593Smuzhiyun {
47*4882a593Smuzhiyun 	kfree(file->private_data);
48*4882a593Smuzhiyun 	return 0;
49*4882a593Smuzhiyun }
50*4882a593Smuzhiyun 
signalfd_poll(struct file * file,poll_table * wait)51*4882a593Smuzhiyun static __poll_t signalfd_poll(struct file *file, poll_table *wait)
52*4882a593Smuzhiyun {
53*4882a593Smuzhiyun 	struct signalfd_ctx *ctx = file->private_data;
54*4882a593Smuzhiyun 	__poll_t events = 0;
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun 	poll_wait(file, &current->sighand->signalfd_wqh, wait);
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun 	spin_lock_irq(&current->sighand->siglock);
59*4882a593Smuzhiyun 	if (next_signal(&current->pending, &ctx->sigmask) ||
60*4882a593Smuzhiyun 	    next_signal(&current->signal->shared_pending,
61*4882a593Smuzhiyun 			&ctx->sigmask))
62*4882a593Smuzhiyun 		events |= EPOLLIN;
63*4882a593Smuzhiyun 	spin_unlock_irq(&current->sighand->siglock);
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun 	return events;
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun /*
69*4882a593Smuzhiyun  * Copied from copy_siginfo_to_user() in kernel/signal.c
70*4882a593Smuzhiyun  */
signalfd_copyinfo(struct signalfd_siginfo __user * uinfo,kernel_siginfo_t const * kinfo)71*4882a593Smuzhiyun static int signalfd_copyinfo(struct signalfd_siginfo __user *uinfo,
72*4882a593Smuzhiyun 			     kernel_siginfo_t const *kinfo)
73*4882a593Smuzhiyun {
74*4882a593Smuzhiyun 	struct signalfd_siginfo new;
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun 	BUILD_BUG_ON(sizeof(struct signalfd_siginfo) != 128);
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun 	/*
79*4882a593Smuzhiyun 	 * Unused members should be zero ...
80*4882a593Smuzhiyun 	 */
81*4882a593Smuzhiyun 	memset(&new, 0, sizeof(new));
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 	/*
84*4882a593Smuzhiyun 	 * If you change siginfo_t structure, please be sure
85*4882a593Smuzhiyun 	 * this code is fixed accordingly.
86*4882a593Smuzhiyun 	 */
87*4882a593Smuzhiyun 	new.ssi_signo = kinfo->si_signo;
88*4882a593Smuzhiyun 	new.ssi_errno = kinfo->si_errno;
89*4882a593Smuzhiyun 	new.ssi_code  = kinfo->si_code;
90*4882a593Smuzhiyun 	switch (siginfo_layout(kinfo->si_signo, kinfo->si_code)) {
91*4882a593Smuzhiyun 	case SIL_KILL:
92*4882a593Smuzhiyun 		new.ssi_pid = kinfo->si_pid;
93*4882a593Smuzhiyun 		new.ssi_uid = kinfo->si_uid;
94*4882a593Smuzhiyun 		break;
95*4882a593Smuzhiyun 	case SIL_TIMER:
96*4882a593Smuzhiyun 		new.ssi_tid = kinfo->si_tid;
97*4882a593Smuzhiyun 		new.ssi_overrun = kinfo->si_overrun;
98*4882a593Smuzhiyun 		new.ssi_ptr = (long) kinfo->si_ptr;
99*4882a593Smuzhiyun 		new.ssi_int = kinfo->si_int;
100*4882a593Smuzhiyun 		break;
101*4882a593Smuzhiyun 	case SIL_POLL:
102*4882a593Smuzhiyun 		new.ssi_band = kinfo->si_band;
103*4882a593Smuzhiyun 		new.ssi_fd   = kinfo->si_fd;
104*4882a593Smuzhiyun 		break;
105*4882a593Smuzhiyun 	case SIL_FAULT_BNDERR:
106*4882a593Smuzhiyun 	case SIL_FAULT_PKUERR:
107*4882a593Smuzhiyun 		/*
108*4882a593Smuzhiyun 		 * Fall through to the SIL_FAULT case.  Both SIL_FAULT_BNDERR
109*4882a593Smuzhiyun 		 * and SIL_FAULT_PKUERR are only generated by faults that
110*4882a593Smuzhiyun 		 * deliver them synchronously to userspace.  In case someone
111*4882a593Smuzhiyun 		 * injects one of these signals and signalfd catches it treat
112*4882a593Smuzhiyun 		 * it as SIL_FAULT.
113*4882a593Smuzhiyun 		 */
114*4882a593Smuzhiyun 	case SIL_FAULT:
115*4882a593Smuzhiyun 		new.ssi_addr = (long) kinfo->si_addr;
116*4882a593Smuzhiyun #ifdef __ARCH_SI_TRAPNO
117*4882a593Smuzhiyun 		new.ssi_trapno = kinfo->si_trapno;
118*4882a593Smuzhiyun #endif
119*4882a593Smuzhiyun 		break;
120*4882a593Smuzhiyun 	case SIL_FAULT_MCEERR:
121*4882a593Smuzhiyun 		new.ssi_addr = (long) kinfo->si_addr;
122*4882a593Smuzhiyun #ifdef __ARCH_SI_TRAPNO
123*4882a593Smuzhiyun 		new.ssi_trapno = kinfo->si_trapno;
124*4882a593Smuzhiyun #endif
125*4882a593Smuzhiyun 		new.ssi_addr_lsb = (short) kinfo->si_addr_lsb;
126*4882a593Smuzhiyun 		break;
127*4882a593Smuzhiyun 	case SIL_CHLD:
128*4882a593Smuzhiyun 		new.ssi_pid    = kinfo->si_pid;
129*4882a593Smuzhiyun 		new.ssi_uid    = kinfo->si_uid;
130*4882a593Smuzhiyun 		new.ssi_status = kinfo->si_status;
131*4882a593Smuzhiyun 		new.ssi_utime  = kinfo->si_utime;
132*4882a593Smuzhiyun 		new.ssi_stime  = kinfo->si_stime;
133*4882a593Smuzhiyun 		break;
134*4882a593Smuzhiyun 	case SIL_RT:
135*4882a593Smuzhiyun 		/*
136*4882a593Smuzhiyun 		 * This case catches also the signals queued by sigqueue().
137*4882a593Smuzhiyun 		 */
138*4882a593Smuzhiyun 		new.ssi_pid = kinfo->si_pid;
139*4882a593Smuzhiyun 		new.ssi_uid = kinfo->si_uid;
140*4882a593Smuzhiyun 		new.ssi_ptr = (long) kinfo->si_ptr;
141*4882a593Smuzhiyun 		new.ssi_int = kinfo->si_int;
142*4882a593Smuzhiyun 		break;
143*4882a593Smuzhiyun 	case SIL_SYS:
144*4882a593Smuzhiyun 		new.ssi_call_addr = (long) kinfo->si_call_addr;
145*4882a593Smuzhiyun 		new.ssi_syscall   = kinfo->si_syscall;
146*4882a593Smuzhiyun 		new.ssi_arch      = kinfo->si_arch;
147*4882a593Smuzhiyun 		break;
148*4882a593Smuzhiyun 	}
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 	if (copy_to_user(uinfo, &new, sizeof(struct signalfd_siginfo)))
151*4882a593Smuzhiyun 		return -EFAULT;
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 	return sizeof(*uinfo);
154*4882a593Smuzhiyun }
155*4882a593Smuzhiyun 
signalfd_dequeue(struct signalfd_ctx * ctx,kernel_siginfo_t * info,int nonblock)156*4882a593Smuzhiyun static ssize_t signalfd_dequeue(struct signalfd_ctx *ctx, kernel_siginfo_t *info,
157*4882a593Smuzhiyun 				int nonblock)
158*4882a593Smuzhiyun {
159*4882a593Smuzhiyun 	ssize_t ret;
160*4882a593Smuzhiyun 	DECLARE_WAITQUEUE(wait, current);
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun 	spin_lock_irq(&current->sighand->siglock);
163*4882a593Smuzhiyun 	ret = dequeue_signal(current, &ctx->sigmask, info);
164*4882a593Smuzhiyun 	switch (ret) {
165*4882a593Smuzhiyun 	case 0:
166*4882a593Smuzhiyun 		if (!nonblock)
167*4882a593Smuzhiyun 			break;
168*4882a593Smuzhiyun 		ret = -EAGAIN;
169*4882a593Smuzhiyun 		fallthrough;
170*4882a593Smuzhiyun 	default:
171*4882a593Smuzhiyun 		spin_unlock_irq(&current->sighand->siglock);
172*4882a593Smuzhiyun 		return ret;
173*4882a593Smuzhiyun 	}
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 	add_wait_queue(&current->sighand->signalfd_wqh, &wait);
176*4882a593Smuzhiyun 	for (;;) {
177*4882a593Smuzhiyun 		set_current_state(TASK_INTERRUPTIBLE);
178*4882a593Smuzhiyun 		ret = dequeue_signal(current, &ctx->sigmask, info);
179*4882a593Smuzhiyun 		if (ret != 0)
180*4882a593Smuzhiyun 			break;
181*4882a593Smuzhiyun 		if (signal_pending(current)) {
182*4882a593Smuzhiyun 			ret = -ERESTARTSYS;
183*4882a593Smuzhiyun 			break;
184*4882a593Smuzhiyun 		}
185*4882a593Smuzhiyun 		spin_unlock_irq(&current->sighand->siglock);
186*4882a593Smuzhiyun 		schedule();
187*4882a593Smuzhiyun 		spin_lock_irq(&current->sighand->siglock);
188*4882a593Smuzhiyun 	}
189*4882a593Smuzhiyun 	spin_unlock_irq(&current->sighand->siglock);
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun 	remove_wait_queue(&current->sighand->signalfd_wqh, &wait);
192*4882a593Smuzhiyun 	__set_current_state(TASK_RUNNING);
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun 	return ret;
195*4882a593Smuzhiyun }
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun /*
198*4882a593Smuzhiyun  * Returns a multiple of the size of a "struct signalfd_siginfo", or a negative
199*4882a593Smuzhiyun  * error code. The "count" parameter must be at least the size of a
200*4882a593Smuzhiyun  * "struct signalfd_siginfo".
201*4882a593Smuzhiyun  */
signalfd_read(struct file * file,char __user * buf,size_t count,loff_t * ppos)202*4882a593Smuzhiyun static ssize_t signalfd_read(struct file *file, char __user *buf, size_t count,
203*4882a593Smuzhiyun 			     loff_t *ppos)
204*4882a593Smuzhiyun {
205*4882a593Smuzhiyun 	struct signalfd_ctx *ctx = file->private_data;
206*4882a593Smuzhiyun 	struct signalfd_siginfo __user *siginfo;
207*4882a593Smuzhiyun 	int nonblock = file->f_flags & O_NONBLOCK;
208*4882a593Smuzhiyun 	ssize_t ret, total = 0;
209*4882a593Smuzhiyun 	kernel_siginfo_t info;
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun 	count /= sizeof(struct signalfd_siginfo);
212*4882a593Smuzhiyun 	if (!count)
213*4882a593Smuzhiyun 		return -EINVAL;
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun 	siginfo = (struct signalfd_siginfo __user *) buf;
216*4882a593Smuzhiyun 	do {
217*4882a593Smuzhiyun 		ret = signalfd_dequeue(ctx, &info, nonblock);
218*4882a593Smuzhiyun 		if (unlikely(ret <= 0))
219*4882a593Smuzhiyun 			break;
220*4882a593Smuzhiyun 		ret = signalfd_copyinfo(siginfo, &info);
221*4882a593Smuzhiyun 		if (ret < 0)
222*4882a593Smuzhiyun 			break;
223*4882a593Smuzhiyun 		siginfo++;
224*4882a593Smuzhiyun 		total += ret;
225*4882a593Smuzhiyun 		nonblock = 1;
226*4882a593Smuzhiyun 	} while (--count);
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun 	return total ? total: ret;
229*4882a593Smuzhiyun }
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun #ifdef CONFIG_PROC_FS
signalfd_show_fdinfo(struct seq_file * m,struct file * f)232*4882a593Smuzhiyun static void signalfd_show_fdinfo(struct seq_file *m, struct file *f)
233*4882a593Smuzhiyun {
234*4882a593Smuzhiyun 	struct signalfd_ctx *ctx = f->private_data;
235*4882a593Smuzhiyun 	sigset_t sigmask;
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun 	sigmask = ctx->sigmask;
238*4882a593Smuzhiyun 	signotset(&sigmask);
239*4882a593Smuzhiyun 	render_sigset_t(m, "sigmask:\t", &sigmask);
240*4882a593Smuzhiyun }
241*4882a593Smuzhiyun #endif
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun static const struct file_operations signalfd_fops = {
244*4882a593Smuzhiyun #ifdef CONFIG_PROC_FS
245*4882a593Smuzhiyun 	.show_fdinfo	= signalfd_show_fdinfo,
246*4882a593Smuzhiyun #endif
247*4882a593Smuzhiyun 	.release	= signalfd_release,
248*4882a593Smuzhiyun 	.poll		= signalfd_poll,
249*4882a593Smuzhiyun 	.read		= signalfd_read,
250*4882a593Smuzhiyun 	.llseek		= noop_llseek,
251*4882a593Smuzhiyun };
252*4882a593Smuzhiyun 
do_signalfd4(int ufd,sigset_t * mask,int flags)253*4882a593Smuzhiyun static int do_signalfd4(int ufd, sigset_t *mask, int flags)
254*4882a593Smuzhiyun {
255*4882a593Smuzhiyun 	struct signalfd_ctx *ctx;
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun 	/* Check the SFD_* constants for consistency.  */
258*4882a593Smuzhiyun 	BUILD_BUG_ON(SFD_CLOEXEC != O_CLOEXEC);
259*4882a593Smuzhiyun 	BUILD_BUG_ON(SFD_NONBLOCK != O_NONBLOCK);
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun 	if (flags & ~(SFD_CLOEXEC | SFD_NONBLOCK))
262*4882a593Smuzhiyun 		return -EINVAL;
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun 	sigdelsetmask(mask, sigmask(SIGKILL) | sigmask(SIGSTOP));
265*4882a593Smuzhiyun 	signotset(mask);
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun 	if (ufd == -1) {
268*4882a593Smuzhiyun 		ctx = kmalloc(sizeof(*ctx), GFP_KERNEL);
269*4882a593Smuzhiyun 		if (!ctx)
270*4882a593Smuzhiyun 			return -ENOMEM;
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun 		ctx->sigmask = *mask;
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun 		/*
275*4882a593Smuzhiyun 		 * When we call this, the initialization must be complete, since
276*4882a593Smuzhiyun 		 * anon_inode_getfd() will install the fd.
277*4882a593Smuzhiyun 		 */
278*4882a593Smuzhiyun 		ufd = anon_inode_getfd("[signalfd]", &signalfd_fops, ctx,
279*4882a593Smuzhiyun 				       O_RDWR | (flags & (O_CLOEXEC | O_NONBLOCK)));
280*4882a593Smuzhiyun 		if (ufd < 0)
281*4882a593Smuzhiyun 			kfree(ctx);
282*4882a593Smuzhiyun 	} else {
283*4882a593Smuzhiyun 		struct fd f = fdget(ufd);
284*4882a593Smuzhiyun 		if (!f.file)
285*4882a593Smuzhiyun 			return -EBADF;
286*4882a593Smuzhiyun 		ctx = f.file->private_data;
287*4882a593Smuzhiyun 		if (f.file->f_op != &signalfd_fops) {
288*4882a593Smuzhiyun 			fdput(f);
289*4882a593Smuzhiyun 			return -EINVAL;
290*4882a593Smuzhiyun 		}
291*4882a593Smuzhiyun 		spin_lock_irq(&current->sighand->siglock);
292*4882a593Smuzhiyun 		ctx->sigmask = *mask;
293*4882a593Smuzhiyun 		spin_unlock_irq(&current->sighand->siglock);
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun 		wake_up(&current->sighand->signalfd_wqh);
296*4882a593Smuzhiyun 		fdput(f);
297*4882a593Smuzhiyun 	}
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun 	return ufd;
300*4882a593Smuzhiyun }
301*4882a593Smuzhiyun 
SYSCALL_DEFINE4(signalfd4,int,ufd,sigset_t __user *,user_mask,size_t,sizemask,int,flags)302*4882a593Smuzhiyun SYSCALL_DEFINE4(signalfd4, int, ufd, sigset_t __user *, user_mask,
303*4882a593Smuzhiyun 		size_t, sizemask, int, flags)
304*4882a593Smuzhiyun {
305*4882a593Smuzhiyun 	sigset_t mask;
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun 	if (sizemask != sizeof(sigset_t))
308*4882a593Smuzhiyun 		return -EINVAL;
309*4882a593Smuzhiyun 	if (copy_from_user(&mask, user_mask, sizeof(mask)))
310*4882a593Smuzhiyun 		return -EFAULT;
311*4882a593Smuzhiyun 	return do_signalfd4(ufd, &mask, flags);
312*4882a593Smuzhiyun }
313*4882a593Smuzhiyun 
SYSCALL_DEFINE3(signalfd,int,ufd,sigset_t __user *,user_mask,size_t,sizemask)314*4882a593Smuzhiyun SYSCALL_DEFINE3(signalfd, int, ufd, sigset_t __user *, user_mask,
315*4882a593Smuzhiyun 		size_t, sizemask)
316*4882a593Smuzhiyun {
317*4882a593Smuzhiyun 	sigset_t mask;
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun 	if (sizemask != sizeof(sigset_t))
320*4882a593Smuzhiyun 		return -EINVAL;
321*4882a593Smuzhiyun 	if (copy_from_user(&mask, user_mask, sizeof(mask)))
322*4882a593Smuzhiyun 		return -EFAULT;
323*4882a593Smuzhiyun 	return do_signalfd4(ufd, &mask, 0);
324*4882a593Smuzhiyun }
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun #ifdef CONFIG_COMPAT
do_compat_signalfd4(int ufd,const compat_sigset_t __user * user_mask,compat_size_t sigsetsize,int flags)327*4882a593Smuzhiyun static long do_compat_signalfd4(int ufd,
328*4882a593Smuzhiyun 			const compat_sigset_t __user *user_mask,
329*4882a593Smuzhiyun 			compat_size_t sigsetsize, int flags)
330*4882a593Smuzhiyun {
331*4882a593Smuzhiyun 	sigset_t mask;
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun 	if (sigsetsize != sizeof(compat_sigset_t))
334*4882a593Smuzhiyun 		return -EINVAL;
335*4882a593Smuzhiyun 	if (get_compat_sigset(&mask, user_mask))
336*4882a593Smuzhiyun 		return -EFAULT;
337*4882a593Smuzhiyun 	return do_signalfd4(ufd, &mask, flags);
338*4882a593Smuzhiyun }
339*4882a593Smuzhiyun 
COMPAT_SYSCALL_DEFINE4(signalfd4,int,ufd,const compat_sigset_t __user *,user_mask,compat_size_t,sigsetsize,int,flags)340*4882a593Smuzhiyun COMPAT_SYSCALL_DEFINE4(signalfd4, int, ufd,
341*4882a593Smuzhiyun 		     const compat_sigset_t __user *, user_mask,
342*4882a593Smuzhiyun 		     compat_size_t, sigsetsize,
343*4882a593Smuzhiyun 		     int, flags)
344*4882a593Smuzhiyun {
345*4882a593Smuzhiyun 	return do_compat_signalfd4(ufd, user_mask, sigsetsize, flags);
346*4882a593Smuzhiyun }
347*4882a593Smuzhiyun 
COMPAT_SYSCALL_DEFINE3(signalfd,int,ufd,const compat_sigset_t __user *,user_mask,compat_size_t,sigsetsize)348*4882a593Smuzhiyun COMPAT_SYSCALL_DEFINE3(signalfd, int, ufd,
349*4882a593Smuzhiyun 		     const compat_sigset_t __user *, user_mask,
350*4882a593Smuzhiyun 		     compat_size_t, sigsetsize)
351*4882a593Smuzhiyun {
352*4882a593Smuzhiyun 	return do_compat_signalfd4(ufd, user_mask, sigsetsize, 0);
353*4882a593Smuzhiyun }
354*4882a593Smuzhiyun #endif
355