diff options
Diffstat (limited to 'drivers/net/tun.c')
| -rw-r--r-- | drivers/net/tun.c | 14 | 
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index be69d272052f..cd06cae76035 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -1961,12 +1961,15 @@ static ssize_t tun_chr_write_iter(struct kiocb *iocb, struct iov_iter *from)  	struct tun_file *tfile = file->private_data;  	struct tun_struct *tun = tun_get(tfile);  	ssize_t result; +	int noblock = 0;  	if (!tun)  		return -EBADFD; -	result = tun_get_user(tun, tfile, NULL, from, -			      file->f_flags & O_NONBLOCK, false); +	if ((file->f_flags & O_NONBLOCK) || (iocb->ki_flags & IOCB_NOWAIT)) +		noblock = 1; + +	result = tun_get_user(tun, tfile, NULL, from, noblock, false);  	tun_put(tun);  	return result; @@ -2185,10 +2188,15 @@ static ssize_t tun_chr_read_iter(struct kiocb *iocb, struct iov_iter *to)  	struct tun_file *tfile = file->private_data;  	struct tun_struct *tun = tun_get(tfile);  	ssize_t len = iov_iter_count(to), ret; +	int noblock = 0;  	if (!tun)  		return -EBADFD; -	ret = tun_do_read(tun, tfile, to, file->f_flags & O_NONBLOCK, NULL); + +	if ((file->f_flags & O_NONBLOCK) || (iocb->ki_flags & IOCB_NOWAIT)) +		noblock = 1; + +	ret = tun_do_read(tun, tfile, to, noblock, NULL);  	ret = min_t(ssize_t, ret, len);  	if (ret > 0)  		iocb->ki_pos = ret;  | 
