File tree Expand file tree Collapse file tree 1 file changed +12
-5
lines changed Expand file tree Collapse file tree 1 file changed +12
-5
lines changed Original file line number Diff line number Diff line change @@ -1163,9 +1163,12 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info)
1163
1163
if ((unsigned int ) info -> lo_encrypt_key_size > LO_KEY_SIZE )
1164
1164
return - EINVAL ;
1165
1165
1166
+ /* I/O need to be drained during transfer transition */
1167
+ blk_mq_freeze_queue (lo -> lo_queue );
1168
+
1166
1169
err = loop_release_xfer (lo );
1167
1170
if (err )
1168
- return err ;
1171
+ goto exit ;
1169
1172
1170
1173
if (info -> lo_encrypt_type ) {
1171
1174
unsigned int type = info -> lo_encrypt_type ;
@@ -1180,12 +1183,14 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info)
1180
1183
1181
1184
err = loop_init_xfer (lo , xfer , info );
1182
1185
if (err )
1183
- return err ;
1186
+ goto exit ;
1184
1187
1185
1188
if (lo -> lo_offset != info -> lo_offset ||
1186
1189
lo -> lo_sizelimit != info -> lo_sizelimit )
1187
- if (figure_loop_size (lo , info -> lo_offset , info -> lo_sizelimit ))
1188
- return - EFBIG ;
1190
+ if (figure_loop_size (lo , info -> lo_offset , info -> lo_sizelimit )) {
1191
+ err = - EFBIG ;
1192
+ goto exit ;
1193
+ }
1189
1194
1190
1195
loop_config_discard (lo );
1191
1196
@@ -1222,7 +1227,9 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info)
1222
1227
/* update dio if lo_offset or transfer is changed */
1223
1228
__loop_update_dio (lo , lo -> use_dio );
1224
1229
1225
- return 0 ;
1230
+ exit :
1231
+ blk_mq_unfreeze_queue (lo -> lo_queue );
1232
+ return err ;
1226
1233
}
1227
1234
1228
1235
static int
You can’t perform that action at this time.
0 commit comments