@@ -345,6 +345,12 @@ struct io_connect {
345
345
int addr_len ;
346
346
};
347
347
348
+ struct io_sr_msg {
349
+ struct file * file ;
350
+ struct user_msghdr __user * msg ;
351
+ int msg_flags ;
352
+ };
353
+
348
354
struct io_async_connect {
349
355
struct sockaddr_storage address ;
350
356
};
@@ -389,6 +395,7 @@ struct io_kiocb {
389
395
struct io_cancel cancel ;
390
396
struct io_timeout timeout ;
391
397
struct io_connect connect ;
398
+ struct io_sr_msg sr_msg ;
392
399
};
393
400
394
401
const struct io_uring_sqe * sqe ;
@@ -2164,23 +2171,22 @@ static int io_sendmsg_prep(struct io_kiocb *req, struct io_async_ctx *io)
2164
2171
{
2165
2172
#if defined(CONFIG_NET )
2166
2173
const struct io_uring_sqe * sqe = req -> sqe ;
2167
- struct user_msghdr __user * msg ;
2168
- unsigned flags ;
2174
+ struct io_sr_msg * sr = & req -> sr_msg ;
2169
2175
2170
- flags = READ_ONCE (sqe -> msg_flags );
2171
- msg = u64_to_user_ptr (READ_ONCE (sqe -> addr ));
2176
+ sr -> msg_flags = READ_ONCE (sqe -> msg_flags );
2177
+ sr -> msg = u64_to_user_ptr (READ_ONCE (sqe -> addr ));
2172
2178
io -> msg .iov = io -> msg .fast_iov ;
2173
- return sendmsg_copy_msghdr (& io -> msg .msg , msg , flags , & io -> msg .iov );
2179
+ return sendmsg_copy_msghdr (& io -> msg .msg , sr -> msg , sr -> msg_flags ,
2180
+ & io -> msg .iov );
2174
2181
#else
2175
- return 0 ;
2182
+ return - EOPNOTSUPP ;
2176
2183
#endif
2177
2184
}
2178
2185
2179
2186
static int io_sendmsg (struct io_kiocb * req , struct io_kiocb * * nxt ,
2180
2187
bool force_nonblock )
2181
2188
{
2182
2189
#if defined(CONFIG_NET )
2183
- const struct io_uring_sqe * sqe = req -> sqe ;
2184
2190
struct io_async_msghdr * kmsg = NULL ;
2185
2191
struct socket * sock ;
2186
2192
int ret ;
@@ -2194,12 +2200,6 @@ static int io_sendmsg(struct io_kiocb *req, struct io_kiocb **nxt,
2194
2200
struct sockaddr_storage addr ;
2195
2201
unsigned flags ;
2196
2202
2197
- flags = READ_ONCE (sqe -> msg_flags );
2198
- if (flags & MSG_DONTWAIT )
2199
- req -> flags |= REQ_F_NOWAIT ;
2200
- else if (force_nonblock )
2201
- flags |= MSG_DONTWAIT ;
2202
-
2203
2203
if (req -> io ) {
2204
2204
kmsg = & req -> io -> msg ;
2205
2205
kmsg -> msg .msg_name = & addr ;
@@ -2215,6 +2215,12 @@ static int io_sendmsg(struct io_kiocb *req, struct io_kiocb **nxt,
2215
2215
goto out ;
2216
2216
}
2217
2217
2218
+ flags = req -> sr_msg .msg_flags ;
2219
+ if (flags & MSG_DONTWAIT )
2220
+ req -> flags |= REQ_F_NOWAIT ;
2221
+ else if (force_nonblock )
2222
+ flags |= MSG_DONTWAIT ;
2223
+
2218
2224
ret = __sys_sendmsg_sock (sock , & kmsg -> msg , flags );
2219
2225
if (force_nonblock && ret == - EAGAIN ) {
2220
2226
if (req -> io )
@@ -2245,25 +2251,22 @@ static int io_sendmsg(struct io_kiocb *req, struct io_kiocb **nxt,
2245
2251
static int io_recvmsg_prep (struct io_kiocb * req , struct io_async_ctx * io )
2246
2252
{
2247
2253
#if defined(CONFIG_NET )
2248
- const struct io_uring_sqe * sqe = req -> sqe ;
2249
- struct user_msghdr __user * msg ;
2250
- unsigned flags ;
2254
+ struct io_sr_msg * sr = & req -> sr_msg ;
2251
2255
2252
- flags = READ_ONCE (sqe -> msg_flags );
2253
- msg = u64_to_user_ptr (READ_ONCE (sqe -> addr ));
2256
+ sr -> msg_flags = READ_ONCE (req -> sqe -> msg_flags );
2257
+ sr -> msg = u64_to_user_ptr (READ_ONCE (req -> sqe -> addr ));
2254
2258
io -> msg .iov = io -> msg .fast_iov ;
2255
- return recvmsg_copy_msghdr (& io -> msg .msg , msg , flags , & io -> msg . uaddr ,
2256
- & io -> msg .iov );
2259
+ return recvmsg_copy_msghdr (& io -> msg .msg , sr -> msg , sr -> msg_flags ,
2260
+ & io -> msg .uaddr , & io -> msg . iov );
2257
2261
#else
2258
- return 0 ;
2262
+ return - EOPNOTSUPP ;
2259
2263
#endif
2260
2264
}
2261
2265
2262
2266
static int io_recvmsg (struct io_kiocb * req , struct io_kiocb * * nxt ,
2263
2267
bool force_nonblock )
2264
2268
{
2265
2269
#if defined(CONFIG_NET )
2266
- const struct io_uring_sqe * sqe = req -> sqe ;
2267
2270
struct io_async_msghdr * kmsg = NULL ;
2268
2271
struct socket * sock ;
2269
2272
int ret ;
@@ -2273,18 +2276,10 @@ static int io_recvmsg(struct io_kiocb *req, struct io_kiocb **nxt,
2273
2276
2274
2277
sock = sock_from_file (req -> file , & ret );
2275
2278
if (sock ) {
2276
- struct user_msghdr __user * msg ;
2277
2279
struct io_async_ctx io ;
2278
2280
struct sockaddr_storage addr ;
2279
2281
unsigned flags ;
2280
2282
2281
- flags = READ_ONCE (sqe -> msg_flags );
2282
- if (flags & MSG_DONTWAIT )
2283
- req -> flags |= REQ_F_NOWAIT ;
2284
- else if (force_nonblock )
2285
- flags |= MSG_DONTWAIT ;
2286
-
2287
- msg = u64_to_user_ptr (READ_ONCE (sqe -> addr ));
2288
2283
if (req -> io ) {
2289
2284
kmsg = & req -> io -> msg ;
2290
2285
kmsg -> msg .msg_name = & addr ;
@@ -2300,7 +2295,14 @@ static int io_recvmsg(struct io_kiocb *req, struct io_kiocb **nxt,
2300
2295
goto out ;
2301
2296
}
2302
2297
2303
- ret = __sys_recvmsg_sock (sock , & kmsg -> msg , msg , kmsg -> uaddr , flags );
2298
+ flags = req -> sr_msg .msg_flags ;
2299
+ if (flags & MSG_DONTWAIT )
2300
+ req -> flags |= REQ_F_NOWAIT ;
2301
+ else if (force_nonblock )
2302
+ flags |= MSG_DONTWAIT ;
2303
+
2304
+ ret = __sys_recvmsg_sock (sock , & kmsg -> msg , req -> sr_msg .msg ,
2305
+ kmsg -> uaddr , flags );
2304
2306
if (force_nonblock && ret == - EAGAIN ) {
2305
2307
if (req -> io )
2306
2308
return - EAGAIN ;
0 commit comments