Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'dm-4.2-fixes-5' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm

Pull device mapper fixes from Mike Snitzer:

- two stable fixes for corruption seen in a snapshot of thinp metadata;
metadata snapshots aren't widely used but help provide a consistent
view of the metadata associated with an active thin-pool.

- a dm-cache fix for the 4.2 "default" policy switch from "mq" to "smq"

* tag 'dm-4.2-fixes-5' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm:
dm cache policy smq: move 'dm-cache-default' module alias to SMQ
dm btree: add ref counting ops for the leaves of top level btrees
dm thin metadata: delete btrees when releasing metadata snapshot

+54 -20
-2
drivers/md/dm-cache-policy-mq.c
··· 1471 1471 MODULE_AUTHOR("Joe Thornber <dm-devel@redhat.com>"); 1472 1472 MODULE_LICENSE("GPL"); 1473 1473 MODULE_DESCRIPTION("mq cache policy"); 1474 - 1475 - MODULE_ALIAS("dm-cache-default");
+2
drivers/md/dm-cache-policy-smq.c
··· 1789 1789 MODULE_AUTHOR("Joe Thornber <dm-devel@redhat.com>"); 1790 1790 MODULE_LICENSE("GPL"); 1791 1791 MODULE_DESCRIPTION("smq cache policy"); 1792 + 1793 + MODULE_ALIAS("dm-cache-default");
+2 -2
drivers/md/dm-thin-metadata.c
··· 1293 1293 return r; 1294 1294 1295 1295 disk_super = dm_block_data(copy); 1296 - dm_sm_dec_block(pmd->metadata_sm, le64_to_cpu(disk_super->data_mapping_root)); 1297 - dm_sm_dec_block(pmd->metadata_sm, le64_to_cpu(disk_super->device_details_root)); 1296 + dm_btree_del(&pmd->info, le64_to_cpu(disk_super->data_mapping_root)); 1297 + dm_btree_del(&pmd->details_info, le64_to_cpu(disk_super->device_details_root)); 1298 1298 dm_sm_dec_block(pmd->metadata_sm, held_root); 1299 1299 1300 1300 return dm_tm_unlock(pmd->tm, copy);
+6
drivers/md/persistent-data/dm-btree-internal.h
··· 138 138 139 139 extern struct dm_block_validator btree_node_validator; 140 140 141 + /* 142 + * Value type for upper levels of multi-level btrees. 143 + */ 144 + extern void init_le64_type(struct dm_transaction_manager *tm, 145 + struct dm_btree_value_type *vt); 146 + 141 147 #endif /* DM_BTREE_INTERNAL_H */
+6 -10
drivers/md/persistent-data/dm-btree-remove.c
··· 544 544 return r; 545 545 } 546 546 547 - static struct dm_btree_value_type le64_type = { 548 - .context = NULL, 549 - .size = sizeof(__le64), 550 - .inc = NULL, 551 - .dec = NULL, 552 - .equal = NULL 553 - }; 554 - 555 547 int dm_btree_remove(struct dm_btree_info *info, dm_block_t root, 556 548 uint64_t *keys, dm_block_t *new_root) 557 549 { ··· 551 559 int index = 0, r = 0; 552 560 struct shadow_spine spine; 553 561 struct btree_node *n; 562 + struct dm_btree_value_type le64_vt; 554 563 564 + init_le64_type(info->tm, &le64_vt); 555 565 init_shadow_spine(&spine, info); 556 566 for (level = 0; level < info->levels; level++) { 557 567 r = remove_raw(&spine, info, 558 568 (level == last_level ? 559 - &info->value_type : &le64_type), 569 + &info->value_type : &le64_vt), 560 570 root, keys[level], (unsigned *)&index); 561 571 if (r < 0) 562 572 break; ··· 648 654 int index = 0, r = 0; 649 655 struct shadow_spine spine; 650 656 struct btree_node *n; 657 + struct dm_btree_value_type le64_vt; 651 658 uint64_t k; 652 659 660 + init_le64_type(info->tm, &le64_vt); 653 661 init_shadow_spine(&spine, info); 654 662 for (level = 0; level < last_level; level++) { 655 - r = remove_raw(&spine, info, &le64_type, 663 + r = remove_raw(&spine, info, &le64_vt, 656 664 root, keys[level], (unsigned *) &index); 657 665 if (r < 0) 658 666 goto out;
+37
drivers/md/persistent-data/dm-btree-spine.c
··· 249 249 { 250 250 return s->root; 251 251 } 252 + 253 + static void le64_inc(void *context, const void *value_le) 254 + { 255 + struct dm_transaction_manager *tm = context; 256 + __le64 v_le; 257 + 258 + memcpy(&v_le, value_le, sizeof(v_le)); 259 + dm_tm_inc(tm, le64_to_cpu(v_le)); 260 + } 261 + 262 + static void le64_dec(void *context, const void *value_le) 263 + { 264 + struct dm_transaction_manager *tm = context; 265 + __le64 v_le; 266 + 267 + memcpy(&v_le, value_le, sizeof(v_le)); 268 + dm_tm_dec(tm, le64_to_cpu(v_le)); 269 + } 270 + 271 + static int le64_equal(void *context, const void *value1_le, const void *value2_le) 272 + { 273 + __le64 v1_le, v2_le; 274 + 275 + memcpy(&v1_le, value1_le, sizeof(v1_le)); 276 + memcpy(&v2_le, value2_le, sizeof(v2_le)); 277 + return v1_le == v2_le; 278 + } 279 + 280 + void init_le64_type(struct dm_transaction_manager *tm, 281 + struct dm_btree_value_type *vt) 282 + { 283 + vt->context = tm; 284 + vt->size = sizeof(__le64); 285 + vt->inc = le64_inc; 286 + vt->dec = le64_dec; 287 + vt->equal = le64_equal; 288 + }
+1 -6
drivers/md/persistent-data/dm-btree.c
··· 667 667 struct btree_node *n; 668 668 struct dm_btree_value_type le64_type; 669 669 670 - le64_type.context = NULL; 671 - le64_type.size = sizeof(__le64); 672 - le64_type.inc = NULL; 673 - le64_type.dec = NULL; 674 - le64_type.equal = NULL; 675 - 670 + init_le64_type(info->tm, &le64_type); 676 671 init_shadow_spine(&spine, info); 677 672 678 673 for (level = 0; level < (info->levels - 1); level++) {