Loading drivers/md/dm-cache-metadata.c +28 −20 Original line number Original line Diff line number Diff line Loading @@ -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) { { Loading Loading @@ -1032,24 +1024,40 @@ 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) return r; r = dm_bitset_cursor_begin(&cmd->discard_info, cmd->discard_root, from_dblock(cmd->discard_nr_blocks), &c); if (r) if (r) return r; return r; } else discard = false; r = fn(context, cmd->discard_block_size, dblock, discard); 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) if (r) break; 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; } } Loading Loading
drivers/md/dm-cache-metadata.c +28 −20 Original line number Original line Diff line number Diff line Loading @@ -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) { { Loading Loading @@ -1032,24 +1024,40 @@ 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) return r; r = dm_bitset_cursor_begin(&cmd->discard_info, cmd->discard_root, from_dblock(cmd->discard_nr_blocks), &c); if (r) if (r) return r; return r; } else discard = false; r = fn(context, cmd->discard_block_size, dblock, discard); 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) if (r) break; 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; } } Loading