@@ -566,6 +566,54 @@ int io_sendmsg(struct io_kiocb *req, unsigned int issue_flags)
566
566
return IOU_OK ;
567
567
}
568
568
569
+ static int io_send_select_buffer (struct io_kiocb * req , unsigned int issue_flags ,
570
+ struct io_async_msghdr * kmsg )
571
+ {
572
+ struct io_sr_msg * sr = io_kiocb_to_cmd (req , struct io_sr_msg );
573
+
574
+ int ret ;
575
+ struct buf_sel_arg arg = {
576
+ .iovs = & kmsg -> fast_iov ,
577
+ .max_len = min_not_zero (sr -> len , INT_MAX ),
578
+ .nr_iovs = 1 ,
579
+ };
580
+
581
+ if (kmsg -> free_iov ) {
582
+ arg .nr_iovs = kmsg -> free_iov_nr ;
583
+ arg .iovs = kmsg -> free_iov ;
584
+ arg .mode = KBUF_MODE_FREE ;
585
+ }
586
+
587
+ if (!(sr -> flags & IORING_RECVSEND_BUNDLE ))
588
+ arg .nr_iovs = 1 ;
589
+ else
590
+ arg .mode |= KBUF_MODE_EXPAND ;
591
+
592
+ ret = io_buffers_select (req , & arg , issue_flags );
593
+ if (unlikely (ret < 0 ))
594
+ return ret ;
595
+
596
+ if (arg .iovs != & kmsg -> fast_iov && arg .iovs != kmsg -> free_iov ) {
597
+ kmsg -> free_iov_nr = ret ;
598
+ kmsg -> free_iov = arg .iovs ;
599
+ req -> flags |= REQ_F_NEED_CLEANUP ;
600
+ }
601
+ sr -> len = arg .out_len ;
602
+
603
+ if (ret == 1 ) {
604
+ sr -> buf = arg .iovs [0 ].iov_base ;
605
+ ret = import_ubuf (ITER_SOURCE , sr -> buf , sr -> len ,
606
+ & kmsg -> msg .msg_iter );
607
+ if (unlikely (ret ))
608
+ return ret ;
609
+ } else {
610
+ iov_iter_init (& kmsg -> msg .msg_iter , ITER_SOURCE ,
611
+ arg .iovs , ret , arg .out_len );
612
+ }
613
+
614
+ return 0 ;
615
+ }
616
+
569
617
int io_send (struct io_kiocb * req , unsigned int issue_flags )
570
618
{
571
619
struct io_sr_msg * sr = io_kiocb_to_cmd (req , struct io_sr_msg );
@@ -589,44 +637,9 @@ int io_send(struct io_kiocb *req, unsigned int issue_flags)
589
637
590
638
retry_bundle :
591
639
if (io_do_buffer_select (req )) {
592
- struct buf_sel_arg arg = {
593
- .iovs = & kmsg -> fast_iov ,
594
- .max_len = min_not_zero (sr -> len , INT_MAX ),
595
- .nr_iovs = 1 ,
596
- };
597
-
598
- if (kmsg -> free_iov ) {
599
- arg .nr_iovs = kmsg -> free_iov_nr ;
600
- arg .iovs = kmsg -> free_iov ;
601
- arg .mode = KBUF_MODE_FREE ;
602
- }
603
-
604
- if (!(sr -> flags & IORING_RECVSEND_BUNDLE ))
605
- arg .nr_iovs = 1 ;
606
- else
607
- arg .mode |= KBUF_MODE_EXPAND ;
608
-
609
- ret = io_buffers_select (req , & arg , issue_flags );
610
- if (unlikely (ret < 0 ))
640
+ ret = io_send_select_buffer (req , issue_flags , kmsg );
641
+ if (ret )
611
642
return ret ;
612
-
613
- if (arg .iovs != & kmsg -> fast_iov && arg .iovs != kmsg -> free_iov ) {
614
- kmsg -> free_iov_nr = ret ;
615
- kmsg -> free_iov = arg .iovs ;
616
- req -> flags |= REQ_F_NEED_CLEANUP ;
617
- }
618
- sr -> len = arg .out_len ;
619
-
620
- if (ret == 1 ) {
621
- sr -> buf = arg .iovs [0 ].iov_base ;
622
- ret = import_ubuf (ITER_SOURCE , sr -> buf , sr -> len ,
623
- & kmsg -> msg .msg_iter );
624
- if (unlikely (ret ))
625
- return ret ;
626
- } else {
627
- iov_iter_init (& kmsg -> msg .msg_iter , ITER_SOURCE ,
628
- arg .iovs , ret , arg .out_len );
629
- }
630
643
}
631
644
632
645
/*
0 commit comments