aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/md/dm-cache-metadata.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/drivers/md/dm-cache-metadata.c b/drivers/md/dm-cache-metadata.c
index 5a5ef996a26a..7e31a4b1c476 100644
--- a/drivers/md/dm-cache-metadata.c
+++ b/drivers/md/dm-cache-metadata.c
@@ -1547,10 +1547,16 @@ static int __set_dirty_bits_v1(struct dm_cache_metadata *cmd, unsigned nr_bits,
1547 return 0; 1547 return 0;
1548} 1548}
1549 1549
1550static int is_dirty_callback(uint32_t index, bool *value, void *context)
1551{
1552 unsigned long *bits = context;
1553 *value = test_bit(index, bits);
1554 return 0;
1555}
1556
1550static int __set_dirty_bits_v2(struct dm_cache_metadata *cmd, unsigned nr_bits, unsigned long *bits) 1557static int __set_dirty_bits_v2(struct dm_cache_metadata *cmd, unsigned nr_bits, unsigned long *bits)
1551{ 1558{
1552 int r = 0; 1559 int r = 0;
1553 unsigned i;
1554 1560
1555 /* nr_bits is really just a sanity check */ 1561 /* nr_bits is really just a sanity check */
1556 if (nr_bits != from_cblock(cmd->cache_blocks)) { 1562 if (nr_bits != from_cblock(cmd->cache_blocks)) {
@@ -1558,18 +1564,12 @@ static int __set_dirty_bits_v2(struct dm_cache_metadata *cmd, unsigned nr_bits,
1558 return -EINVAL; 1564 return -EINVAL;
1559 } 1565 }
1560 1566
1561 for (i = 0; i < nr_bits; i++) { 1567 r = dm_bitset_del(&cmd->dirty_info, cmd->dirty_root);
1562 if (test_bit(i, bits)) 1568 if (r)
1563 r = dm_bitset_set_bit(&cmd->dirty_info, cmd->dirty_root, i, &cmd->dirty_root); 1569 return r;
1564 else
1565 r = dm_bitset_clear_bit(&cmd->dirty_info, cmd->dirty_root, i, &cmd->dirty_root);
1566
1567 if (r)
1568 return r;
1569 }
1570 1570
1571 cmd->changed = true; 1571 cmd->changed = true;
1572 return dm_bitset_flush(&cmd->dirty_info, cmd->dirty_root, &cmd->dirty_root); 1572 return dm_bitset_new(&cmd->dirty_info, &cmd->dirty_root, nr_bits, is_dirty_callback, bits);
1573} 1573}
1574 1574
1575int dm_cache_set_dirty_bits(struct dm_cache_metadata *cmd, 1575int dm_cache_set_dirty_bits(struct dm_cache_metadata *cmd,