aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/macvtap.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2014-11-07 14:13:53 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2014-11-24 04:32:52 -0500
commit3af0bfe582322265745114f94d4b7e21e4d2a302 (patch)
tree3925bd0c330d7b64b0aefe41efc185ea4656695f /drivers/net/macvtap.c
parent9b067034d0cd4ee7bbbc317567f4e38ff7ca65c4 (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.c61
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
833static ssize_t macvtap_do_read(struct macvtap_queue *q, 833static 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
874static ssize_t macvtap_aio_read(struct kiocb *iocb, const struct iovec *iv, 873static 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;
891out:
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;