@@ -3455,9 +3455,6 @@ static void __user *io_buffer_select(struct io_kiocb *req, size_t *len,
3455
3455
struct io_ring_ctx * ctx = req -> ctx ;
3456
3456
struct io_buffer_list * bl ;
3457
3457
3458
- if (req -> flags & REQ_F_BUFFER_SELECTED )
3459
- return u64_to_user_ptr (kbuf -> addr );
3460
-
3461
3458
io_ring_submit_lock (req -> ctx , issue_flags );
3462
3459
3463
3460
bl = io_buffer_get_list (ctx , req -> buf_index );
@@ -3497,8 +3494,9 @@ static ssize_t io_compat_import(struct io_kiocb *req, struct iovec *iov,
3497
3494
buf = io_buffer_select (req , & len , issue_flags );
3498
3495
if (IS_ERR (buf ))
3499
3496
return PTR_ERR (buf );
3497
+ req -> rw .addr = (unsigned long ) buf ;
3500
3498
iov [0 ].iov_base = buf ;
3501
- iov [0 ].iov_len = (compat_size_t ) len ;
3499
+ req -> rw . len = iov [0 ].iov_len = (compat_size_t ) len ;
3502
3500
return 0 ;
3503
3501
}
3504
3502
#endif
@@ -3519,19 +3517,18 @@ static ssize_t __io_iov_buffer_select(struct io_kiocb *req, struct iovec *iov,
3519
3517
buf = io_buffer_select (req , & len , issue_flags );
3520
3518
if (IS_ERR (buf ))
3521
3519
return PTR_ERR (buf );
3520
+ req -> rw .addr = (unsigned long ) buf ;
3522
3521
iov [0 ].iov_base = buf ;
3523
- iov [0 ].iov_len = len ;
3522
+ req -> rw . len = iov [0 ].iov_len = len ;
3524
3523
return 0 ;
3525
3524
}
3526
3525
3527
3526
static ssize_t io_iov_buffer_select (struct io_kiocb * req , struct iovec * iov ,
3528
3527
unsigned int issue_flags )
3529
3528
{
3530
3529
if (req -> flags & REQ_F_BUFFER_SELECTED ) {
3531
- struct io_buffer * kbuf = req -> kbuf ;
3532
-
3533
- iov [0 ].iov_base = u64_to_user_ptr (kbuf -> addr );
3534
- iov [0 ].iov_len = kbuf -> len ;
3530
+ iov [0 ].iov_base = u64_to_user_ptr (req -> rw .addr );
3531
+ iov [0 ].iov_len = req -> rw .len ;
3535
3532
return 0 ;
3536
3533
}
3537
3534
if (req -> rw .len != 1 )
@@ -3545,6 +3542,13 @@ static ssize_t io_iov_buffer_select(struct io_kiocb *req, struct iovec *iov,
3545
3542
return __io_iov_buffer_select (req , iov , issue_flags );
3546
3543
}
3547
3544
3545
+ static inline bool io_do_buffer_select (struct io_kiocb * req )
3546
+ {
3547
+ if (!(req -> flags & REQ_F_BUFFER_SELECT ))
3548
+ return false;
3549
+ return !(req -> flags & REQ_F_BUFFER_SELECTED );
3550
+ }
3551
+
3548
3552
static struct iovec * __io_import_iovec (int rw , struct io_kiocb * req ,
3549
3553
struct io_rw_state * s ,
3550
3554
unsigned int issue_flags )
@@ -3567,10 +3571,11 @@ static struct iovec *__io_import_iovec(int rw, struct io_kiocb *req,
3567
3571
sqe_len = req -> rw .len ;
3568
3572
3569
3573
if (opcode == IORING_OP_READ || opcode == IORING_OP_WRITE ) {
3570
- if (req -> flags & REQ_F_BUFFER_SELECT ) {
3574
+ if (io_do_buffer_select ( req ) ) {
3571
3575
buf = io_buffer_select (req , & sqe_len , issue_flags );
3572
3576
if (IS_ERR (buf ))
3573
3577
return ERR_CAST (buf );
3578
+ req -> rw .addr = (unsigned long ) buf ;
3574
3579
req -> rw .len = sqe_len ;
3575
3580
}
3576
3581
@@ -5555,7 +5560,7 @@ static int io_recvmsg(struct io_kiocb *req, unsigned int issue_flags)
5555
5560
(sr -> flags & IORING_RECVSEND_POLL_FIRST ))
5556
5561
return io_setup_async_msg (req , kmsg );
5557
5562
5558
- if (req -> flags & REQ_F_BUFFER_SELECT ) {
5563
+ if (io_do_buffer_select ( req ) ) {
5559
5564
void __user * buf ;
5560
5565
5561
5566
buf = io_buffer_select (req , & sr -> len , issue_flags );
@@ -5619,7 +5624,7 @@ static int io_recv(struct io_kiocb *req, unsigned int issue_flags)
5619
5624
if (unlikely (!sock ))
5620
5625
return - ENOTSOCK ;
5621
5626
5622
- if (req -> flags & REQ_F_BUFFER_SELECT ) {
5627
+ if (io_do_buffer_select ( req ) ) {
5623
5628
void __user * buf ;
5624
5629
5625
5630
buf = io_buffer_select (req , & sr -> len , issue_flags );
0 commit comments