@@ -97,6 +97,11 @@ struct io_recvzc {
9797 struct io_zcrx_ifq * ifq ;
9898};
9999
100+ static int io_sg_from_iter_iovec (struct sk_buff * skb ,
101+ struct iov_iter * from , size_t length );
102+ static int io_sg_from_iter (struct sk_buff * skb ,
103+ struct iov_iter * from , size_t length );
104+
100105int io_shutdown_prep (struct io_kiocb * req , const struct io_uring_sqe * sqe )
101106{
102107 struct io_shutdown * shutdown = io_kiocb_to_cmd (req , struct io_shutdown );
@@ -1266,6 +1271,7 @@ int io_send_zc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
12661271{
12671272 struct io_sr_msg * zc = io_kiocb_to_cmd (req , struct io_sr_msg );
12681273 struct io_ring_ctx * ctx = req -> ctx ;
1274+ struct io_async_msghdr * iomsg ;
12691275 struct io_kiocb * notif ;
12701276 int ret ;
12711277
@@ -1308,8 +1314,15 @@ int io_send_zc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
13081314 if (io_is_compat (req -> ctx ))
13091315 zc -> msg_flags |= MSG_CMSG_COMPAT ;
13101316
1311- if (unlikely (!io_msg_alloc_async (req )))
1317+ iomsg = io_msg_alloc_async (req );
1318+ if (unlikely (!iomsg ))
13121319 return - ENOMEM ;
1320+
1321+ if (zc -> flags & IORING_RECVSEND_FIXED_BUF )
1322+ iomsg -> msg .sg_from_iter = io_sg_from_iter ;
1323+ else
1324+ iomsg -> msg .sg_from_iter = io_sg_from_iter_iovec ;
1325+
13131326 if (req -> opcode == IORING_OP_SEND_ZC ) {
13141327 req -> flags |= REQ_F_IMPORT_BUFFER ;
13151328 return io_send_setup (req , sqe );
@@ -1320,11 +1333,8 @@ int io_send_zc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
13201333 if (unlikely (ret ))
13211334 return ret ;
13221335
1323- if (!(zc -> flags & IORING_RECVSEND_FIXED_BUF )) {
1324- struct io_async_msghdr * iomsg = req -> async_data ;
1325-
1336+ if (!(zc -> flags & IORING_RECVSEND_FIXED_BUF ))
13261337 return io_notif_account_mem (zc -> notif , iomsg -> msg .msg_iter .count );
1327- }
13281338 return 0 ;
13291339}
13301340
@@ -1391,15 +1401,13 @@ static int io_send_zc_import(struct io_kiocb *req, unsigned int issue_flags)
13911401 ITER_SOURCE , issue_flags );
13921402 if (unlikely (ret ))
13931403 return ret ;
1394- kmsg -> msg .sg_from_iter = io_sg_from_iter ;
13951404 } else {
13961405 ret = import_ubuf (ITER_SOURCE , sr -> buf , sr -> len , & kmsg -> msg .msg_iter );
13971406 if (unlikely (ret ))
13981407 return ret ;
13991408 ret = io_notif_account_mem (sr -> notif , sr -> len );
14001409 if (unlikely (ret ))
14011410 return ret ;
1402- kmsg -> msg .sg_from_iter = io_sg_from_iter_iovec ;
14031411 }
14041412
14051413 return ret ;
@@ -1483,8 +1491,6 @@ int io_sendmsg_zc(struct io_kiocb *req, unsigned int issue_flags)
14831491 unsigned flags ;
14841492 int ret , min_ret = 0 ;
14851493
1486- kmsg -> msg .sg_from_iter = io_sg_from_iter_iovec ;
1487-
14881494 if (req -> flags & REQ_F_IMPORT_BUFFER ) {
14891495 unsigned uvec_segs = kmsg -> msg .msg_iter .nr_segs ;
14901496 int ret ;
@@ -1493,7 +1499,6 @@ int io_sendmsg_zc(struct io_kiocb *req, unsigned int issue_flags)
14931499 & kmsg -> vec , uvec_segs , issue_flags );
14941500 if (unlikely (ret ))
14951501 return ret ;
1496- kmsg -> msg .sg_from_iter = io_sg_from_iter ;
14971502 req -> flags &= ~REQ_F_IMPORT_BUFFER ;
14981503 }
14991504
0 commit comments