summaryrefslogtreecommitdiffstats
path: root/drivers/md/dm-cache-metadata.c
diff options
context:
space:
mode:
authorJoe Thornber <ejt@redhat.com>2016-10-03 14:16:20 -0400
committerMike Snitzer <snitzer@redhat.com>2017-02-16 13:12:46 -0500
commitae4a46a1f60942263d6fd119fe1da49bb16d2bd5 (patch)
tree7f5efc43870980eb498ef12ebf653972ae23f9e2 /drivers/md/dm-cache-metadata.c
parent6fe28dbf05e329ce136f38219d95a1826ceafebd (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.c48
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
998static 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
1006static int __discard(struct dm_cache_metadata *cmd, 998static 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;