.. | .. |
---|
599 | 599 | struct bow_context *bc = (struct bow_context *) ti->private; |
---|
600 | 600 | struct kobject *kobj; |
---|
601 | 601 | |
---|
| 602 | + mutex_lock(&bc->ranges_lock); |
---|
602 | 603 | while (rb_first(&bc->ranges)) { |
---|
603 | 604 | struct bow_range *br = container_of(rb_first(&bc->ranges), |
---|
604 | 605 | struct bow_range, node); |
---|
.. | .. |
---|
606 | 607 | rb_erase(&br->node, &bc->ranges); |
---|
607 | 608 | kfree(br); |
---|
608 | 609 | } |
---|
| 610 | + mutex_unlock(&bc->ranges_lock); |
---|
| 611 | + |
---|
609 | 612 | if (bc->workqueue) |
---|
610 | 613 | destroy_workqueue(bc->workqueue); |
---|
611 | 614 | if (bc->bufio) |
---|
.. | .. |
---|
627 | 630 | const unsigned int block_size = bc->block_size; |
---|
628 | 631 | |
---|
629 | 632 | limits->logical_block_size = |
---|
630 | | - max_t(unsigned short, limits->logical_block_size, block_size); |
---|
| 633 | + max_t(unsigned int, limits->logical_block_size, block_size); |
---|
631 | 634 | limits->physical_block_size = |
---|
632 | 635 | max_t(unsigned int, limits->physical_block_size, block_size); |
---|
633 | 636 | limits->io_min = max_t(unsigned int, limits->io_min, block_size); |
---|
.. | .. |
---|
643 | 646 | } |
---|
644 | 647 | } |
---|
645 | 648 | |
---|
646 | | -static int dm_bow_ctr_optional(struct dm_target *ti, unsigned int argc, |
---|
647 | | - char **argv) |
---|
| 649 | +static int dm_bow_ctr_optional(struct dm_target *ti, unsigned int argc, char **argv) |
---|
648 | 650 | { |
---|
649 | 651 | struct bow_context *bc = ti->private; |
---|
650 | 652 | struct dm_arg_set as; |
---|
.. | .. |
---|
717 | 719 | goto bad; |
---|
718 | 720 | } |
---|
719 | 721 | |
---|
720 | | - bc->block_size = bc->dev->bdev->bd_queue->limits.logical_block_size; |
---|
| 722 | + bc->block_size = |
---|
| 723 | + bdev_get_queue(bc->dev->bdev)->limits.logical_block_size; |
---|
721 | 724 | if (argc > 1) { |
---|
722 | 725 | ret = dm_bow_ctr_optional(ti, argc - 1, &argv[1]); |
---|
723 | 726 | if (ret) |
---|
.. | .. |
---|
788 | 791 | rb_insert_color(&br->node, &bc->ranges); |
---|
789 | 792 | |
---|
790 | 793 | ti->discards_supported = true; |
---|
791 | | - ti->may_passthrough_inline_crypto = true; |
---|
792 | 794 | |
---|
793 | 795 | return 0; |
---|
794 | 796 | |
---|
.. | .. |
---|
1182 | 1184 | return; |
---|
1183 | 1185 | } |
---|
1184 | 1186 | |
---|
| 1187 | + mutex_lock(&bc->ranges_lock); |
---|
1185 | 1188 | for (i = rb_first(&bc->ranges); i; i = rb_next(i)) { |
---|
1186 | 1189 | struct bow_range *br = container_of(i, struct bow_range, node); |
---|
1187 | 1190 | |
---|
.. | .. |
---|
1189 | 1192 | readable_type[br->type], |
---|
1190 | 1193 | (unsigned long long)br->sector); |
---|
1191 | 1194 | if (result >= end) |
---|
1192 | | - return; |
---|
| 1195 | + goto unlock; |
---|
1193 | 1196 | |
---|
1194 | 1197 | result += scnprintf(result, end - result, "\n"); |
---|
1195 | 1198 | if (result >= end) |
---|
1196 | | - return; |
---|
| 1199 | + goto unlock; |
---|
1197 | 1200 | |
---|
1198 | 1201 | if (br->type == TRIMMED) |
---|
1199 | 1202 | ++trimmed_range_count; |
---|
.. | .. |
---|
1215 | 1218 | if (!rb_next(i)) { |
---|
1216 | 1219 | scnprintf(result, end - result, |
---|
1217 | 1220 | "\nERROR: Last range not of type TOP"); |
---|
1218 | | - return; |
---|
| 1221 | + goto unlock; |
---|
1219 | 1222 | } |
---|
1220 | 1223 | |
---|
1221 | 1224 | if (br->sector > range_top(br)) { |
---|
1222 | 1225 | scnprintf(result, end - result, |
---|
1223 | 1226 | "\nERROR: sectors out of order"); |
---|
1224 | | - return; |
---|
| 1227 | + goto unlock; |
---|
1225 | 1228 | } |
---|
1226 | 1229 | } |
---|
1227 | 1230 | |
---|
1228 | 1231 | if (trimmed_range_count != trimmed_list_length) |
---|
1229 | 1232 | scnprintf(result, end - result, |
---|
1230 | 1233 | "\nERROR: not all trimmed ranges in trimmed list"); |
---|
| 1234 | + |
---|
| 1235 | +unlock: |
---|
| 1236 | + mutex_unlock(&bc->ranges_lock); |
---|
1231 | 1237 | } |
---|
1232 | 1238 | |
---|
1233 | 1239 | static void dm_bow_status(struct dm_target *ti, status_type_t type, |
---|
.. | .. |
---|
1267 | 1273 | static struct target_type bow_target = { |
---|
1268 | 1274 | .name = "bow", |
---|
1269 | 1275 | .version = {1, 2, 0}, |
---|
| 1276 | + .features = DM_TARGET_PASSES_CRYPTO, |
---|
1270 | 1277 | .module = THIS_MODULE, |
---|
1271 | 1278 | .ctr = dm_bow_ctr, |
---|
1272 | 1279 | .dtr = dm_bow_dtr, |
---|