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>
This commit is contained in:

committed by
Mike Snitzer

parent
d132cc6d9e
commit
64ab346a36
@@ -109,7 +109,7 @@ struct dm_cache_metadata {
|
||||
dm_block_t discard_root;
|
||||
|
||||
sector_t discard_block_size;
|
||||
dm_dblock_t discard_nr_blocks;
|
||||
dm_oblock_t discard_nr_blocks;
|
||||
|
||||
sector_t data_block_size;
|
||||
dm_cblock_t cache_blocks;
|
||||
@@ -302,7 +302,7 @@ static int __write_initial_superblock(struct dm_cache_metadata *cmd)
|
||||
disk_super->hint_root = cpu_to_le64(cmd->hint_root);
|
||||
disk_super->discard_root = cpu_to_le64(cmd->discard_root);
|
||||
disk_super->discard_block_size = cpu_to_le64(cmd->discard_block_size);
|
||||
disk_super->discard_nr_blocks = cpu_to_le64(from_dblock(cmd->discard_nr_blocks));
|
||||
disk_super->discard_nr_blocks = cpu_to_le64(from_oblock(cmd->discard_nr_blocks));
|
||||
disk_super->metadata_block_size = cpu_to_le32(DM_CACHE_METADATA_BLOCK_SIZE >> SECTOR_SHIFT);
|
||||
disk_super->data_block_size = cpu_to_le32(cmd->data_block_size);
|
||||
disk_super->cache_blocks = cpu_to_le32(0);
|
||||
@@ -496,7 +496,7 @@ static void read_superblock_fields(struct dm_cache_metadata *cmd,
|
||||
cmd->hint_root = le64_to_cpu(disk_super->hint_root);
|
||||
cmd->discard_root = le64_to_cpu(disk_super->discard_root);
|
||||
cmd->discard_block_size = le64_to_cpu(disk_super->discard_block_size);
|
||||
cmd->discard_nr_blocks = to_dblock(le64_to_cpu(disk_super->discard_nr_blocks));
|
||||
cmd->discard_nr_blocks = to_oblock(le64_to_cpu(disk_super->discard_nr_blocks));
|
||||
cmd->data_block_size = le32_to_cpu(disk_super->data_block_size);
|
||||
cmd->cache_blocks = to_cblock(le32_to_cpu(disk_super->cache_blocks));
|
||||
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,
|
||||
disk_super->hint_root = cpu_to_le64(cmd->hint_root);
|
||||
disk_super->discard_root = cpu_to_le64(cmd->discard_root);
|
||||
disk_super->discard_block_size = cpu_to_le64(cmd->discard_block_size);
|
||||
disk_super->discard_nr_blocks = cpu_to_le64(from_dblock(cmd->discard_nr_blocks));
|
||||
disk_super->discard_nr_blocks = cpu_to_le64(from_oblock(cmd->discard_nr_blocks));
|
||||
disk_super->cache_blocks = cpu_to_le32(from_cblock(cmd->cache_blocks));
|
||||
strncpy(disk_super->policy_name, cmd->policy_name, sizeof(disk_super->policy_name));
|
||||
disk_super->policy_version[0] = cpu_to_le32(cmd->policy_version[0]);
|
||||
@@ -771,15 +771,15 @@ out:
|
||||
|
||||
int dm_cache_discard_bitset_resize(struct dm_cache_metadata *cmd,
|
||||
sector_t discard_block_size,
|
||||
dm_dblock_t new_nr_entries)
|
||||
dm_oblock_t new_nr_entries)
|
||||
{
|
||||
int r;
|
||||
|
||||
down_write(&cmd->root_lock);
|
||||
r = dm_bitset_resize(&cmd->discard_info,
|
||||
cmd->discard_root,
|
||||
from_dblock(cmd->discard_nr_blocks),
|
||||
from_dblock(new_nr_entries),
|
||||
from_oblock(cmd->discard_nr_blocks),
|
||||
from_oblock(new_nr_entries),
|
||||
false, &cmd->discard_root);
|
||||
if (!r) {
|
||||
cmd->discard_block_size = discard_block_size;
|
||||
@@ -792,28 +792,28 @@ int dm_cache_discard_bitset_resize(struct dm_cache_metadata *cmd,
|
||||
return r;
|
||||
}
|
||||
|
||||
static int __set_discard(struct dm_cache_metadata *cmd, dm_dblock_t b)
|
||||
static int __set_discard(struct dm_cache_metadata *cmd, dm_oblock_t b)
|
||||
{
|
||||
return dm_bitset_set_bit(&cmd->discard_info, cmd->discard_root,
|
||||
from_dblock(b), &cmd->discard_root);
|
||||
from_oblock(b), &cmd->discard_root);
|
||||
}
|
||||
|
||||
static int __clear_discard(struct dm_cache_metadata *cmd, dm_dblock_t b)
|
||||
static int __clear_discard(struct dm_cache_metadata *cmd, dm_oblock_t b)
|
||||
{
|
||||
return dm_bitset_clear_bit(&cmd->discard_info, cmd->discard_root,
|
||||
from_dblock(b), &cmd->discard_root);
|
||||
from_oblock(b), &cmd->discard_root);
|
||||
}
|
||||
|
||||
static int __is_discarded(struct dm_cache_metadata *cmd, dm_dblock_t b,
|
||||
static int __is_discarded(struct dm_cache_metadata *cmd, dm_oblock_t b,
|
||||
bool *is_discarded)
|
||||
{
|
||||
return dm_bitset_test_bit(&cmd->discard_info, cmd->discard_root,
|
||||
from_dblock(b), &cmd->discard_root,
|
||||
from_oblock(b), &cmd->discard_root,
|
||||
is_discarded);
|
||||
}
|
||||
|
||||
static int __discard(struct dm_cache_metadata *cmd,
|
||||
dm_dblock_t dblock, bool discard)
|
||||
dm_oblock_t dblock, bool discard)
|
||||
{
|
||||
int r;
|
||||
|
||||
@@ -826,7 +826,7 @@ static int __discard(struct dm_cache_metadata *cmd,
|
||||
}
|
||||
|
||||
int dm_cache_set_discard(struct dm_cache_metadata *cmd,
|
||||
dm_dblock_t dblock, bool discard)
|
||||
dm_oblock_t dblock, bool discard)
|
||||
{
|
||||
int r;
|
||||
|
||||
@@ -844,8 +844,8 @@ static int __load_discards(struct dm_cache_metadata *cmd,
|
||||
dm_block_t b;
|
||||
bool discard;
|
||||
|
||||
for (b = 0; b < from_dblock(cmd->discard_nr_blocks); b++) {
|
||||
dm_dblock_t dblock = to_dblock(b);
|
||||
for (b = 0; b < from_oblock(cmd->discard_nr_blocks); b++) {
|
||||
dm_oblock_t dblock = to_oblock(b);
|
||||
|
||||
if (cmd->clean_when_opened) {
|
||||
r = __is_discarded(cmd, dblock, &discard);
|
||||
|
Reference in New Issue
Block a user