@@ -712,6 +712,7 @@ struct io_async_rw {
712
712
struct iovec fast_iov [UIO_FASTIOV ];
713
713
const struct iovec * free_iovec ;
714
714
struct iov_iter iter ;
715
+ struct iov_iter_state iter_state ;
715
716
size_t bytes_done ;
716
717
struct wait_page_queue wpq ;
717
718
};
@@ -735,7 +736,6 @@ enum {
735
736
REQ_F_BUFFER_SELECTED_BIT ,
736
737
REQ_F_COMPLETE_INLINE_BIT ,
737
738
REQ_F_REISSUE_BIT ,
738
- REQ_F_DONT_REISSUE_BIT ,
739
739
REQ_F_CREDS_BIT ,
740
740
REQ_F_REFCOUNT_BIT ,
741
741
REQ_F_ARM_LTIMEOUT_BIT ,
@@ -782,8 +782,6 @@ enum {
782
782
REQ_F_COMPLETE_INLINE = BIT (REQ_F_COMPLETE_INLINE_BIT ),
783
783
/* caller should reissue async */
784
784
REQ_F_REISSUE = BIT (REQ_F_REISSUE_BIT ),
785
- /* don't attempt request reissue, see io_rw_reissue() */
786
- REQ_F_DONT_REISSUE = BIT (REQ_F_DONT_REISSUE_BIT ),
787
785
/* supports async reads */
788
786
REQ_F_NOWAIT_READ = BIT (REQ_F_NOWAIT_READ_BIT ),
789
787
/* supports async writes */
@@ -2444,13 +2442,6 @@ static void io_iopoll_complete(struct io_ring_ctx *ctx, unsigned int *nr_events,
2444
2442
req = list_first_entry (done , struct io_kiocb , inflight_entry );
2445
2443
list_del (& req -> inflight_entry );
2446
2444
2447
- if (READ_ONCE (req -> result ) == - EAGAIN &&
2448
- !(req -> flags & REQ_F_DONT_REISSUE )) {
2449
- req -> iopoll_completed = 0 ;
2450
- io_req_task_queue_reissue (req );
2451
- continue ;
2452
- }
2453
-
2454
2445
__io_cqring_fill_event (ctx , req -> user_data , req -> result ,
2455
2446
io_put_rw_kbuf (req ));
2456
2447
(* nr_events )++ ;
@@ -2613,8 +2604,7 @@ static bool io_resubmit_prep(struct io_kiocb *req)
2613
2604
2614
2605
if (!rw )
2615
2606
return !io_req_prep_async (req );
2616
- /* may have left rw->iter inconsistent on -EIOCBQUEUED */
2617
- iov_iter_revert (& rw -> iter , req -> result - iov_iter_count (& rw -> iter ));
2607
+ iov_iter_restore (& rw -> iter , & rw -> iter_state );
2618
2608
return true;
2619
2609
}
2620
2610
@@ -2714,10 +2704,9 @@ static void io_complete_rw_iopoll(struct kiocb *kiocb, long res, long res2)
2714
2704
if (kiocb -> ki_flags & IOCB_WRITE )
2715
2705
kiocb_end_write (req );
2716
2706
if (unlikely (res != req -> result )) {
2717
- if (!(res == - EAGAIN && io_rw_should_reissue (req ) &&
2718
- io_resubmit_prep (req ))) {
2719
- req_set_fail (req );
2720
- req -> flags |= REQ_F_DONT_REISSUE ;
2707
+ if (res == - EAGAIN && io_rw_should_reissue (req )) {
2708
+ req -> flags |= REQ_F_REISSUE ;
2709
+ return ;
2721
2710
}
2722
2711
}
2723
2712
@@ -2937,7 +2926,6 @@ static void kiocb_done(struct kiocb *kiocb, ssize_t ret,
2937
2926
{
2938
2927
struct io_kiocb * req = container_of (kiocb , struct io_kiocb , rw .kiocb );
2939
2928
struct io_async_rw * io = req -> async_data ;
2940
- bool check_reissue = kiocb -> ki_complete == io_complete_rw ;
2941
2929
2942
2930
/* add previously done IO, if any */
2943
2931
if (io && io -> bytes_done > 0 ) {
@@ -2949,19 +2937,27 @@ static void kiocb_done(struct kiocb *kiocb, ssize_t ret,
2949
2937
2950
2938
if (req -> flags & REQ_F_CUR_POS )
2951
2939
req -> file -> f_pos = kiocb -> ki_pos ;
2952
- if (ret >= 0 && check_reissue )
2940
+ if (ret >= 0 && ( kiocb -> ki_complete == io_complete_rw ) )
2953
2941
__io_complete_rw (req , ret , 0 , issue_flags );
2954
2942
else
2955
2943
io_rw_done (kiocb , ret );
2956
2944
2957
- if (check_reissue && ( req -> flags & REQ_F_REISSUE ) ) {
2945
+ if (req -> flags & REQ_F_REISSUE ) {
2958
2946
req -> flags &= ~REQ_F_REISSUE ;
2959
2947
if (io_resubmit_prep (req )) {
2960
2948
io_req_task_queue_reissue (req );
2961
2949
} else {
2950
+ unsigned int cflags = io_put_rw_kbuf (req );
2951
+ struct io_ring_ctx * ctx = req -> ctx ;
2952
+
2962
2953
req_set_fail (req );
2963
- __io_req_complete (req , issue_flags , ret ,
2964
- io_put_rw_kbuf (req ));
2954
+ if (issue_flags & IO_URING_F_NONBLOCK ) {
2955
+ mutex_lock (& ctx -> uring_lock );
2956
+ __io_req_complete (req , issue_flags , ret , cflags );
2957
+ mutex_unlock (& ctx -> uring_lock );
2958
+ } else {
2959
+ __io_req_complete (req , issue_flags , ret , cflags );
2960
+ }
2965
2961
}
2966
2962
}
2967
2963
}
@@ -3324,12 +3320,17 @@ static int io_setup_async_rw(struct io_kiocb *req, const struct iovec *iovec,
3324
3320
if (!force && !io_op_defs [req -> opcode ].needs_async_setup )
3325
3321
return 0 ;
3326
3322
if (!req -> async_data ) {
3323
+ struct io_async_rw * iorw ;
3324
+
3327
3325
if (io_alloc_async_data (req )) {
3328
3326
kfree (iovec );
3329
3327
return - ENOMEM ;
3330
3328
}
3331
3329
3332
3330
io_req_map_rw (req , iovec , fast_iov , iter );
3331
+ iorw = req -> async_data ;
3332
+ /* we've copied and mapped the iter, ensure state is saved */
3333
+ iov_iter_save_state (& iorw -> iter , & iorw -> iter_state );
3333
3334
}
3334
3335
return 0 ;
3335
3336
}
@@ -3348,6 +3349,7 @@ static inline int io_rw_prep_async(struct io_kiocb *req, int rw)
3348
3349
iorw -> free_iovec = iov ;
3349
3350
if (iov )
3350
3351
req -> flags |= REQ_F_NEED_CLEANUP ;
3352
+ iov_iter_save_state (& iorw -> iter , & iorw -> iter_state );
3351
3353
return 0 ;
3352
3354
}
3353
3355
@@ -3451,19 +3453,28 @@ static int io_read(struct io_kiocb *req, unsigned int issue_flags)
3451
3453
struct kiocb * kiocb = & req -> rw .kiocb ;
3452
3454
struct iov_iter __iter , * iter = & __iter ;
3453
3455
struct io_async_rw * rw = req -> async_data ;
3454
- ssize_t io_size , ret , ret2 ;
3455
3456
bool force_nonblock = issue_flags & IO_URING_F_NONBLOCK ;
3457
+ struct iov_iter_state __state , * state ;
3458
+ ssize_t ret , ret2 ;
3456
3459
3457
3460
if (rw ) {
3458
3461
iter = & rw -> iter ;
3462
+ state = & rw -> iter_state ;
3463
+ /*
3464
+ * We come here from an earlier attempt, restore our state to
3465
+ * match in case it doesn't. It's cheap enough that we don't
3466
+ * need to make this conditional.
3467
+ */
3468
+ iov_iter_restore (iter , state );
3459
3469
iovec = NULL ;
3460
3470
} else {
3461
3471
ret = io_import_iovec (READ , req , & iovec , iter , !force_nonblock );
3462
3472
if (ret < 0 )
3463
3473
return ret ;
3474
+ state = & __state ;
3475
+ iov_iter_save_state (iter , state );
3464
3476
}
3465
- io_size = iov_iter_count (iter );
3466
- req -> result = io_size ;
3477
+ req -> result = iov_iter_count (iter );
3467
3478
3468
3479
/* Ensure we clear previously set non-block flag */
3469
3480
if (!force_nonblock )
@@ -3477,7 +3488,7 @@ static int io_read(struct io_kiocb *req, unsigned int issue_flags)
3477
3488
return ret ?: - EAGAIN ;
3478
3489
}
3479
3490
3480
- ret = rw_verify_area (READ , req -> file , io_kiocb_ppos (kiocb ), io_size );
3491
+ ret = rw_verify_area (READ , req -> file , io_kiocb_ppos (kiocb ), req -> result );
3481
3492
if (unlikely (ret )) {
3482
3493
kfree (iovec );
3483
3494
return ret ;
@@ -3493,30 +3504,49 @@ static int io_read(struct io_kiocb *req, unsigned int issue_flags)
3493
3504
/* no retry on NONBLOCK nor RWF_NOWAIT */
3494
3505
if (req -> flags & REQ_F_NOWAIT )
3495
3506
goto done ;
3496
- /* some cases will consume bytes even on error returns */
3497
- iov_iter_reexpand (iter , iter -> count + iter -> truncated );
3498
- iov_iter_revert (iter , io_size - iov_iter_count (iter ));
3499
3507
ret = 0 ;
3500
3508
} else if (ret == - EIOCBQUEUED ) {
3501
3509
goto out_free ;
3502
- } else if (ret <= 0 || ret == io_size || !force_nonblock ||
3510
+ } else if (ret <= 0 || ret == req -> result || !force_nonblock ||
3503
3511
(req -> flags & REQ_F_NOWAIT ) || !need_read_all (req )) {
3504
3512
/* read all, failed, already did sync or don't want to retry */
3505
3513
goto done ;
3506
3514
}
3507
3515
3516
+ /*
3517
+ * Don't depend on the iter state matching what was consumed, or being
3518
+ * untouched in case of error. Restore it and we'll advance it
3519
+ * manually if we need to.
3520
+ */
3521
+ iov_iter_restore (iter , state );
3522
+
3508
3523
ret2 = io_setup_async_rw (req , iovec , inline_vecs , iter , true);
3509
3524
if (ret2 )
3510
3525
return ret2 ;
3511
3526
3512
3527
iovec = NULL ;
3513
3528
rw = req -> async_data ;
3514
- /* now use our persistent iterator, if we aren't already */
3515
- iter = & rw -> iter ;
3529
+ /*
3530
+ * Now use our persistent iterator and state, if we aren't already.
3531
+ * We've restored and mapped the iter to match.
3532
+ */
3533
+ if (iter != & rw -> iter ) {
3534
+ iter = & rw -> iter ;
3535
+ state = & rw -> iter_state ;
3536
+ }
3516
3537
3517
3538
do {
3518
- io_size -= ret ;
3539
+ /*
3540
+ * We end up here because of a partial read, either from
3541
+ * above or inside this loop. Advance the iter by the bytes
3542
+ * that were consumed.
3543
+ */
3544
+ iov_iter_advance (iter , ret );
3545
+ if (!iov_iter_count (iter ))
3546
+ break ;
3519
3547
rw -> bytes_done += ret ;
3548
+ iov_iter_save_state (iter , state );
3549
+
3520
3550
/* if we can retry, do so with the callbacks armed */
3521
3551
if (!io_rw_should_retry (req )) {
3522
3552
kiocb -> ki_flags &= ~IOCB_WAITQ ;
@@ -3534,7 +3564,8 @@ static int io_read(struct io_kiocb *req, unsigned int issue_flags)
3534
3564
return 0 ;
3535
3565
/* we got some bytes, but not all. retry. */
3536
3566
kiocb -> ki_flags &= ~IOCB_WAITQ ;
3537
- } while (ret > 0 && ret < io_size );
3567
+ iov_iter_restore (iter , state );
3568
+ } while (ret > 0 );
3538
3569
done :
3539
3570
kiocb_done (kiocb , ret , issue_flags );
3540
3571
out_free :
@@ -3557,19 +3588,24 @@ static int io_write(struct io_kiocb *req, unsigned int issue_flags)
3557
3588
struct kiocb * kiocb = & req -> rw .kiocb ;
3558
3589
struct iov_iter __iter , * iter = & __iter ;
3559
3590
struct io_async_rw * rw = req -> async_data ;
3560
- ssize_t ret , ret2 , io_size ;
3561
3591
bool force_nonblock = issue_flags & IO_URING_F_NONBLOCK ;
3592
+ struct iov_iter_state __state , * state ;
3593
+ ssize_t ret , ret2 ;
3562
3594
3563
3595
if (rw ) {
3564
3596
iter = & rw -> iter ;
3597
+ state = & rw -> iter_state ;
3598
+ iov_iter_restore (iter , state );
3565
3599
iovec = NULL ;
3566
3600
} else {
3567
3601
ret = io_import_iovec (WRITE , req , & iovec , iter , !force_nonblock );
3568
3602
if (ret < 0 )
3569
3603
return ret ;
3604
+ state = & __state ;
3605
+ iov_iter_save_state (iter , state );
3570
3606
}
3571
- io_size = iov_iter_count (iter );
3572
- req -> result = io_size ;
3607
+ req -> result = iov_iter_count (iter );
3608
+ ret2 = 0 ;
3573
3609
3574
3610
/* Ensure we clear previously set non-block flag */
3575
3611
if (!force_nonblock )
@@ -3586,7 +3622,7 @@ static int io_write(struct io_kiocb *req, unsigned int issue_flags)
3586
3622
(req -> flags & REQ_F_ISREG ))
3587
3623
goto copy_iov ;
3588
3624
3589
- ret = rw_verify_area (WRITE , req -> file , io_kiocb_ppos (kiocb ), io_size );
3625
+ ret = rw_verify_area (WRITE , req -> file , io_kiocb_ppos (kiocb ), req -> result );
3590
3626
if (unlikely (ret ))
3591
3627
goto out_free ;
3592
3628
@@ -3633,9 +3669,9 @@ static int io_write(struct io_kiocb *req, unsigned int issue_flags)
3633
3669
kiocb_done (kiocb , ret2 , issue_flags );
3634
3670
} else {
3635
3671
copy_iov :
3636
- /* some cases will consume bytes even on error returns */
3637
- iov_iter_reexpand ( iter , iter -> count + iter -> truncated );
3638
- iov_iter_revert (iter , io_size - iov_iter_count ( iter ) );
3672
+ iov_iter_restore ( iter , state );
3673
+ if ( ret2 > 0 )
3674
+ iov_iter_advance (iter , ret2 );
3639
3675
ret = io_setup_async_rw (req , iovec , inline_vecs , iter , false);
3640
3676
return ret ?: - EAGAIN ;
3641
3677
}
0 commit comments