diff options
author | Heinz Mauelshagen <heinzm@redhat.com> | 2014-03-27 15:14:10 -0400 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2014-03-27 16:56:23 -0400 |
commit | 64ab346a360a4b15c28fb8531918d4a01f4eabd9 (patch) | |
tree | 7b1902c2b9c5980b7a18ea8f7e7a4cc633911804 /drivers/md/dm-cache-metadata.c | |
parent | d132cc6d9e92424bb9d4fd35f5bd0e55d583f4be (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.c | 34 |
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 | ||
772 | int dm_cache_discard_bitset_resize(struct dm_cache_metadata *cmd, | 772 | int 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 | ||
795 | static int __set_discard(struct dm_cache_metadata *cmd, dm_dblock_t b) | 795 | static 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 | ||
801 | static int __clear_discard(struct dm_cache_metadata *cmd, dm_dblock_t b) | 801 | static 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 | ||
807 | static int __is_discarded(struct dm_cache_metadata *cmd, dm_dblock_t b, | 807 | static 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 | ||
815 | static int __discard(struct dm_cache_metadata *cmd, | 815 | static 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 | ||
828 | int dm_cache_set_discard(struct dm_cache_metadata *cmd, | 828 | int 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); |