aio: only return events requested in poll_mask() for IOCB_CMD_POLL
The ->poll_mask() operation has a mask of events that the caller is interested in, but not all implementations might take it into account. Mask the return value to only the requested events, similar to what the poll and epoll code does. Reported-by: Avi Kivity <avi@scylladb.com> Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
4d572d9f46
commit
2739b807b0
4
fs/aio.c
4
fs/aio.c
|
@ -1661,7 +1661,7 @@ static int aio_poll_wake(struct wait_queue_entry *wait, unsigned mode, int sync,
|
|||
if (mask && !(mask & req->events))
|
||||
return 0;
|
||||
|
||||
mask = file->f_op->poll_mask(file, req->events);
|
||||
mask = file->f_op->poll_mask(file, req->events) & req->events;
|
||||
if (!mask)
|
||||
return 0;
|
||||
|
||||
|
@ -1719,7 +1719,7 @@ static ssize_t aio_poll(struct aio_kiocb *aiocb, struct iocb *iocb)
|
|||
|
||||
spin_lock_irq(&ctx->ctx_lock);
|
||||
spin_lock(&req->head->lock);
|
||||
mask = req->file->f_op->poll_mask(req->file, req->events);
|
||||
mask = req->file->f_op->poll_mask(req->file, req->events) & req->events;
|
||||
if (!mask) {
|
||||
__add_wait_queue(req->head, &req->wait);
|
||||
list_add_tail(&aiocb->ki_list, &ctx->active_reqs);
|
||||
|
|
Loading…
Reference in New Issue