Commit ae4a46a1 authored by Joe Thornber's avatar Joe Thornber Committed by Mike Snitzer

dm cache metadata: use bitset cursor api to load discard bitset

Signed-off-by: default avatarJoe Thornber <ejt@redhat.com>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent 6fe28dbf
...@@ -995,14 +995,6 @@ static int __clear_discard(struct dm_cache_metadata *cmd, dm_dblock_t b) ...@@ -995,14 +995,6 @@ static int __clear_discard(struct dm_cache_metadata *cmd, dm_dblock_t b)
from_dblock(b), &cmd->discard_root); from_dblock(b), &cmd->discard_root);
} }
static int __is_discarded(struct dm_cache_metadata *cmd, dm_dblock_t b,
bool *is_discarded)
{
return dm_bitset_test_bit(&cmd->discard_info, cmd->discard_root,
from_dblock(b), &cmd->discard_root,
is_discarded);
}
static int __discard(struct dm_cache_metadata *cmd, static int __discard(struct dm_cache_metadata *cmd,
dm_dblock_t dblock, bool discard) dm_dblock_t dblock, bool discard)
{ {
...@@ -1032,22 +1024,38 @@ static int __load_discards(struct dm_cache_metadata *cmd, ...@@ -1032,22 +1024,38 @@ static int __load_discards(struct dm_cache_metadata *cmd,
load_discard_fn fn, void *context) load_discard_fn fn, void *context)
{ {
int r = 0; int r = 0;
dm_block_t b; uint32_t b;
bool discard; struct dm_bitset_cursor c;
for (b = 0; b < from_dblock(cmd->discard_nr_blocks); b++) { if (from_dblock(cmd->discard_nr_blocks) == 0)
dm_dblock_t dblock = to_dblock(b); /* nothing to do */
return 0;
if (cmd->clean_when_opened) { if (cmd->clean_when_opened) {
r = __is_discarded(cmd, dblock, &discard); r = dm_bitset_flush(&cmd->discard_info, cmd->discard_root, &cmd->discard_root);
if (r) if (r)
return r; return r;
} else
discard = false;
r = fn(context, cmd->discard_block_size, dblock, discard); r = dm_bitset_cursor_begin(&cmd->discard_info, cmd->discard_root,
from_dblock(cmd->discard_nr_blocks), &c);
if (r) if (r)
break; return r;
for (b = 0; b < from_dblock(cmd->discard_nr_blocks); b++) {
r = fn(context, cmd->discard_block_size, to_dblock(b),
dm_bitset_cursor_get_value(&c));
if (r)
break;
}
dm_bitset_cursor_end(&c);
} else {
for (b = 0; b < from_dblock(cmd->discard_nr_blocks); b++) {
r = fn(context, cmd->discard_block_size, to_dblock(b), false);
if (r)
return r;
}
} }
return r; return r;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment