diff options
Diffstat (limited to 'drivers/md/dm-thin.c')
| -rw-r--r-- | drivers/md/dm-thin.c | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index 17ad50daed08..28808e5ec0fd 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c | |||
| @@ -1094,6 +1094,19 @@ static void process_prepared_discard_passdown_pt1(struct dm_thin_new_mapping *m) | |||
| 1094 | return; | 1094 | return; |
| 1095 | } | 1095 | } |
| 1096 | 1096 | ||
| 1097 | /* | ||
| 1098 | * Increment the unmapped blocks. This prevents a race between the | ||
| 1099 | * passdown io and reallocation of freed blocks. | ||
| 1100 | */ | ||
| 1101 | r = dm_pool_inc_data_range(pool->pmd, m->data_block, data_end); | ||
| 1102 | if (r) { | ||
| 1103 | metadata_operation_failed(pool, "dm_pool_inc_data_range", r); | ||
| 1104 | bio_io_error(m->bio); | ||
| 1105 | cell_defer_no_holder(tc, m->cell); | ||
| 1106 | mempool_free(m, pool->mapping_pool); | ||
| 1107 | return; | ||
| 1108 | } | ||
| 1109 | |||
| 1097 | discard_parent = bio_alloc(GFP_NOIO, 1); | 1110 | discard_parent = bio_alloc(GFP_NOIO, 1); |
| 1098 | if (!discard_parent) { | 1111 | if (!discard_parent) { |
| 1099 | DMWARN("%s: unable to allocate top level discard bio for passdown. Skipping passdown.", | 1112 | DMWARN("%s: unable to allocate top level discard bio for passdown. Skipping passdown.", |
| @@ -1114,19 +1127,6 @@ static void process_prepared_discard_passdown_pt1(struct dm_thin_new_mapping *m) | |||
| 1114 | end_discard(&op, r); | 1127 | end_discard(&op, r); |
| 1115 | } | 1128 | } |
| 1116 | } | 1129 | } |
| 1117 | |||
| 1118 | /* | ||
| 1119 | * Increment the unmapped blocks. This prevents a race between the | ||
| 1120 | * passdown io and reallocation of freed blocks. | ||
| 1121 | */ | ||
| 1122 | r = dm_pool_inc_data_range(pool->pmd, m->data_block, data_end); | ||
| 1123 | if (r) { | ||
| 1124 | metadata_operation_failed(pool, "dm_pool_inc_data_range", r); | ||
| 1125 | bio_io_error(m->bio); | ||
| 1126 | cell_defer_no_holder(tc, m->cell); | ||
| 1127 | mempool_free(m, pool->mapping_pool); | ||
| 1128 | return; | ||
| 1129 | } | ||
| 1130 | } | 1130 | } |
| 1131 | 1131 | ||
| 1132 | static void process_prepared_discard_passdown_pt2(struct dm_thin_new_mapping *m) | 1132 | static void process_prepared_discard_passdown_pt2(struct dm_thin_new_mapping *m) |
