Skip to content

Commit 3af0bfe

Browse files
author
Al Viro
committed
switch macvtap to ->read_iter()
Signed-off-by: Al Viro <[email protected]>
1 parent 9b06703 commit 3af0bfe

File tree

1 file changed

+27
-34
lines changed

1 file changed

+27
-34
lines changed

drivers/net/macvtap.c

Lines changed: 27 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -831,64 +831,55 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
831831
}
832832

833833
static ssize_t macvtap_do_read(struct macvtap_queue *q,
834-
const struct iovec *iv, unsigned long segs,
835-
unsigned long len,
834+
struct iov_iter *to,
836835
int noblock)
837836
{
838837
DEFINE_WAIT(wait);
839838
struct sk_buff *skb;
840839
ssize_t ret = 0;
841-
struct iov_iter iter;
842840

843-
while (len) {
841+
if (!iov_iter_count(to))
842+
return 0;
843+
844+
while (1) {
844845
if (!noblock)
845846
prepare_to_wait(sk_sleep(&q->sk), &wait,
846847
TASK_INTERRUPTIBLE);
847848

848849
/* Read frames from the queue */
849850
skb = skb_dequeue(&q->sk.sk_receive_queue);
850-
if (!skb) {
851-
if (noblock) {
852-
ret = -EAGAIN;
853-
break;
854-
}
855-
if (signal_pending(current)) {
856-
ret = -ERESTARTSYS;
857-
break;
858-
}
859-
/* Nothing to read, let's sleep */
860-
schedule();
861-
continue;
851+
if (skb)
852+
break;
853+
if (noblock) {
854+
ret = -EAGAIN;
855+
break;
862856
}
863-
iov_iter_init(&iter, READ, iv, segs, len);
864-
ret = macvtap_put_user(q, skb, &iter);
857+
if (signal_pending(current)) {
858+
ret = -ERESTARTSYS;
859+
break;
860+
}
861+
/* Nothing to read, let's sleep */
862+
schedule();
863+
}
864+
if (skb) {
865+
ret = macvtap_put_user(q, skb, to);
865866
kfree_skb(skb);
866-
break;
867867
}
868-
869868
if (!noblock)
870869
finish_wait(sk_sleep(&q->sk), &wait);
871870
return ret;
872871
}
873872

874-
static ssize_t macvtap_aio_read(struct kiocb *iocb, const struct iovec *iv,
875-
unsigned long count, loff_t pos)
873+
static ssize_t macvtap_read_iter(struct kiocb *iocb, struct iov_iter *to)
876874
{
877875
struct file *file = iocb->ki_filp;
878876
struct macvtap_queue *q = file->private_data;
879-
ssize_t len, ret = 0;
877+
ssize_t len = iov_iter_count(to), ret;
880878

881-
len = iov_length(iv, count);
882-
if (len < 0) {
883-
ret = -EINVAL;
884-
goto out;
885-
}
886-
887-
ret = macvtap_do_read(q, iv, count, len, file->f_flags & O_NONBLOCK);
879+
ret = macvtap_do_read(q, to, file->f_flags & O_NONBLOCK);
888880
ret = min_t(ssize_t, ret, len);
889881
if (ret > 0)
890882
iocb->ki_pos = ret;
891-
out:
892883
return ret;
893884
}
894885

@@ -1089,7 +1080,8 @@ static const struct file_operations macvtap_fops = {
10891080
.owner = THIS_MODULE,
10901081
.open = macvtap_open,
10911082
.release = macvtap_release,
1092-
.aio_read = macvtap_aio_read,
1083+
.read = new_sync_read,
1084+
.read_iter = macvtap_read_iter,
10931085
.aio_write = macvtap_aio_write,
10941086
.poll = macvtap_poll,
10951087
.llseek = no_llseek,
@@ -1112,11 +1104,12 @@ static int macvtap_recvmsg(struct kiocb *iocb, struct socket *sock,
11121104
int flags)
11131105
{
11141106
struct macvtap_queue *q = container_of(sock, struct macvtap_queue, sock);
1107+
struct iov_iter to;
11151108
int ret;
11161109
if (flags & ~(MSG_DONTWAIT|MSG_TRUNC))
11171110
return -EINVAL;
1118-
ret = macvtap_do_read(q, m->msg_iov, m->msg_iovlen, total_len,
1119-
flags & MSG_DONTWAIT);
1111+
iov_iter_init(&to, READ, m->msg_iov, m->msg_iovlen, total_len);
1112+
ret = macvtap_do_read(q, &to, flags & MSG_DONTWAIT);
11201113
if (ret > total_len) {
11211114
m->msg_flags |= MSG_TRUNC;
11221115
ret = flags & MSG_TRUNC ? ret : total_len;

0 commit comments

Comments
 (0)