loop.c (3eb0930a425b086bdab38156aa4708427479a201) | loop.c (5db470e229e22b7eda6e23b5566e532c96fb5bc3) |
---|---|
1/* 2 * linux/drivers/block/loop.c 3 * 4 * Written by Theodore Ts'o, 3/29/93 5 * 6 * Copyright 1993 by Theodore Ts'o. Redistribution of this file is 7 * permitted under the GNU General Public License. 8 * --- 1176 unchanged lines hidden (view full) --- 1185 err = -ENXIO; 1186 goto out_unlock; 1187 } 1188 if ((unsigned int) info->lo_encrypt_key_size > LO_KEY_SIZE) { 1189 err = -EINVAL; 1190 goto out_unlock; 1191 } 1192 | 1/* 2 * linux/drivers/block/loop.c 3 * 4 * Written by Theodore Ts'o, 3/29/93 5 * 6 * Copyright 1993 by Theodore Ts'o. Redistribution of this file is 7 * permitted under the GNU General Public License. 8 * --- 1176 unchanged lines hidden (view full) --- 1185 err = -ENXIO; 1186 goto out_unlock; 1187 } 1188 if ((unsigned int) info->lo_encrypt_key_size > LO_KEY_SIZE) { 1189 err = -EINVAL; 1190 goto out_unlock; 1191 } 1192 |
1193 if (lo->lo_offset != info->lo_offset || 1194 lo->lo_sizelimit != info->lo_sizelimit) { 1195 sync_blockdev(lo->lo_device); 1196 kill_bdev(lo->lo_device); 1197 } 1198 |
|
1193 /* I/O need to be drained during transfer transition */ 1194 blk_mq_freeze_queue(lo->lo_queue); 1195 1196 err = loop_release_xfer(lo); 1197 if (err) 1198 goto out_unfreeze; 1199 1200 if (info->lo_encrypt_type) { --- 12 unchanged lines hidden (view full) --- 1213 xfer = NULL; 1214 1215 err = loop_init_xfer(lo, xfer, info); 1216 if (err) 1217 goto out_unfreeze; 1218 1219 if (lo->lo_offset != info->lo_offset || 1220 lo->lo_sizelimit != info->lo_sizelimit) { | 1199 /* I/O need to be drained during transfer transition */ 1200 blk_mq_freeze_queue(lo->lo_queue); 1201 1202 err = loop_release_xfer(lo); 1203 if (err) 1204 goto out_unfreeze; 1205 1206 if (info->lo_encrypt_type) { --- 12 unchanged lines hidden (view full) --- 1219 xfer = NULL; 1220 1221 err = loop_init_xfer(lo, xfer, info); 1222 if (err) 1223 goto out_unfreeze; 1224 1225 if (lo->lo_offset != info->lo_offset || 1226 lo->lo_sizelimit != info->lo_sizelimit) { |
1227 /* kill_bdev should have truncated all the pages */ 1228 if (lo->lo_device->bd_inode->i_mapping->nrpages) { 1229 err = -EAGAIN; 1230 pr_warn("%s: loop%d (%s) has still dirty pages (nrpages=%lu)\n", 1231 __func__, lo->lo_number, lo->lo_file_name, 1232 lo->lo_device->bd_inode->i_mapping->nrpages); 1233 goto out_unfreeze; 1234 } |
|
1221 if (figure_loop_size(lo, info->lo_offset, info->lo_sizelimit)) { 1222 err = -EFBIG; 1223 goto out_unfreeze; 1224 } 1225 } 1226 1227 loop_config_discard(lo); 1228 --- 209 unchanged lines hidden (view full) --- 1438 return 0; 1439 error = -EINVAL; 1440 out: 1441 return error; 1442} 1443 1444static int loop_set_block_size(struct loop_device *lo, unsigned long arg) 1445{ | 1235 if (figure_loop_size(lo, info->lo_offset, info->lo_sizelimit)) { 1236 err = -EFBIG; 1237 goto out_unfreeze; 1238 } 1239 } 1240 1241 loop_config_discard(lo); 1242 --- 209 unchanged lines hidden (view full) --- 1452 return 0; 1453 error = -EINVAL; 1454 out: 1455 return error; 1456} 1457 1458static int loop_set_block_size(struct loop_device *lo, unsigned long arg) 1459{ |
1460 int err = 0; 1461 |
|
1446 if (lo->lo_state != Lo_bound) 1447 return -ENXIO; 1448 1449 if (arg < 512 || arg > PAGE_SIZE || !is_power_of_2(arg)) 1450 return -EINVAL; 1451 | 1462 if (lo->lo_state != Lo_bound) 1463 return -ENXIO; 1464 1465 if (arg < 512 || arg > PAGE_SIZE || !is_power_of_2(arg)) 1466 return -EINVAL; 1467 |
1468 if (lo->lo_queue->limits.logical_block_size != arg) { 1469 sync_blockdev(lo->lo_device); 1470 kill_bdev(lo->lo_device); 1471 } 1472 |
|
1452 blk_mq_freeze_queue(lo->lo_queue); 1453 | 1473 blk_mq_freeze_queue(lo->lo_queue); 1474 |
1475 /* kill_bdev should have truncated all the pages */ 1476 if (lo->lo_queue->limits.logical_block_size != arg && 1477 lo->lo_device->bd_inode->i_mapping->nrpages) { 1478 err = -EAGAIN; 1479 pr_warn("%s: loop%d (%s) has still dirty pages (nrpages=%lu)\n", 1480 __func__, lo->lo_number, lo->lo_file_name, 1481 lo->lo_device->bd_inode->i_mapping->nrpages); 1482 goto out_unfreeze; 1483 } 1484 |
|
1454 blk_queue_logical_block_size(lo->lo_queue, arg); 1455 blk_queue_physical_block_size(lo->lo_queue, arg); 1456 blk_queue_io_min(lo->lo_queue, arg); 1457 loop_update_dio(lo); | 1485 blk_queue_logical_block_size(lo->lo_queue, arg); 1486 blk_queue_physical_block_size(lo->lo_queue, arg); 1487 blk_queue_io_min(lo->lo_queue, arg); 1488 loop_update_dio(lo); |
1458 | 1489out_unfreeze: |
1459 blk_mq_unfreeze_queue(lo->lo_queue); 1460 | 1490 blk_mq_unfreeze_queue(lo->lo_queue); 1491 |
1461 return 0; | 1492 return err; |
1462} 1463 1464static int lo_simple_ioctl(struct loop_device *lo, unsigned int cmd, 1465 unsigned long arg) 1466{ 1467 int err; 1468 1469 err = mutex_lock_killable(&loop_ctl_mutex); --- 756 unchanged lines hidden --- | 1493} 1494 1495static int lo_simple_ioctl(struct loop_device *lo, unsigned int cmd, 1496 unsigned long arg) 1497{ 1498 int err; 1499 1500 err = mutex_lock_killable(&loop_ctl_mutex); --- 756 unchanged lines hidden --- |