| .. | .. |
|---|
| 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, |
|---|