@@ -4098,7 +4098,7 @@ static int io_recvmsg_copy_hdr(struct io_kiocb *req,
4098
4098
}
4099
4099
4100
4100
static struct io_buffer * io_recv_buffer_select (struct io_kiocb * req ,
4101
- int * cflags , bool needs_lock )
4101
+ bool needs_lock )
4102
4102
{
4103
4103
struct io_sr_msg * sr = & req -> sr_msg ;
4104
4104
struct io_buffer * kbuf ;
@@ -4109,12 +4109,14 @@ static struct io_buffer *io_recv_buffer_select(struct io_kiocb *req,
4109
4109
4110
4110
sr -> kbuf = kbuf ;
4111
4111
req -> flags |= REQ_F_BUFFER_SELECTED ;
4112
-
4113
- * cflags = kbuf -> bid << IORING_CQE_BUFFER_SHIFT ;
4114
- * cflags |= IORING_CQE_F_BUFFER ;
4115
4112
return kbuf ;
4116
4113
}
4117
4114
4115
+ static inline unsigned int io_put_recv_kbuf (struct io_kiocb * req )
4116
+ {
4117
+ return io_put_kbuf (req , req -> sr_msg .kbuf );
4118
+ }
4119
+
4118
4120
static int io_recvmsg_prep (struct io_kiocb * req ,
4119
4121
const struct io_uring_sqe * sqe )
4120
4122
{
@@ -4152,7 +4154,7 @@ static int io_recvmsg(struct io_kiocb *req, bool force_nonblock,
4152
4154
{
4153
4155
struct io_async_msghdr iomsg , * kmsg ;
4154
4156
struct socket * sock ;
4155
- struct io_buffer * kbuf = NULL ;
4157
+ struct io_buffer * kbuf ;
4156
4158
unsigned flags ;
4157
4159
int ret , cflags = 0 ;
4158
4160
@@ -4175,7 +4177,7 @@ static int io_recvmsg(struct io_kiocb *req, bool force_nonblock,
4175
4177
}
4176
4178
4177
4179
if (req -> flags & REQ_F_BUFFER_SELECT ) {
4178
- kbuf = io_recv_buffer_select (req , & cflags , !force_nonblock );
4180
+ kbuf = io_recv_buffer_select (req , !force_nonblock );
4179
4181
if (IS_ERR (kbuf ))
4180
4182
return PTR_ERR (kbuf );
4181
4183
kmsg -> fast_iov [0 ].iov_base = u64_to_user_ptr (kbuf -> addr );
@@ -4196,12 +4198,11 @@ static int io_recvmsg(struct io_kiocb *req, bool force_nonblock,
4196
4198
if (ret == - ERESTARTSYS )
4197
4199
ret = - EINTR ;
4198
4200
4199
- if (kbuf )
4200
- kfree ( kbuf );
4201
+ if (req -> flags & REQ_F_BUFFER_SELECTED )
4202
+ cflags = io_put_recv_kbuf ( req );
4201
4203
if (kmsg -> iov != kmsg -> fast_iov )
4202
4204
kfree (kmsg -> iov );
4203
- req -> flags &= ~(REQ_F_NEED_CLEANUP | REQ_F_BUFFER_SELECTED );
4204
-
4205
+ req -> flags &= ~REQ_F_NEED_CLEANUP ;
4205
4206
if (ret < 0 )
4206
4207
req_set_fail_links (req );
4207
4208
__io_req_complete (req , ret , cflags , cs );
@@ -4225,7 +4226,7 @@ static int io_recv(struct io_kiocb *req, bool force_nonblock,
4225
4226
return ret ;
4226
4227
4227
4228
if (req -> flags & REQ_F_BUFFER_SELECT ) {
4228
- kbuf = io_recv_buffer_select (req , & cflags , !force_nonblock );
4229
+ kbuf = io_recv_buffer_select (req , !force_nonblock );
4229
4230
if (IS_ERR (kbuf ))
4230
4231
return PTR_ERR (kbuf );
4231
4232
buf = u64_to_user_ptr (kbuf -> addr );
@@ -4254,9 +4255,8 @@ static int io_recv(struct io_kiocb *req, bool force_nonblock,
4254
4255
if (ret == - ERESTARTSYS )
4255
4256
ret = - EINTR ;
4256
4257
out_free :
4257
- if (kbuf )
4258
- kfree (kbuf );
4259
- req -> flags &= ~REQ_F_NEED_CLEANUP ;
4258
+ if (req -> flags & REQ_F_BUFFER_SELECTED )
4259
+ cflags = io_put_recv_kbuf (req );
4260
4260
if (ret < 0 )
4261
4261
req_set_fail_links (req );
4262
4262
__io_req_complete (req , ret , cflags , cs );
0 commit comments