diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-11-05 00:19:53 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-11-05 00:19:53 -0500 |
commit | e0700ce70921fbe3d1913968c663beb9df2b01a9 (patch) | |
tree | 8f8163dbdce74942a6ebe849c43c4fdcf2b52799 /drivers/md/persistent-data | |
parent | ac322de6bf5416cb145b58599297b8be73cd86ac (diff) | |
parent | aad9ae4550755edc020b5c511a8b54f0104b2f47 (diff) |
Merge tag 'dm-4.4-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm
Pull device mapper updates from Mike Snitzer:
"Smaller set of DM changes for this merge. I've based these changes on
Jens' for-4.4/reservations branch because the associated DM changes
required it.
- Revert a dm-multipath change that caused a regression for
unprivledged users (e.g. kvm guests) that issued ioctls when a
multipath device had no available paths.
- Include Christoph's refactoring of DM's ioctl handling and add
support for passing through persistent reservations with DM
multipath.
- All other changes are very simple cleanups"
* tag 'dm-4.4-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm:
dm switch: simplify conditional in alloc_region_table()
dm delay: document that offsets are specified in sectors
dm delay: capitalize the start of an delay_ctr() error message
dm delay: Use DM_MAPIO macros instead of open-coded equivalents
dm linear: remove redundant target name from error messages
dm persistent data: eliminate unnecessary return values
dm: eliminate unused "bioset" process for each bio-based DM device
dm: convert ffs to __ffs
dm: drop NULL test before kmem_cache_destroy() and mempool_destroy()
dm: add support for passing through persistent reservations
dm: refactor ioctl handling
Revert "dm mpath: fix stalls when handling invalid ioctls"
dm: initialize non-blk-mq queue data before queue is used
Diffstat (limited to 'drivers/md/persistent-data')
-rw-r--r-- | drivers/md/persistent-data/dm-array.c | 4 | ||||
-rw-r--r-- | drivers/md/persistent-data/dm-block-manager.c | 4 | ||||
-rw-r--r-- | drivers/md/persistent-data/dm-block-manager.h | 2 | ||||
-rw-r--r-- | drivers/md/persistent-data/dm-btree-internal.h | 2 | ||||
-rw-r--r-- | drivers/md/persistent-data/dm-btree-remove.c | 36 | ||||
-rw-r--r-- | drivers/md/persistent-data/dm-btree-spine.c | 20 | ||||
-rw-r--r-- | drivers/md/persistent-data/dm-btree.c | 4 | ||||
-rw-r--r-- | drivers/md/persistent-data/dm-space-map-common.c | 32 | ||||
-rw-r--r-- | drivers/md/persistent-data/dm-transaction-manager.c | 4 | ||||
-rw-r--r-- | drivers/md/persistent-data/dm-transaction-manager.h | 2 |
10 files changed, 42 insertions, 68 deletions
diff --git a/drivers/md/persistent-data/dm-array.c b/drivers/md/persistent-data/dm-array.c index e64b61ad0ef3..431a03067d64 100644 --- a/drivers/md/persistent-data/dm-array.c +++ b/drivers/md/persistent-data/dm-array.c | |||
@@ -233,9 +233,9 @@ static int get_ablock(struct dm_array_info *info, dm_block_t b, | |||
233 | /* | 233 | /* |
234 | * Unlocks an array block. | 234 | * Unlocks an array block. |
235 | */ | 235 | */ |
236 | static int unlock_ablock(struct dm_array_info *info, struct dm_block *block) | 236 | static void unlock_ablock(struct dm_array_info *info, struct dm_block *block) |
237 | { | 237 | { |
238 | return dm_tm_unlock(info->btree_info.tm, block); | 238 | dm_tm_unlock(info->btree_info.tm, block); |
239 | } | 239 | } |
240 | 240 | ||
241 | /*----------------------------------------------------------------*/ | 241 | /*----------------------------------------------------------------*/ |
diff --git a/drivers/md/persistent-data/dm-block-manager.c b/drivers/md/persistent-data/dm-block-manager.c index 88dbe7b97c2c..f2393ba838eb 100644 --- a/drivers/md/persistent-data/dm-block-manager.c +++ b/drivers/md/persistent-data/dm-block-manager.c | |||
@@ -578,7 +578,7 @@ int dm_bm_write_lock_zero(struct dm_block_manager *bm, | |||
578 | } | 578 | } |
579 | EXPORT_SYMBOL_GPL(dm_bm_write_lock_zero); | 579 | EXPORT_SYMBOL_GPL(dm_bm_write_lock_zero); |
580 | 580 | ||
581 | int dm_bm_unlock(struct dm_block *b) | 581 | void dm_bm_unlock(struct dm_block *b) |
582 | { | 582 | { |
583 | struct buffer_aux *aux; | 583 | struct buffer_aux *aux; |
584 | aux = dm_bufio_get_aux_data(to_buffer(b)); | 584 | aux = dm_bufio_get_aux_data(to_buffer(b)); |
@@ -590,8 +590,6 @@ int dm_bm_unlock(struct dm_block *b) | |||
590 | bl_up_read(&aux->lock); | 590 | bl_up_read(&aux->lock); |
591 | 591 | ||
592 | dm_bufio_release(to_buffer(b)); | 592 | dm_bufio_release(to_buffer(b)); |
593 | |||
594 | return 0; | ||
595 | } | 593 | } |
596 | EXPORT_SYMBOL_GPL(dm_bm_unlock); | 594 | EXPORT_SYMBOL_GPL(dm_bm_unlock); |
597 | 595 | ||
diff --git a/drivers/md/persistent-data/dm-block-manager.h b/drivers/md/persistent-data/dm-block-manager.h index 84330f59886d..3627d1b7667a 100644 --- a/drivers/md/persistent-data/dm-block-manager.h +++ b/drivers/md/persistent-data/dm-block-manager.h | |||
@@ -94,7 +94,7 @@ int dm_bm_write_lock_zero(struct dm_block_manager *bm, dm_block_t b, | |||
94 | struct dm_block_validator *v, | 94 | struct dm_block_validator *v, |
95 | struct dm_block **result); | 95 | struct dm_block **result); |
96 | 96 | ||
97 | int dm_bm_unlock(struct dm_block *b); | 97 | void dm_bm_unlock(struct dm_block *b); |
98 | 98 | ||
99 | /* | 99 | /* |
100 | * It's a common idiom to have a superblock that should be committed last. | 100 | * It's a common idiom to have a superblock that should be committed last. |
diff --git a/drivers/md/persistent-data/dm-btree-internal.h b/drivers/md/persistent-data/dm-btree-internal.h index 8731b6ea026b..a240990a7f33 100644 --- a/drivers/md/persistent-data/dm-btree-internal.h +++ b/drivers/md/persistent-data/dm-btree-internal.h | |||
@@ -52,7 +52,7 @@ void inc_children(struct dm_transaction_manager *tm, struct btree_node *n, | |||
52 | struct dm_btree_value_type *vt); | 52 | struct dm_btree_value_type *vt); |
53 | 53 | ||
54 | int new_block(struct dm_btree_info *info, struct dm_block **result); | 54 | int new_block(struct dm_btree_info *info, struct dm_block **result); |
55 | int unlock_block(struct dm_btree_info *info, struct dm_block *b); | 55 | void unlock_block(struct dm_btree_info *info, struct dm_block *b); |
56 | 56 | ||
57 | /* | 57 | /* |
58 | * Spines keep track of the rolling locks. There are 2 variants, read-only | 58 | * Spines keep track of the rolling locks. There are 2 variants, read-only |
diff --git a/drivers/md/persistent-data/dm-btree-remove.c b/drivers/md/persistent-data/dm-btree-remove.c index 2e4c4cb79e4d..21ea537bd55e 100644 --- a/drivers/md/persistent-data/dm-btree-remove.c +++ b/drivers/md/persistent-data/dm-btree-remove.c | |||
@@ -165,9 +165,9 @@ static int init_child(struct dm_btree_info *info, struct dm_btree_value_type *vt | |||
165 | return 0; | 165 | return 0; |
166 | } | 166 | } |
167 | 167 | ||
168 | static int exit_child(struct dm_btree_info *info, struct child *c) | 168 | static void exit_child(struct dm_btree_info *info, struct child *c) |
169 | { | 169 | { |
170 | return dm_tm_unlock(info->tm, c->block); | 170 | dm_tm_unlock(info->tm, c->block); |
171 | } | 171 | } |
172 | 172 | ||
173 | static void shift(struct btree_node *left, struct btree_node *right, int count) | 173 | static void shift(struct btree_node *left, struct btree_node *right, int count) |
@@ -249,13 +249,10 @@ static int rebalance2(struct shadow_spine *s, struct dm_btree_info *info, | |||
249 | 249 | ||
250 | __rebalance2(info, parent, &left, &right); | 250 | __rebalance2(info, parent, &left, &right); |
251 | 251 | ||
252 | r = exit_child(info, &left); | 252 | exit_child(info, &left); |
253 | if (r) { | 253 | exit_child(info, &right); |
254 | exit_child(info, &right); | ||
255 | return r; | ||
256 | } | ||
257 | 254 | ||
258 | return exit_child(info, &right); | 255 | return 0; |
259 | } | 256 | } |
260 | 257 | ||
261 | /* | 258 | /* |
@@ -394,22 +391,9 @@ static int rebalance3(struct shadow_spine *s, struct dm_btree_info *info, | |||
394 | 391 | ||
395 | __rebalance3(info, parent, &left, ¢er, &right); | 392 | __rebalance3(info, parent, &left, ¢er, &right); |
396 | 393 | ||
397 | r = exit_child(info, &left); | 394 | exit_child(info, &left); |
398 | if (r) { | 395 | exit_child(info, ¢er); |
399 | exit_child(info, ¢er); | 396 | exit_child(info, &right); |
400 | exit_child(info, &right); | ||
401 | return r; | ||
402 | } | ||
403 | |||
404 | r = exit_child(info, ¢er); | ||
405 | if (r) { | ||
406 | exit_child(info, &right); | ||
407 | return r; | ||
408 | } | ||
409 | |||
410 | r = exit_child(info, &right); | ||
411 | if (r) | ||
412 | return r; | ||
413 | 397 | ||
414 | return 0; | 398 | return 0; |
415 | } | 399 | } |
@@ -433,9 +417,7 @@ static int rebalance_children(struct shadow_spine *s, | |||
433 | 417 | ||
434 | memcpy(n, dm_block_data(child), | 418 | memcpy(n, dm_block_data(child), |
435 | dm_bm_block_size(dm_tm_get_bm(info->tm))); | 419 | dm_bm_block_size(dm_tm_get_bm(info->tm))); |
436 | r = dm_tm_unlock(info->tm, child); | 420 | dm_tm_unlock(info->tm, child); |
437 | if (r) | ||
438 | return r; | ||
439 | 421 | ||
440 | dm_tm_dec(info->tm, dm_block_location(child)); | 422 | dm_tm_dec(info->tm, dm_block_location(child)); |
441 | return 0; | 423 | return 0; |
diff --git a/drivers/md/persistent-data/dm-btree-spine.c b/drivers/md/persistent-data/dm-btree-spine.c index 0dee514ba4c5..b27b8091a1ca 100644 --- a/drivers/md/persistent-data/dm-btree-spine.c +++ b/drivers/md/persistent-data/dm-btree-spine.c | |||
@@ -117,9 +117,9 @@ int new_block(struct dm_btree_info *info, struct dm_block **result) | |||
117 | return dm_tm_new_block(info->tm, &btree_node_validator, result); | 117 | return dm_tm_new_block(info->tm, &btree_node_validator, result); |
118 | } | 118 | } |
119 | 119 | ||
120 | int unlock_block(struct dm_btree_info *info, struct dm_block *b) | 120 | void unlock_block(struct dm_btree_info *info, struct dm_block *b) |
121 | { | 121 | { |
122 | return dm_tm_unlock(info->tm, b); | 122 | dm_tm_unlock(info->tm, b); |
123 | } | 123 | } |
124 | 124 | ||
125 | /*----------------------------------------------------------------*/ | 125 | /*----------------------------------------------------------------*/ |
@@ -137,9 +137,7 @@ int exit_ro_spine(struct ro_spine *s) | |||
137 | int r = 0, i; | 137 | int r = 0, i; |
138 | 138 | ||
139 | for (i = 0; i < s->count; i++) { | 139 | for (i = 0; i < s->count; i++) { |
140 | int r2 = unlock_block(s->info, s->nodes[i]); | 140 | unlock_block(s->info, s->nodes[i]); |
141 | if (r2 < 0) | ||
142 | r = r2; | ||
143 | } | 141 | } |
144 | 142 | ||
145 | return r; | 143 | return r; |
@@ -150,9 +148,7 @@ int ro_step(struct ro_spine *s, dm_block_t new_child) | |||
150 | int r; | 148 | int r; |
151 | 149 | ||
152 | if (s->count == 2) { | 150 | if (s->count == 2) { |
153 | r = unlock_block(s->info, s->nodes[0]); | 151 | unlock_block(s->info, s->nodes[0]); |
154 | if (r < 0) | ||
155 | return r; | ||
156 | s->nodes[0] = s->nodes[1]; | 152 | s->nodes[0] = s->nodes[1]; |
157 | s->count--; | 153 | s->count--; |
158 | } | 154 | } |
@@ -194,9 +190,7 @@ int exit_shadow_spine(struct shadow_spine *s) | |||
194 | int r = 0, i; | 190 | int r = 0, i; |
195 | 191 | ||
196 | for (i = 0; i < s->count; i++) { | 192 | for (i = 0; i < s->count; i++) { |
197 | int r2 = unlock_block(s->info, s->nodes[i]); | 193 | unlock_block(s->info, s->nodes[i]); |
198 | if (r2 < 0) | ||
199 | r = r2; | ||
200 | } | 194 | } |
201 | 195 | ||
202 | return r; | 196 | return r; |
@@ -208,9 +202,7 @@ int shadow_step(struct shadow_spine *s, dm_block_t b, | |||
208 | int r; | 202 | int r; |
209 | 203 | ||
210 | if (s->count == 2) { | 204 | if (s->count == 2) { |
211 | r = unlock_block(s->info, s->nodes[0]); | 205 | unlock_block(s->info, s->nodes[0]); |
212 | if (r < 0) | ||
213 | return r; | ||
214 | s->nodes[0] = s->nodes[1]; | 206 | s->nodes[0] = s->nodes[1]; |
215 | s->count--; | 207 | s->count--; |
216 | } | 208 | } |
diff --git a/drivers/md/persistent-data/dm-btree.c b/drivers/md/persistent-data/dm-btree.c index 0e09aef43998..c573402033b2 100644 --- a/drivers/md/persistent-data/dm-btree.c +++ b/drivers/md/persistent-data/dm-btree.c | |||
@@ -141,7 +141,9 @@ int dm_btree_empty(struct dm_btree_info *info, dm_block_t *root) | |||
141 | n->header.value_size = cpu_to_le32(info->value_type.size); | 141 | n->header.value_size = cpu_to_le32(info->value_type.size); |
142 | 142 | ||
143 | *root = dm_block_location(b); | 143 | *root = dm_block_location(b); |
144 | return unlock_block(info, b); | 144 | unlock_block(info, b); |
145 | |||
146 | return 0; | ||
145 | } | 147 | } |
146 | EXPORT_SYMBOL_GPL(dm_btree_empty); | 148 | EXPORT_SYMBOL_GPL(dm_btree_empty); |
147 | 149 | ||
diff --git a/drivers/md/persistent-data/dm-space-map-common.c b/drivers/md/persistent-data/dm-space-map-common.c index aacbe70c2c2e..306d2e4502c4 100644 --- a/drivers/md/persistent-data/dm-space-map-common.c +++ b/drivers/md/persistent-data/dm-space-map-common.c | |||
@@ -259,9 +259,7 @@ int sm_ll_extend(struct ll_disk *ll, dm_block_t extra_blocks) | |||
259 | 259 | ||
260 | idx.blocknr = cpu_to_le64(dm_block_location(b)); | 260 | idx.blocknr = cpu_to_le64(dm_block_location(b)); |
261 | 261 | ||
262 | r = dm_tm_unlock(ll->tm, b); | 262 | dm_tm_unlock(ll->tm, b); |
263 | if (r < 0) | ||
264 | return r; | ||
265 | 263 | ||
266 | idx.nr_free = cpu_to_le32(ll->entries_per_block); | 264 | idx.nr_free = cpu_to_le32(ll->entries_per_block); |
267 | idx.none_free_before = 0; | 265 | idx.none_free_before = 0; |
@@ -293,7 +291,9 @@ int sm_ll_lookup_bitmap(struct ll_disk *ll, dm_block_t b, uint32_t *result) | |||
293 | 291 | ||
294 | *result = sm_lookup_bitmap(dm_bitmap_data(blk), b); | 292 | *result = sm_lookup_bitmap(dm_bitmap_data(blk), b); |
295 | 293 | ||
296 | return dm_tm_unlock(ll->tm, blk); | 294 | dm_tm_unlock(ll->tm, blk); |
295 | |||
296 | return 0; | ||
297 | } | 297 | } |
298 | 298 | ||
299 | static int sm_ll_lookup_big_ref_count(struct ll_disk *ll, dm_block_t b, | 299 | static int sm_ll_lookup_big_ref_count(struct ll_disk *ll, dm_block_t b, |
@@ -373,9 +373,7 @@ int sm_ll_find_free_block(struct ll_disk *ll, dm_block_t begin, | |||
373 | return r; | 373 | return r; |
374 | } | 374 | } |
375 | 375 | ||
376 | r = dm_tm_unlock(ll->tm, blk); | 376 | dm_tm_unlock(ll->tm, blk); |
377 | if (r < 0) | ||
378 | return r; | ||
379 | 377 | ||
380 | *result = i * ll->entries_per_block + (dm_block_t) position; | 378 | *result = i * ll->entries_per_block + (dm_block_t) position; |
381 | return 0; | 379 | return 0; |
@@ -429,9 +427,7 @@ static int sm_ll_mutate(struct ll_disk *ll, dm_block_t b, | |||
429 | if (ref_count <= 2) { | 427 | if (ref_count <= 2) { |
430 | sm_set_bitmap(bm_le, bit, ref_count); | 428 | sm_set_bitmap(bm_le, bit, ref_count); |
431 | 429 | ||
432 | r = dm_tm_unlock(ll->tm, nb); | 430 | dm_tm_unlock(ll->tm, nb); |
433 | if (r < 0) | ||
434 | return r; | ||
435 | 431 | ||
436 | if (old > 2) { | 432 | if (old > 2) { |
437 | r = dm_btree_remove(&ll->ref_count_info, | 433 | r = dm_btree_remove(&ll->ref_count_info, |
@@ -445,9 +441,7 @@ static int sm_ll_mutate(struct ll_disk *ll, dm_block_t b, | |||
445 | __le32 le_rc = cpu_to_le32(ref_count); | 441 | __le32 le_rc = cpu_to_le32(ref_count); |
446 | 442 | ||
447 | sm_set_bitmap(bm_le, bit, 3); | 443 | sm_set_bitmap(bm_le, bit, 3); |
448 | r = dm_tm_unlock(ll->tm, nb); | 444 | dm_tm_unlock(ll->tm, nb); |
449 | if (r < 0) | ||
450 | return r; | ||
451 | 445 | ||
452 | __dm_bless_for_disk(&le_rc); | 446 | __dm_bless_for_disk(&le_rc); |
453 | r = dm_btree_insert(&ll->ref_count_info, ll->ref_count_root, | 447 | r = dm_btree_insert(&ll->ref_count_info, ll->ref_count_root, |
@@ -556,7 +550,9 @@ static int metadata_ll_init_index(struct ll_disk *ll) | |||
556 | memcpy(dm_block_data(b), &ll->mi_le, sizeof(ll->mi_le)); | 550 | memcpy(dm_block_data(b), &ll->mi_le, sizeof(ll->mi_le)); |
557 | ll->bitmap_root = dm_block_location(b); | 551 | ll->bitmap_root = dm_block_location(b); |
558 | 552 | ||
559 | return dm_tm_unlock(ll->tm, b); | 553 | dm_tm_unlock(ll->tm, b); |
554 | |||
555 | return 0; | ||
560 | } | 556 | } |
561 | 557 | ||
562 | static int metadata_ll_open(struct ll_disk *ll) | 558 | static int metadata_ll_open(struct ll_disk *ll) |
@@ -570,7 +566,9 @@ static int metadata_ll_open(struct ll_disk *ll) | |||
570 | return r; | 566 | return r; |
571 | 567 | ||
572 | memcpy(&ll->mi_le, dm_block_data(block), sizeof(ll->mi_le)); | 568 | memcpy(&ll->mi_le, dm_block_data(block), sizeof(ll->mi_le)); |
573 | return dm_tm_unlock(ll->tm, block); | 569 | dm_tm_unlock(ll->tm, block); |
570 | |||
571 | return 0; | ||
574 | } | 572 | } |
575 | 573 | ||
576 | static dm_block_t metadata_ll_max_entries(struct ll_disk *ll) | 574 | static dm_block_t metadata_ll_max_entries(struct ll_disk *ll) |
@@ -590,7 +588,9 @@ static int metadata_ll_commit(struct ll_disk *ll) | |||
590 | memcpy(dm_block_data(b), &ll->mi_le, sizeof(ll->mi_le)); | 588 | memcpy(dm_block_data(b), &ll->mi_le, sizeof(ll->mi_le)); |
591 | ll->bitmap_root = dm_block_location(b); | 589 | ll->bitmap_root = dm_block_location(b); |
592 | 590 | ||
593 | return dm_tm_unlock(ll->tm, b); | 591 | dm_tm_unlock(ll->tm, b); |
592 | |||
593 | return 0; | ||
594 | } | 594 | } |
595 | 595 | ||
596 | int sm_ll_new_metadata(struct ll_disk *ll, struct dm_transaction_manager *tm) | 596 | int sm_ll_new_metadata(struct ll_disk *ll, struct dm_transaction_manager *tm) |
diff --git a/drivers/md/persistent-data/dm-transaction-manager.c b/drivers/md/persistent-data/dm-transaction-manager.c index 9cb797d800cf..abe2c5dd0993 100644 --- a/drivers/md/persistent-data/dm-transaction-manager.c +++ b/drivers/md/persistent-data/dm-transaction-manager.c | |||
@@ -342,9 +342,9 @@ int dm_tm_read_lock(struct dm_transaction_manager *tm, dm_block_t b, | |||
342 | } | 342 | } |
343 | EXPORT_SYMBOL_GPL(dm_tm_read_lock); | 343 | EXPORT_SYMBOL_GPL(dm_tm_read_lock); |
344 | 344 | ||
345 | int dm_tm_unlock(struct dm_transaction_manager *tm, struct dm_block *b) | 345 | void dm_tm_unlock(struct dm_transaction_manager *tm, struct dm_block *b) |
346 | { | 346 | { |
347 | return dm_bm_unlock(b); | 347 | dm_bm_unlock(b); |
348 | } | 348 | } |
349 | EXPORT_SYMBOL_GPL(dm_tm_unlock); | 349 | EXPORT_SYMBOL_GPL(dm_tm_unlock); |
350 | 350 | ||
diff --git a/drivers/md/persistent-data/dm-transaction-manager.h b/drivers/md/persistent-data/dm-transaction-manager.h index 2e0d4d66fb1b..f3a18be68f30 100644 --- a/drivers/md/persistent-data/dm-transaction-manager.h +++ b/drivers/md/persistent-data/dm-transaction-manager.h | |||
@@ -94,7 +94,7 @@ int dm_tm_read_lock(struct dm_transaction_manager *tm, dm_block_t b, | |||
94 | struct dm_block_validator *v, | 94 | struct dm_block_validator *v, |
95 | struct dm_block **result); | 95 | struct dm_block **result); |
96 | 96 | ||
97 | int dm_tm_unlock(struct dm_transaction_manager *tm, struct dm_block *b); | 97 | void dm_tm_unlock(struct dm_transaction_manager *tm, struct dm_block *b); |
98 | 98 | ||
99 | /* | 99 | /* |
100 | * Functions for altering the reference count of a block directly. | 100 | * Functions for altering the reference count of a block directly. |