File tree 1 file changed +12
-5
lines changed
1 file changed +12
-5
lines changed Original file line number Diff line number Diff line change @@ -1097,9 +1097,12 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info)
1097
1097
if ((unsigned int ) info -> lo_encrypt_key_size > LO_KEY_SIZE )
1098
1098
return - EINVAL ;
1099
1099
1100
+ /* I/O need to be drained during transfer transition */
1101
+ blk_mq_freeze_queue (lo -> lo_queue );
1102
+
1100
1103
err = loop_release_xfer (lo );
1101
1104
if (err )
1102
- return err ;
1105
+ goto exit ;
1103
1106
1104
1107
if (info -> lo_encrypt_type ) {
1105
1108
unsigned int type = info -> lo_encrypt_type ;
@@ -1114,12 +1117,14 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info)
1114
1117
1115
1118
err = loop_init_xfer (lo , xfer , info );
1116
1119
if (err )
1117
- return err ;
1120
+ goto exit ;
1118
1121
1119
1122
if (lo -> lo_offset != info -> lo_offset ||
1120
1123
lo -> lo_sizelimit != info -> lo_sizelimit )
1121
- if (figure_loop_size (lo , info -> lo_offset , info -> lo_sizelimit ))
1122
- return - EFBIG ;
1124
+ if (figure_loop_size (lo , info -> lo_offset , info -> lo_sizelimit )) {
1125
+ err = - EFBIG ;
1126
+ goto exit ;
1127
+ }
1123
1128
1124
1129
loop_config_discard (lo );
1125
1130
@@ -1156,7 +1161,9 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info)
1156
1161
/* update dio if lo_offset or transfer is changed */
1157
1162
__loop_update_dio (lo , lo -> use_dio );
1158
1163
1159
- return 0 ;
1164
+ exit :
1165
+ blk_mq_unfreeze_queue (lo -> lo_queue );
1166
+ return err ;
1160
1167
}
1161
1168
1162
1169
static int
You can’t perform that action at this time.
0 commit comments