@@ -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
};
@@ -2608,8 +2609,7 @@ static bool io_resubmit_prep(struct io_kiocb *req)
2608
2609
2609
2610
if (!rw )
2610
2611
return !io_req_prep_async (req );
2611
- /* may have left rw->iter inconsistent on -EIOCBQUEUED */
2612
- iov_iter_revert (& rw -> iter , req -> result - iov_iter_count (& rw -> iter ));
2612
+ iov_iter_restore (& rw -> iter , & rw -> iter_state );
2613
2613
return true;
2614
2614
}
2615
2615
@@ -3310,12 +3310,17 @@ static int io_setup_async_rw(struct io_kiocb *req, const struct iovec *iovec,
3310
3310
if (!force && !io_op_defs [req -> opcode ].needs_async_setup )
3311
3311
return 0 ;
3312
3312
if (!req -> async_data ) {
3313
+ struct io_async_rw * iorw ;
3314
+
3313
3315
if (io_alloc_async_data (req )) {
3314
3316
kfree (iovec );
3315
3317
return - ENOMEM ;
3316
3318
}
3317
3319
3318
3320
io_req_map_rw (req , iovec , fast_iov , iter );
3321
+ iorw = req -> async_data ;
3322
+ /* we've copied and mapped the iter, ensure state is saved */
3323
+ iov_iter_save_state (& iorw -> iter , & iorw -> iter_state );
3319
3324
}
3320
3325
return 0 ;
3321
3326
}
@@ -3334,6 +3339,7 @@ static inline int io_rw_prep_async(struct io_kiocb *req, int rw)
3334
3339
iorw -> free_iovec = iov ;
3335
3340
if (iov )
3336
3341
req -> flags |= REQ_F_NEED_CLEANUP ;
3342
+ iov_iter_save_state (& iorw -> iter , & iorw -> iter_state );
3337
3343
return 0 ;
3338
3344
}
3339
3345
@@ -3437,19 +3443,28 @@ static int io_read(struct io_kiocb *req, unsigned int issue_flags)
3437
3443
struct kiocb * kiocb = & req -> rw .kiocb ;
3438
3444
struct iov_iter __iter , * iter = & __iter ;
3439
3445
struct io_async_rw * rw = req -> async_data ;
3440
- ssize_t io_size , ret , ret2 ;
3441
3446
bool force_nonblock = issue_flags & IO_URING_F_NONBLOCK ;
3447
+ struct iov_iter_state __state , * state ;
3448
+ ssize_t ret , ret2 ;
3442
3449
3443
3450
if (rw ) {
3444
3451
iter = & rw -> iter ;
3452
+ state = & rw -> iter_state ;
3453
+ /*
3454
+ * We come here from an earlier attempt, restore our state to
3455
+ * match in case it doesn't. It's cheap enough that we don't
3456
+ * need to make this conditional.
3457
+ */
3458
+ iov_iter_restore (iter , state );
3445
3459
iovec = NULL ;
3446
3460
} else {
3447
3461
ret = io_import_iovec (READ , req , & iovec , iter , !force_nonblock );
3448
3462
if (ret < 0 )
3449
3463
return ret ;
3464
+ state = & __state ;
3465
+ iov_iter_save_state (iter , state );
3450
3466
}
3451
- io_size = iov_iter_count (iter );
3452
- req -> result = io_size ;
3467
+ req -> result = iov_iter_count (iter );
3453
3468
3454
3469
/* Ensure we clear previously set non-block flag */
3455
3470
if (!force_nonblock )
@@ -3463,7 +3478,7 @@ static int io_read(struct io_kiocb *req, unsigned int issue_flags)
3463
3478
return ret ?: - EAGAIN ;
3464
3479
}
3465
3480
3466
- ret = rw_verify_area (READ , req -> file , io_kiocb_ppos (kiocb ), io_size );
3481
+ ret = rw_verify_area (READ , req -> file , io_kiocb_ppos (kiocb ), req -> result );
3467
3482
if (unlikely (ret )) {
3468
3483
kfree (iovec );
3469
3484
return ret ;
@@ -3479,30 +3494,49 @@ static int io_read(struct io_kiocb *req, unsigned int issue_flags)
3479
3494
/* no retry on NONBLOCK nor RWF_NOWAIT */
3480
3495
if (req -> flags & REQ_F_NOWAIT )
3481
3496
goto done ;
3482
- /* some cases will consume bytes even on error returns */
3483
- iov_iter_reexpand (iter , iter -> count + iter -> truncated );
3484
- iov_iter_revert (iter , io_size - iov_iter_count (iter ));
3485
3497
ret = 0 ;
3486
3498
} else if (ret == - EIOCBQUEUED ) {
3487
3499
goto out_free ;
3488
- } else if (ret <= 0 || ret == io_size || !force_nonblock ||
3500
+ } else if (ret <= 0 || ret == req -> result || !force_nonblock ||
3489
3501
(req -> flags & REQ_F_NOWAIT ) || !need_read_all (req )) {
3490
3502
/* read all, failed, already did sync or don't want to retry */
3491
3503
goto done ;
3492
3504
}
3493
3505
3506
+ /*
3507
+ * Don't depend on the iter state matching what was consumed, or being
3508
+ * untouched in case of error. Restore it and we'll advance it
3509
+ * manually if we need to.
3510
+ */
3511
+ iov_iter_restore (iter , state );
3512
+
3494
3513
ret2 = io_setup_async_rw (req , iovec , inline_vecs , iter , true);
3495
3514
if (ret2 )
3496
3515
return ret2 ;
3497
3516
3498
3517
iovec = NULL ;
3499
3518
rw = req -> async_data ;
3500
- /* now use our persistent iterator, if we aren't already */
3501
- iter = & rw -> iter ;
3519
+ /*
3520
+ * Now use our persistent iterator and state, if we aren't already.
3521
+ * We've restored and mapped the iter to match.
3522
+ */
3523
+ if (iter != & rw -> iter ) {
3524
+ iter = & rw -> iter ;
3525
+ state = & rw -> iter_state ;
3526
+ }
3502
3527
3503
3528
do {
3504
- io_size -= ret ;
3529
+ /*
3530
+ * We end up here because of a partial read, either from
3531
+ * above or inside this loop. Advance the iter by the bytes
3532
+ * that were consumed.
3533
+ */
3534
+ iov_iter_advance (iter , ret );
3535
+ if (!iov_iter_count (iter ))
3536
+ break ;
3505
3537
rw -> bytes_done += ret ;
3538
+ iov_iter_save_state (iter , state );
3539
+
3506
3540
/* if we can retry, do so with the callbacks armed */
3507
3541
if (!io_rw_should_retry (req )) {
3508
3542
kiocb -> ki_flags &= ~IOCB_WAITQ ;
@@ -3520,7 +3554,8 @@ static int io_read(struct io_kiocb *req, unsigned int issue_flags)
3520
3554
return 0 ;
3521
3555
/* we got some bytes, but not all. retry. */
3522
3556
kiocb -> ki_flags &= ~IOCB_WAITQ ;
3523
- } while (ret > 0 && ret < io_size );
3557
+ iov_iter_restore (iter , state );
3558
+ } while (ret > 0 );
3524
3559
done :
3525
3560
kiocb_done (kiocb , ret , issue_flags );
3526
3561
out_free :
@@ -3543,19 +3578,24 @@ static int io_write(struct io_kiocb *req, unsigned int issue_flags)
3543
3578
struct kiocb * kiocb = & req -> rw .kiocb ;
3544
3579
struct iov_iter __iter , * iter = & __iter ;
3545
3580
struct io_async_rw * rw = req -> async_data ;
3546
- ssize_t ret , ret2 , io_size ;
3547
3581
bool force_nonblock = issue_flags & IO_URING_F_NONBLOCK ;
3582
+ struct iov_iter_state __state , * state ;
3583
+ ssize_t ret , ret2 ;
3548
3584
3549
3585
if (rw ) {
3550
3586
iter = & rw -> iter ;
3587
+ state = & rw -> iter_state ;
3588
+ iov_iter_restore (iter , state );
3551
3589
iovec = NULL ;
3552
3590
} else {
3553
3591
ret = io_import_iovec (WRITE , req , & iovec , iter , !force_nonblock );
3554
3592
if (ret < 0 )
3555
3593
return ret ;
3594
+ state = & __state ;
3595
+ iov_iter_save_state (iter , state );
3556
3596
}
3557
- io_size = iov_iter_count (iter );
3558
- req -> result = io_size ;
3597
+ req -> result = iov_iter_count (iter );
3598
+ ret2 = 0 ;
3559
3599
3560
3600
/* Ensure we clear previously set non-block flag */
3561
3601
if (!force_nonblock )
@@ -3572,7 +3612,7 @@ static int io_write(struct io_kiocb *req, unsigned int issue_flags)
3572
3612
(req -> flags & REQ_F_ISREG ))
3573
3613
goto copy_iov ;
3574
3614
3575
- ret = rw_verify_area (WRITE , req -> file , io_kiocb_ppos (kiocb ), io_size );
3615
+ ret = rw_verify_area (WRITE , req -> file , io_kiocb_ppos (kiocb ), req -> result );
3576
3616
if (unlikely (ret ))
3577
3617
goto out_free ;
3578
3618
@@ -3619,9 +3659,9 @@ static int io_write(struct io_kiocb *req, unsigned int issue_flags)
3619
3659
kiocb_done (kiocb , ret2 , issue_flags );
3620
3660
} else {
3621
3661
copy_iov :
3622
- /* some cases will consume bytes even on error returns */
3623
- iov_iter_reexpand ( iter , iter -> count + iter -> truncated );
3624
- iov_iter_revert (iter , io_size - iov_iter_count ( iter ) );
3662
+ iov_iter_restore ( iter , state );
3663
+ if ( ret2 > 0 )
3664
+ iov_iter_advance (iter , ret2 );
3625
3665
ret = io_setup_async_rw (req , iovec , inline_vecs , iter , false);
3626
3666
return ret ?: - EAGAIN ;
3627
3667
}
0 commit comments