@@ -566,6 +566,54 @@ int io_sendmsg(struct io_kiocb *req, unsigned int issue_flags)
566566 return IOU_OK ;
567567}
568568
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+
569617int io_send (struct io_kiocb * req , unsigned int issue_flags )
570618{
571619 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)
589637
590638retry_bundle :
591639 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 )
611642 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- }
630643 }
631644
632645 /*
0 commit comments