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

Commit 9965ed17 authored by Christoph Hellwig's avatar Christoph Hellwig
Browse files

fs: add new vfs_poll and file_can_poll helpers



These abstract out calls to the poll method in preparation for changes
in how we poll.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
parent 6e8b704d
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -113,7 +113,7 @@ static void serial2002_tty_read_poll_wait(struct file *f, int timeout)
		long elapsed;
		__poll_t mask;

		mask = f->f_op->poll(f, &table.pt);
		mask = vfs_poll(f, &table.pt);
		if (mask & (EPOLLRDNORM | EPOLLRDBAND | EPOLLIN |
			    EPOLLHUP | EPOLLERR)) {
			break;
@@ -136,7 +136,7 @@ static int serial2002_tty_read(struct file *f, int timeout)

	result = -1;
	if (!IS_ERR(f)) {
		if (f->f_op->poll) {
		if (file_can_poll(f)) {
			serial2002_tty_read_poll_wait(f, timeout);

			if (kernel_read(f, &ch, 1, &pos) == 1)
+1 −1
Original line number Diff line number Diff line
@@ -166,7 +166,7 @@ int vfio_virqfd_enable(void *opaque,
	init_waitqueue_func_entry(&virqfd->wait, virqfd_wakeup);
	init_poll_funcptr(&virqfd->pt, virqfd_ptable_queue_proc);

	events = irqfd.file->f_op->poll(irqfd.file, &virqfd->pt);
	events = vfs_poll(irqfd.file, &virqfd->pt);

	/*
	 * Check if there was an event already pending on the eventfd
+1 −1
Original line number Diff line number Diff line
@@ -208,7 +208,7 @@ int vhost_poll_start(struct vhost_poll *poll, struct file *file)
	if (poll->wqh)
		return 0;

	mask = file->f_op->poll(file, &poll->table);
	mask = vfs_poll(file, &poll->table);
	if (mask)
		vhost_poll_wakeup(&poll->wait, 0, 0, poll_to_key(mask));
	if (mask & EPOLLERR) {
+2 −3
Original line number Diff line number Diff line
@@ -884,8 +884,7 @@ static __poll_t ep_item_poll(const struct epitem *epi, poll_table *pt,

	pt->_key = epi->event.events;
	if (!is_file_epoll(epi->ffd.file))
		return epi->ffd.file->f_op->poll(epi->ffd.file, pt) &
		       epi->event.events;
		return vfs_poll(epi->ffd.file, pt) & epi->event.events;

	ep = epi->ffd.file->private_data;
	poll_wait(epi->ffd.file, &ep->poll_wait, pt);
@@ -2025,7 +2024,7 @@ SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd,

	/* The target file descriptor must support poll */
	error = -EPERM;
	if (!tf.file->f_op->poll)
	if (!file_can_poll(tf.file))
		goto error_tgt_fput;

	/* Check if EPOLLWAKEUP is allowed */
+8 −15
Original line number Diff line number Diff line
@@ -502,14 +502,10 @@ static int do_select(int n, fd_set_bits *fds, struct timespec64 *end_time)
					continue;
				f = fdget(i);
				if (f.file) {
					const struct file_operations *f_op;
					f_op = f.file->f_op;
					mask = DEFAULT_POLLMASK;
					if (f_op->poll) {
						wait_key_set(wait, in, out,
							     bit, busy_flag);
						mask = (*f_op->poll)(f.file, wait);
					}
					wait_key_set(wait, in, out, bit,
						     busy_flag);
					mask = vfs_poll(f.file, wait);

					fdput(f);
					if ((mask & POLLIN_SET) && (in & bit)) {
						res_in |= bit;
@@ -825,13 +821,10 @@ static inline __poll_t do_pollfd(struct pollfd *pollfd, poll_table *pwait,

	/* userland u16 ->events contains POLL... bitmap */
	filter = demangle_poll(pollfd->events) | EPOLLERR | EPOLLHUP;
	mask = DEFAULT_POLLMASK;
	if (f.file->f_op->poll) {
	pwait->_key = filter | busy_flag;
		mask = f.file->f_op->poll(f.file, pwait);
	mask = vfs_poll(f.file, pwait);
	if (mask & busy_flag)
		*can_busy_poll = true;
	}
	mask &= filter;		/* Mask out unneeded events. */
	fdput(f);

Loading