Commit 9b067034 authored by Al Viro's avatar Al Viro

switch drivers/net/tun.c to ->read_iter()

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 7eab8d9e
...@@ -1339,18 +1339,17 @@ static ssize_t tun_put_user(struct tun_struct *tun, ...@@ -1339,18 +1339,17 @@ static ssize_t tun_put_user(struct tun_struct *tun,
} }
static ssize_t tun_do_read(struct tun_struct *tun, struct tun_file *tfile, static ssize_t tun_do_read(struct tun_struct *tun, struct tun_file *tfile,
const struct iovec *iv, unsigned long segs, struct iov_iter *to,
ssize_t len, int noblock) int noblock)
{ {
struct sk_buff *skb; struct sk_buff *skb;
ssize_t ret = 0; ssize_t ret;
int peeked, err, off = 0; int peeked, err, off = 0;
struct iov_iter iter;
tun_debug(KERN_INFO, tun, "tun_do_read\n"); tun_debug(KERN_INFO, tun, "tun_do_read\n");
if (!len) if (!iov_iter_count(to))
return ret; return 0;
if (tun->dev->reg_state != NETREG_REGISTERED) if (tun->dev->reg_state != NETREG_REGISTERED)
return -EIO; return -EIO;
...@@ -1359,37 +1358,27 @@ static ssize_t tun_do_read(struct tun_struct *tun, struct tun_file *tfile, ...@@ -1359,37 +1358,27 @@ static ssize_t tun_do_read(struct tun_struct *tun, struct tun_file *tfile,
skb = __skb_recv_datagram(tfile->socket.sk, noblock ? MSG_DONTWAIT : 0, skb = __skb_recv_datagram(tfile->socket.sk, noblock ? MSG_DONTWAIT : 0,
&peeked, &off, &err); &peeked, &off, &err);
if (!skb) if (!skb)
return ret; return 0;
iov_iter_init(&iter, READ, iv, segs, len); ret = tun_put_user(tun, tfile, skb, to);
ret = tun_put_user(tun, tfile, skb, &iter);
kfree_skb(skb); kfree_skb(skb);
return ret; return ret;
} }
static ssize_t tun_chr_aio_read(struct kiocb *iocb, const struct iovec *iv, static ssize_t tun_chr_read_iter(struct kiocb *iocb, struct iov_iter *to)
unsigned long count, loff_t pos)
{ {
struct file *file = iocb->ki_filp; struct file *file = iocb->ki_filp;
struct tun_file *tfile = file->private_data; struct tun_file *tfile = file->private_data;
struct tun_struct *tun = __tun_get(tfile); struct tun_struct *tun = __tun_get(tfile);
ssize_t len, ret; ssize_t len = iov_iter_count(to), ret;
if (!tun) if (!tun)
return -EBADFD; return -EBADFD;
len = iov_length(iv, count); ret = tun_do_read(tun, tfile, to, file->f_flags & O_NONBLOCK);
if (len < 0) {
ret = -EINVAL;
goto out;
}
ret = tun_do_read(tun, tfile, iv, count, len,
file->f_flags & O_NONBLOCK);
ret = min_t(ssize_t, ret, len); ret = min_t(ssize_t, ret, len);
if (ret > 0) if (ret > 0)
iocb->ki_pos = ret; iocb->ki_pos = ret;
out:
tun_put(tun); tun_put(tun);
return ret; return ret;
} }
...@@ -1471,6 +1460,7 @@ static int tun_recvmsg(struct kiocb *iocb, struct socket *sock, ...@@ -1471,6 +1460,7 @@ static int tun_recvmsg(struct kiocb *iocb, struct socket *sock,
{ {
struct tun_file *tfile = container_of(sock, struct tun_file, socket); struct tun_file *tfile = container_of(sock, struct tun_file, socket);
struct tun_struct *tun = __tun_get(tfile); struct tun_struct *tun = __tun_get(tfile);
struct iov_iter to;
int ret; int ret;
if (!tun) if (!tun)
...@@ -1485,8 +1475,8 @@ static int tun_recvmsg(struct kiocb *iocb, struct socket *sock, ...@@ -1485,8 +1475,8 @@ static int tun_recvmsg(struct kiocb *iocb, struct socket *sock,
SOL_PACKET, TUN_TX_TIMESTAMP); SOL_PACKET, TUN_TX_TIMESTAMP);
goto out; goto out;
} }
ret = tun_do_read(tun, tfile, m->msg_iov, m->msg_iovlen, total_len, iov_iter_init(&to, READ, m->msg_iov, m->msg_iovlen, total_len);
flags & MSG_DONTWAIT); ret = tun_do_read(tun, tfile, &to, flags & MSG_DONTWAIT);
if (ret > total_len) { if (ret > total_len) {
m->msg_flags |= MSG_TRUNC; m->msg_flags |= MSG_TRUNC;
ret = flags & MSG_TRUNC ? ret : total_len; ret = flags & MSG_TRUNC ? ret : total_len;
...@@ -2242,8 +2232,8 @@ static int tun_chr_show_fdinfo(struct seq_file *m, struct file *f) ...@@ -2242,8 +2232,8 @@ static int tun_chr_show_fdinfo(struct seq_file *m, struct file *f)
static const struct file_operations tun_fops = { static const struct file_operations tun_fops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.llseek = no_llseek, .llseek = no_llseek,
.read = do_sync_read, .read = new_sync_read,
.aio_read = tun_chr_aio_read, .read_iter = tun_chr_read_iter,
.write = do_sync_write, .write = do_sync_write,
.aio_write = tun_chr_aio_write, .aio_write = tun_chr_aio_write,
.poll = tun_chr_poll, .poll = tun_chr_poll,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment