diff options
author | Joe Thornber <ejt@redhat.com> | 2016-10-03 14:16:20 -0400 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2017-02-16 13:12:46 -0500 |
commit | ae4a46a1f60942263d6fd119fe1da49bb16d2bd5 (patch) | |
tree | 7f5efc43870980eb498ef12ebf653972ae23f9e2 /drivers/md/dm-cache-metadata.c | |
parent | 6fe28dbf05e329ce136f38219d95a1826ceafebd (diff) |
dm cache metadata: use bitset cursor api to load discard bitset
Signed-off-by: Joe Thornber <ejt@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 | 48 |
1 files changed, 28 insertions, 20 deletions
diff --git a/drivers/md/dm-cache-metadata.c b/drivers/md/dm-cache-metadata.c index 624fe4319b24..9364a02e1646 100644 --- a/drivers/md/dm-cache-metadata.c +++ b/drivers/md/dm-cache-metadata.c | |||
@@ -995,14 +995,6 @@ static int __clear_discard(struct dm_cache_metadata *cmd, dm_dblock_t b) | |||
995 | from_dblock(b), &cmd->discard_root); | 995 | from_dblock(b), &cmd->discard_root); |
996 | } | 996 | } |
997 | 997 | ||
998 | static int __is_discarded(struct dm_cache_metadata *cmd, dm_dblock_t b, | ||
999 | bool *is_discarded) | ||
1000 | { | ||
1001 | return dm_bitset_test_bit(&cmd->discard_info, cmd->discard_root, | ||
1002 | from_dblock(b), &cmd->discard_root, | ||
1003 | is_discarded); | ||
1004 | } | ||
1005 | |||
1006 | static int __discard(struct dm_cache_metadata *cmd, | 998 | static int __discard(struct dm_cache_metadata *cmd, |
1007 | dm_dblock_t dblock, bool discard) | 999 | dm_dblock_t dblock, bool discard) |
1008 | { | 1000 | { |
@@ -1032,22 +1024,38 @@ static int __load_discards(struct dm_cache_metadata *cmd, | |||
1032 | load_discard_fn fn, void *context) | 1024 | load_discard_fn fn, void *context) |
1033 | { | 1025 | { |
1034 | int r = 0; | 1026 | int r = 0; |
1035 | dm_block_t b; | 1027 | uint32_t b; |
1036 | bool discard; | 1028 | struct dm_bitset_cursor c; |
1037 | 1029 | ||
1038 | for (b = 0; b < from_dblock(cmd->discard_nr_blocks); b++) { | 1030 | if (from_dblock(cmd->discard_nr_blocks) == 0) |
1039 | dm_dblock_t dblock = to_dblock(b); | 1031 | /* nothing to do */ |
1032 | return 0; | ||
1040 | 1033 | ||
1041 | if (cmd->clean_when_opened) { | 1034 | if (cmd->clean_when_opened) { |
1042 | r = __is_discarded(cmd, dblock, &discard); | 1035 | r = dm_bitset_flush(&cmd->discard_info, cmd->discard_root, &cmd->discard_root); |
1043 | if (r) | 1036 | if (r) |
1044 | return r; | 1037 | return r; |
1045 | } else | ||
1046 | discard = false; | ||
1047 | 1038 | ||
1048 | r = fn(context, cmd->discard_block_size, dblock, discard); | 1039 | r = dm_bitset_cursor_begin(&cmd->discard_info, cmd->discard_root, |
1040 | from_dblock(cmd->discard_nr_blocks), &c); | ||
1049 | if (r) | 1041 | if (r) |
1050 | break; | 1042 | return r; |
1043 | |||
1044 | for (b = 0; b < from_dblock(cmd->discard_nr_blocks); b++) { | ||
1045 | r = fn(context, cmd->discard_block_size, to_dblock(b), | ||
1046 | dm_bitset_cursor_get_value(&c)); | ||
1047 | if (r) | ||
1048 | break; | ||
1049 | } | ||
1050 | |||
1051 | dm_bitset_cursor_end(&c); | ||
1052 | |||
1053 | } else { | ||
1054 | for (b = 0; b < from_dblock(cmd->discard_nr_blocks); b++) { | ||
1055 | r = fn(context, cmd->discard_block_size, to_dblock(b), false); | ||
1056 | if (r) | ||
1057 | return r; | ||
1058 | } | ||
1051 | } | 1059 | } |
1052 | 1060 | ||
1053 | return r; | 1061 | return r; |