diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2014-11-07 14:13:53 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2014-11-24 04:32:52 -0500 |
commit | 3af0bfe582322265745114f94d4b7e21e4d2a302 (patch) | |
tree | 3925bd0c330d7b64b0aefe41efc185ea4656695f /drivers/net/macvtap.c | |
parent | 9b067034d0cd4ee7bbbc317567f4e38ff7ca65c4 (diff) |
switch macvtap to ->read_iter()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'drivers/net/macvtap.c')
-rw-r--r-- | drivers/net/macvtap.c | 61 |
1 files changed, 27 insertions, 34 deletions
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index 42a80d3de839..8f8004552d8e 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c | |||
@@ -831,64 +831,55 @@ done: | |||
831 | } | 831 | } |
832 | 832 | ||
833 | static ssize_t macvtap_do_read(struct macvtap_queue *q, | 833 | static ssize_t macvtap_do_read(struct macvtap_queue *q, |
834 | const struct iovec *iv, unsigned long segs, | 834 | struct iov_iter *to, |
835 | unsigned long len, | ||
836 | int noblock) | 835 | int noblock) |
837 | { | 836 | { |
838 | DEFINE_WAIT(wait); | 837 | DEFINE_WAIT(wait); |
839 | struct sk_buff *skb; | 838 | struct sk_buff *skb; |
840 | ssize_t ret = 0; | 839 | ssize_t ret = 0; |
841 | struct iov_iter iter; | ||
842 | 840 | ||
843 | while (len) { | 841 | if (!iov_iter_count(to)) |
842 | return 0; | ||
843 | |||
844 | while (1) { | ||
844 | if (!noblock) | 845 | if (!noblock) |
845 | prepare_to_wait(sk_sleep(&q->sk), &wait, | 846 | prepare_to_wait(sk_sleep(&q->sk), &wait, |
846 | TASK_INTERRUPTIBLE); | 847 | TASK_INTERRUPTIBLE); |
847 | 848 | ||
848 | /* Read frames from the queue */ | 849 | /* Read frames from the queue */ |
849 | skb = skb_dequeue(&q->sk.sk_receive_queue); | 850 | skb = skb_dequeue(&q->sk.sk_receive_queue); |
850 | if (!skb) { | 851 | if (skb) |
851 | if (noblock) { | 852 | break; |
852 | ret = -EAGAIN; | 853 | if (noblock) { |
853 | break; | 854 | ret = -EAGAIN; |
854 | } | 855 | break; |
855 | if (signal_pending(current)) { | ||
856 | ret = -ERESTARTSYS; | ||
857 | break; | ||
858 | } | ||
859 | /* Nothing to read, let's sleep */ | ||
860 | schedule(); | ||
861 | continue; | ||
862 | } | 856 | } |
863 | iov_iter_init(&iter, READ, iv, segs, len); | 857 | if (signal_pending(current)) { |
864 | ret = macvtap_put_user(q, skb, &iter); | 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); | ||
865 | kfree_skb(skb); | 866 | kfree_skb(skb); |
866 | break; | ||
867 | } | 867 | } |
868 | |||
869 | if (!noblock) | 868 | if (!noblock) |
870 | finish_wait(sk_sleep(&q->sk), &wait); | 869 | finish_wait(sk_sleep(&q->sk), &wait); |
871 | return ret; | 870 | return ret; |
872 | } | 871 | } |
873 | 872 | ||
874 | static ssize_t macvtap_aio_read(struct kiocb *iocb, const struct iovec *iv, | 873 | static ssize_t macvtap_read_iter(struct kiocb *iocb, struct iov_iter *to) |
875 | unsigned long count, loff_t pos) | ||
876 | { | 874 | { |
877 | struct file *file = iocb->ki_filp; | 875 | struct file *file = iocb->ki_filp; |
878 | struct macvtap_queue *q = file->private_data; | 876 | struct macvtap_queue *q = file->private_data; |
879 | ssize_t len, ret = 0; | 877 | ssize_t len = iov_iter_count(to), ret; |
880 | 878 | ||
881 | len = iov_length(iv, count); | 879 | ret = macvtap_do_read(q, to, file->f_flags & O_NONBLOCK); |
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); | ||
888 | ret = min_t(ssize_t, ret, len); | 880 | ret = min_t(ssize_t, ret, len); |
889 | if (ret > 0) | 881 | if (ret > 0) |
890 | iocb->ki_pos = ret; | 882 | iocb->ki_pos = ret; |
891 | out: | ||
892 | return ret; | 883 | return ret; |
893 | } | 884 | } |
894 | 885 | ||
@@ -1089,7 +1080,8 @@ static const struct file_operations macvtap_fops = { | |||
1089 | .owner = THIS_MODULE, | 1080 | .owner = THIS_MODULE, |
1090 | .open = macvtap_open, | 1081 | .open = macvtap_open, |
1091 | .release = macvtap_release, | 1082 | .release = macvtap_release, |
1092 | .aio_read = macvtap_aio_read, | 1083 | .read = new_sync_read, |
1084 | .read_iter = macvtap_read_iter, | ||
1093 | .aio_write = macvtap_aio_write, | 1085 | .aio_write = macvtap_aio_write, |
1094 | .poll = macvtap_poll, | 1086 | .poll = macvtap_poll, |
1095 | .llseek = no_llseek, | 1087 | .llseek = no_llseek, |
@@ -1112,11 +1104,12 @@ static int macvtap_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1112 | int flags) | 1104 | int flags) |
1113 | { | 1105 | { |
1114 | struct macvtap_queue *q = container_of(sock, struct macvtap_queue, sock); | 1106 | struct macvtap_queue *q = container_of(sock, struct macvtap_queue, sock); |
1107 | struct iov_iter to; | ||
1115 | int ret; | 1108 | int ret; |
1116 | if (flags & ~(MSG_DONTWAIT|MSG_TRUNC)) | 1109 | if (flags & ~(MSG_DONTWAIT|MSG_TRUNC)) |
1117 | return -EINVAL; | 1110 | return -EINVAL; |
1118 | ret = macvtap_do_read(q, m->msg_iov, m->msg_iovlen, total_len, | 1111 | iov_iter_init(&to, READ, m->msg_iov, m->msg_iovlen, total_len); |
1119 | flags & MSG_DONTWAIT); | 1112 | ret = macvtap_do_read(q, &to, flags & MSG_DONTWAIT); |
1120 | if (ret > total_len) { | 1113 | if (ret > total_len) { |
1121 | m->msg_flags |= MSG_TRUNC; | 1114 | m->msg_flags |= MSG_TRUNC; |
1122 | ret = flags & MSG_TRUNC ? ret : total_len; | 1115 | ret = flags & MSG_TRUNC ? ret : total_len; |