mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-01-07 08:10:19 -05:00
tap: add support for IOCB_NOWAIT
The tap driver already supports passing in nonblocking state based on O_NONBLOCK, add support for checking IOCB_NOWAIT as well. With that done, we can flag it with FMODE_NOWAIT as well. Signed-off-by: Jens Axboe <axboe@kernel.dk> Link: https://lore.kernel.org/r/8f859870-e6e2-09ca-9c0f-a2aa7c984fb2@kernel.dk Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
438b406055
commit
f758bfec37
@@ -555,6 +555,9 @@ static int tap_open(struct inode *inode, struct file *file)
|
||||
goto err_put;
|
||||
}
|
||||
|
||||
/* tap groks IOCB_NOWAIT just fine, mark it as such */
|
||||
file->f_mode |= FMODE_NOWAIT;
|
||||
|
||||
dev_put(tap->dev);
|
||||
|
||||
rtnl_unlock();
|
||||
@@ -771,8 +774,12 @@ static ssize_t tap_write_iter(struct kiocb *iocb, struct iov_iter *from)
|
||||
{
|
||||
struct file *file = iocb->ki_filp;
|
||||
struct tap_queue *q = file->private_data;
|
||||
int noblock = 0;
|
||||
|
||||
return tap_get_user(q, NULL, from, file->f_flags & O_NONBLOCK);
|
||||
if ((file->f_flags & O_NONBLOCK) || (iocb->ki_flags & IOCB_NOWAIT))
|
||||
noblock = 1;
|
||||
|
||||
return tap_get_user(q, NULL, from, noblock);
|
||||
}
|
||||
|
||||
/* Put packet to the user space buffer */
|
||||
@@ -888,8 +895,12 @@ static ssize_t tap_read_iter(struct kiocb *iocb, struct iov_iter *to)
|
||||
struct file *file = iocb->ki_filp;
|
||||
struct tap_queue *q = file->private_data;
|
||||
ssize_t len = iov_iter_count(to), ret;
|
||||
int noblock = 0;
|
||||
|
||||
ret = tap_do_read(q, to, file->f_flags & O_NONBLOCK, NULL);
|
||||
if ((file->f_flags & O_NONBLOCK) || (iocb->ki_flags & IOCB_NOWAIT))
|
||||
noblock = 1;
|
||||
|
||||
ret = tap_do_read(q, to, noblock, NULL);
|
||||
ret = min_t(ssize_t, ret, len);
|
||||
if (ret > 0)
|
||||
iocb->ki_pos = ret;
|
||||
|
||||
Reference in New Issue
Block a user