@@ -182,6 +182,37 @@ static int io_sendmsg_copy_hdr(struct io_kiocb *req,
182
182
& iomsg -> free_iov );
183
183
}
184
184
185
+ int io_sendzc_prep_async (struct io_kiocb * req )
186
+ {
187
+ struct io_sendzc * zc = io_kiocb_to_cmd (req , struct io_sendzc );
188
+ struct io_async_msghdr * io ;
189
+ int ret ;
190
+
191
+ if (!zc -> addr || req_has_async_data (req ))
192
+ return 0 ;
193
+ if (io_alloc_async_data (req ))
194
+ return - ENOMEM ;
195
+
196
+ io = req -> async_data ;
197
+ ret = move_addr_to_kernel (zc -> addr , zc -> addr_len , & io -> addr );
198
+ return ret ;
199
+ }
200
+
201
+ static int io_setup_async_addr (struct io_kiocb * req ,
202
+ struct sockaddr_storage * addr ,
203
+ unsigned int issue_flags )
204
+ {
205
+ struct io_async_msghdr * io ;
206
+
207
+ if (!addr || req_has_async_data (req ))
208
+ return - EAGAIN ;
209
+ if (io_alloc_async_data (req ))
210
+ return - ENOMEM ;
211
+ io = req -> async_data ;
212
+ memcpy (& io -> addr , addr , sizeof (io -> addr ));
213
+ return - EAGAIN ;
214
+ }
215
+
185
216
int io_sendmsg_prep_async (struct io_kiocb * req )
186
217
{
187
218
int ret ;
@@ -944,7 +975,7 @@ static int io_sg_from_iter(struct sock *sk, struct sk_buff *skb,
944
975
945
976
int io_sendzc (struct io_kiocb * req , unsigned int issue_flags )
946
977
{
947
- struct sockaddr_storage address ;
978
+ struct sockaddr_storage __address , * addr = NULL ;
948
979
struct io_ring_ctx * ctx = req -> ctx ;
949
980
struct io_sendzc * zc = io_kiocb_to_cmd (req , struct io_sendzc );
950
981
struct io_notif_slot * notif_slot ;
@@ -978,10 +1009,17 @@ int io_sendzc(struct io_kiocb *req, unsigned int issue_flags)
978
1009
msg .msg_namelen = 0 ;
979
1010
980
1011
if (zc -> addr ) {
981
- ret = move_addr_to_kernel (zc -> addr , zc -> addr_len , & address );
982
- if (unlikely (ret < 0 ))
983
- return ret ;
984
- msg .msg_name = (struct sockaddr * )& address ;
1012
+ if (req_has_async_data (req )) {
1013
+ struct io_async_msghdr * io = req -> async_data ;
1014
+
1015
+ msg .msg_name = addr = & io -> addr ;
1016
+ } else {
1017
+ ret = move_addr_to_kernel (zc -> addr , zc -> addr_len , & __address );
1018
+ if (unlikely (ret < 0 ))
1019
+ return ret ;
1020
+ msg .msg_name = (struct sockaddr * )& __address ;
1021
+ addr = & __address ;
1022
+ }
985
1023
msg .msg_namelen = zc -> addr_len ;
986
1024
}
987
1025
@@ -1013,13 +1051,14 @@ int io_sendzc(struct io_kiocb *req, unsigned int issue_flags)
1013
1051
1014
1052
if (unlikely (ret < min_ret )) {
1015
1053
if (ret == - EAGAIN && (issue_flags & IO_URING_F_NONBLOCK ))
1016
- return - EAGAIN ;
1054
+ return io_setup_async_addr (req , addr , issue_flags );
1055
+
1017
1056
if (ret > 0 && io_net_retry (sock , msg .msg_flags )) {
1018
1057
zc -> len -= ret ;
1019
1058
zc -> buf += ret ;
1020
1059
zc -> done_io += ret ;
1021
1060
req -> flags |= REQ_F_PARTIAL_IO ;
1022
- return - EAGAIN ;
1061
+ return io_setup_async_addr ( req , addr , issue_flags ) ;
1023
1062
}
1024
1063
if (ret == - ERESTARTSYS )
1025
1064
ret = - EINTR ;
0 commit comments