summaryrefslogtreecommitdiffstats
path: root/drivers/md/dm-cache-metadata.c
diff options
context:
space:
mode:
authorHeinz Mauelshagen <heinzm@redhat.com>2014-03-27 15:14:10 -0400
committerMike Snitzer <snitzer@redhat.com>2014-03-27 16:56:23 -0400
commit64ab346a360a4b15c28fb8531918d4a01f4eabd9 (patch)
tree7b1902c2b9c5980b7a18ea8f7e7a4cc633911804 /drivers/md/dm-cache-metadata.c
parentd132cc6d9e92424bb9d4fd35f5bd0e55d583f4be (diff)
dm cache: remove remainder of distinct discard block size
Discard block size not being equal to cache block size causes data corruption by erroneously avoiding migrations in issue_copy() because the discard state is being cleared for a group of cache blocks when it should not. Completely remove all code that enabled a distinction between the cache block size and discard block size. Signed-off-by: Heinz Mauelshagen <heinzm@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Diffstat (limited to 'drivers/md/dm-cache-metadata.c')
-rw-r--r--drivers/md/dm-cache-metadata.c34
1 files changed, 17 insertions, 17 deletions
diff --git a/drivers/md/dm-cache-metadata.c b/drivers/md/dm-cache-metadata.c
index 9ef0752e8a08..cbd568a3a579 100644
--- a/drivers/md/dm-cache-metadata.c
+++ b/drivers/md/dm-cache-metadata.c
@@ -109,7 +109,7 @@ struct dm_cache_metadata {
109 dm_block_t discard_root; 109 dm_block_t discard_root;
110 110
111 sector_t discard_block_size; 111 sector_t discard_block_size;
112 dm_dblock_t discard_nr_blocks; 112 dm_oblock_t discard_nr_blocks;
113 113
114 sector_t data_block_size; 114 sector_t data_block_size;
115 dm_cblock_t cache_blocks; 115 dm_cblock_t cache_blocks;
@@ -302,7 +302,7 @@ static int __write_initial_superblock(struct dm_cache_metadata *cmd)
302 disk_super->hint_root = cpu_to_le64(cmd->hint_root); 302 disk_super->hint_root = cpu_to_le64(cmd->hint_root);
303 disk_super->discard_root = cpu_to_le64(cmd->discard_root); 303 disk_super->discard_root = cpu_to_le64(cmd->discard_root);
304 disk_super->discard_block_size = cpu_to_le64(cmd->discard_block_size); 304 disk_super->discard_block_size = cpu_to_le64(cmd->discard_block_size);
305 disk_super->discard_nr_blocks = cpu_to_le64(from_dblock(cmd->discard_nr_blocks)); 305 disk_super->discard_nr_blocks = cpu_to_le64(from_oblock(cmd->discard_nr_blocks));
306 disk_super->metadata_block_size = cpu_to_le32(DM_CACHE_METADATA_BLOCK_SIZE >> SECTOR_SHIFT); 306 disk_super->metadata_block_size = cpu_to_le32(DM_CACHE_METADATA_BLOCK_SIZE >> SECTOR_SHIFT);
307 disk_super->data_block_size = cpu_to_le32(cmd->data_block_size); 307 disk_super->data_block_size = cpu_to_le32(cmd->data_block_size);
308 disk_super->cache_blocks = cpu_to_le32(0); 308 disk_super->cache_blocks = cpu_to_le32(0);
@@ -496,7 +496,7 @@ static void read_superblock_fields(struct dm_cache_metadata *cmd,
496 cmd->hint_root = le64_to_cpu(disk_super->hint_root); 496 cmd->hint_root = le64_to_cpu(disk_super->hint_root);
497 cmd->discard_root = le64_to_cpu(disk_super->discard_root); 497 cmd->discard_root = le64_to_cpu(disk_super->discard_root);
498 cmd->discard_block_size = le64_to_cpu(disk_super->discard_block_size); 498 cmd->discard_block_size = le64_to_cpu(disk_super->discard_block_size);
499 cmd->discard_nr_blocks = to_dblock(le64_to_cpu(disk_super->discard_nr_blocks)); 499 cmd->discard_nr_blocks = to_oblock(le64_to_cpu(disk_super->discard_nr_blocks));
500 cmd->data_block_size = le32_to_cpu(disk_super->data_block_size); 500 cmd->data_block_size = le32_to_cpu(disk_super->data_block_size);
501 cmd->cache_blocks = to_cblock(le32_to_cpu(disk_super->cache_blocks)); 501 cmd->cache_blocks = to_cblock(le32_to_cpu(disk_super->cache_blocks));
502 strncpy(cmd->policy_name, disk_super->policy_name, sizeof(cmd->policy_name)); 502 strncpy(cmd->policy_name, disk_super->policy_name, sizeof(cmd->policy_name));
@@ -594,7 +594,7 @@ static int __commit_transaction(struct dm_cache_metadata *cmd,
594 disk_super->hint_root = cpu_to_le64(cmd->hint_root); 594 disk_super->hint_root = cpu_to_le64(cmd->hint_root);
595 disk_super->discard_root = cpu_to_le64(cmd->discard_root); 595 disk_super->discard_root = cpu_to_le64(cmd->discard_root);
596 disk_super->discard_block_size = cpu_to_le64(cmd->discard_block_size); 596 disk_super->discard_block_size = cpu_to_le64(cmd->discard_block_size);
597 disk_super->discard_nr_blocks = cpu_to_le64(from_dblock(cmd->discard_nr_blocks)); 597 disk_super->discard_nr_blocks = cpu_to_le64(from_oblock(cmd->discard_nr_blocks));
598 disk_super->cache_blocks = cpu_to_le32(from_cblock(cmd->cache_blocks)); 598 disk_super->cache_blocks = cpu_to_le32(from_cblock(cmd->cache_blocks));
599 strncpy(disk_super->policy_name, cmd->policy_name, sizeof(disk_super->policy_name)); 599 strncpy(disk_super->policy_name, cmd->policy_name, sizeof(disk_super->policy_name));
600 disk_super->policy_version[0] = cpu_to_le32(cmd->policy_version[0]); 600 disk_super->policy_version[0] = cpu_to_le32(cmd->policy_version[0]);
@@ -771,15 +771,15 @@ out:
771 771
772int dm_cache_discard_bitset_resize(struct dm_cache_metadata *cmd, 772int dm_cache_discard_bitset_resize(struct dm_cache_metadata *cmd,
773 sector_t discard_block_size, 773 sector_t discard_block_size,
774 dm_dblock_t new_nr_entries) 774 dm_oblock_t new_nr_entries)
775{ 775{
776 int r; 776 int r;
777 777
778 down_write(&cmd->root_lock); 778 down_write(&cmd->root_lock);
779 r = dm_bitset_resize(&cmd->discard_info, 779 r = dm_bitset_resize(&cmd->discard_info,
780 cmd->discard_root, 780 cmd->discard_root,
781 from_dblock(cmd->discard_nr_blocks), 781 from_oblock(cmd->discard_nr_blocks),
782 from_dblock(new_nr_entries), 782 from_oblock(new_nr_entries),
783 false, &cmd->discard_root); 783 false, &cmd->discard_root);
784 if (!r) { 784 if (!r) {
785 cmd->discard_block_size = discard_block_size; 785 cmd->discard_block_size = discard_block_size;
@@ -792,28 +792,28 @@ int dm_cache_discard_bitset_resize(struct dm_cache_metadata *cmd,
792 return r; 792 return r;
793} 793}
794 794
795static int __set_discard(struct dm_cache_metadata *cmd, dm_dblock_t b) 795static int __set_discard(struct dm_cache_metadata *cmd, dm_oblock_t b)
796{ 796{
797 return dm_bitset_set_bit(&cmd->discard_info, cmd->discard_root, 797 return dm_bitset_set_bit(&cmd->discard_info, cmd->discard_root,
798 from_dblock(b), &cmd->discard_root); 798 from_oblock(b), &cmd->discard_root);
799} 799}
800 800
801static int __clear_discard(struct dm_cache_metadata *cmd, dm_dblock_t b) 801static int __clear_discard(struct dm_cache_metadata *cmd, dm_oblock_t b)
802{ 802{
803 return dm_bitset_clear_bit(&cmd->discard_info, cmd->discard_root, 803 return dm_bitset_clear_bit(&cmd->discard_info, cmd->discard_root,
804 from_dblock(b), &cmd->discard_root); 804 from_oblock(b), &cmd->discard_root);
805} 805}
806 806
807static int __is_discarded(struct dm_cache_metadata *cmd, dm_dblock_t b, 807static int __is_discarded(struct dm_cache_metadata *cmd, dm_oblock_t b,
808 bool *is_discarded) 808 bool *is_discarded)
809{ 809{
810 return dm_bitset_test_bit(&cmd->discard_info, cmd->discard_root, 810 return dm_bitset_test_bit(&cmd->discard_info, cmd->discard_root,
811 from_dblock(b), &cmd->discard_root, 811 from_oblock(b), &cmd->discard_root,
812 is_discarded); 812 is_discarded);
813} 813}
814 814
815static int __discard(struct dm_cache_metadata *cmd, 815static int __discard(struct dm_cache_metadata *cmd,
816 dm_dblock_t dblock, bool discard) 816 dm_oblock_t dblock, bool discard)
817{ 817{
818 int r; 818 int r;
819 819
@@ -826,7 +826,7 @@ static int __discard(struct dm_cache_metadata *cmd,
826} 826}
827 827
828int dm_cache_set_discard(struct dm_cache_metadata *cmd, 828int dm_cache_set_discard(struct dm_cache_metadata *cmd,
829 dm_dblock_t dblock, bool discard) 829 dm_oblock_t dblock, bool discard)
830{ 830{
831 int r; 831 int r;
832 832
@@ -844,8 +844,8 @@ static int __load_discards(struct dm_cache_metadata *cmd,
844 dm_block_t b; 844 dm_block_t b;
845 bool discard; 845 bool discard;
846 846
847 for (b = 0; b < from_dblock(cmd->discard_nr_blocks); b++) { 847 for (b = 0; b < from_oblock(cmd->discard_nr_blocks); b++) {
848 dm_dblock_t dblock = to_dblock(b); 848 dm_oblock_t dblock = to_oblock(b);
849 849
850 if (cmd->clean_when_opened) { 850 if (cmd->clean_when_opened) {
851 r = __is_discarded(cmd, dblock, &discard); 851 r = __is_discarded(cmd, dblock, &discard);