diff options
-rw-r--r-- | drivers/md/dm-cache-metadata.c | 22 |
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 | ||
1550 | static 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 | |||
1550 | static int __set_dirty_bits_v2(struct dm_cache_metadata *cmd, unsigned nr_bits, unsigned long *bits) | 1557 | static 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 | ||
1575 | int dm_cache_set_dirty_bits(struct dm_cache_metadata *cmd, | 1575 | int dm_cache_set_dirty_bits(struct dm_cache_metadata *cmd, |