@@ -831,64 +831,55 @@ static ssize_t macvtap_put_user(struct macvtap_queue *q,
831
831
}
832
832
833
833
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 ,
836
835
int noblock )
837
836
{
838
837
DEFINE_WAIT (wait );
839
838
struct sk_buff * skb ;
840
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
845
if (!noblock )
845
846
prepare_to_wait (sk_sleep (& q -> sk ), & wait ,
846
847
TASK_INTERRUPTIBLE );
847
848
848
849
/* Read frames from the queue */
849
850
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 ;
862
856
}
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 );
865
866
kfree_skb (skb );
866
- break ;
867
867
}
868
-
869
868
if (!noblock )
870
869
finish_wait (sk_sleep (& q -> sk ), & wait );
871
870
return ret ;
872
871
}
873
872
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 )
876
874
{
877
875
struct file * file = iocb -> ki_filp ;
878
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 );
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 );
888
880
ret = min_t (ssize_t , ret , len );
889
881
if (ret > 0 )
890
882
iocb -> ki_pos = ret ;
891
- out :
892
883
return ret ;
893
884
}
894
885
@@ -1089,7 +1080,8 @@ static const struct file_operations macvtap_fops = {
1089
1080
.owner = THIS_MODULE ,
1090
1081
.open = macvtap_open ,
1091
1082
.release = macvtap_release ,
1092
- .aio_read = macvtap_aio_read ,
1083
+ .read = new_sync_read ,
1084
+ .read_iter = macvtap_read_iter ,
1093
1085
.aio_write = macvtap_aio_write ,
1094
1086
.poll = macvtap_poll ,
1095
1087
.llseek = no_llseek ,
@@ -1112,11 +1104,12 @@ static int macvtap_recvmsg(struct kiocb *iocb, struct socket *sock,
1112
1104
int flags )
1113
1105
{
1114
1106
struct macvtap_queue * q = container_of (sock , struct macvtap_queue , sock );
1107
+ struct iov_iter to ;
1115
1108
int ret ;
1116
1109
if (flags & ~(MSG_DONTWAIT |MSG_TRUNC ))
1117
1110
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 );
1120
1113
if (ret > total_len ) {
1121
1114
m -> msg_flags |= MSG_TRUNC ;
1122
1115
ret = flags & MSG_TRUNC ? ret : total_len ;
0 commit comments