@@ -1148,8 +1148,8 @@ static inline void __ublk_complete_rq(struct request *req)
1148
1148
blk_mq_end_request (req , res );
1149
1149
}
1150
1150
1151
- static void ublk_complete_io_cmd ( struct ublk_io * io , struct request * req ,
1152
- int res , unsigned issue_flags )
1151
+ static struct io_uring_cmd * __ublk_prep_compl_io_cmd ( struct ublk_io * io ,
1152
+ struct request * req )
1153
1153
{
1154
1154
/* read cmd first because req will overwrite it */
1155
1155
struct io_uring_cmd * cmd = io -> cmd ;
@@ -1164,6 +1164,13 @@ static void ublk_complete_io_cmd(struct ublk_io *io, struct request *req,
1164
1164
io -> flags &= ~UBLK_IO_FLAG_ACTIVE ;
1165
1165
1166
1166
io -> req = req ;
1167
+ return cmd ;
1168
+ }
1169
+
1170
+ static void ublk_complete_io_cmd (struct ublk_io * io , struct request * req ,
1171
+ int res , unsigned issue_flags )
1172
+ {
1173
+ struct io_uring_cmd * cmd = __ublk_prep_compl_io_cmd (io , req );
1167
1174
1168
1175
/* tell ublksrv one io request is coming */
1169
1176
io_uring_cmd_done (cmd , res , 0 , issue_flags );
@@ -2157,10 +2164,9 @@ static int ublk_commit_and_fetch(const struct ublk_queue *ubq,
2157
2164
return 0 ;
2158
2165
}
2159
2166
2160
- static bool ublk_get_data (const struct ublk_queue * ubq , struct ublk_io * io )
2167
+ static bool ublk_get_data (const struct ublk_queue * ubq , struct ublk_io * io ,
2168
+ struct request * req )
2161
2169
{
2162
- struct request * req = io -> req ;
2163
-
2164
2170
/*
2165
2171
* We have handled UBLK_IO_NEED_GET_DATA command,
2166
2172
* so clear UBLK_IO_FLAG_NEED_GET_DATA now and just
@@ -2187,6 +2193,7 @@ static int __ublk_ch_uring_cmd(struct io_uring_cmd *cmd,
2187
2193
u32 cmd_op = cmd -> cmd_op ;
2188
2194
unsigned tag = ub_cmd -> tag ;
2189
2195
int ret = - EINVAL ;
2196
+ struct request * req ;
2190
2197
2191
2198
pr_devel ("%s: received: cmd op %d queue %d tag %d result %d\n" ,
2192
2199
__func__ , cmd -> cmd_op , ub_cmd -> q_id , tag ,
@@ -2245,11 +2252,19 @@ static int __ublk_ch_uring_cmd(struct io_uring_cmd *cmd,
2245
2252
goto out ;
2246
2253
break ;
2247
2254
case UBLK_IO_NEED_GET_DATA :
2248
- io -> addr = ub_cmd -> addr ;
2249
- if (!ublk_get_data (ubq , io ))
2250
- return - EIOCBQUEUED ;
2251
-
2252
- return UBLK_IO_RES_OK ;
2255
+ /*
2256
+ * ublk_get_data() may fail and fallback to requeue, so keep
2257
+ * uring_cmd active first and prepare for handling new requeued
2258
+ * request
2259
+ */
2260
+ req = io -> req ;
2261
+ ublk_fill_io_cmd (io , cmd , ub_cmd -> addr );
2262
+ io -> flags &= ~UBLK_IO_FLAG_OWNED_BY_SRV ;
2263
+ if (likely (ublk_get_data (ubq , io , req ))) {
2264
+ __ublk_prep_compl_io_cmd (io , req );
2265
+ return UBLK_IO_RES_OK ;
2266
+ }
2267
+ break ;
2253
2268
default :
2254
2269
goto out ;
2255
2270
}
0 commit comments