From: Mikulas Patocka <mpato...@redhat.com>

commit e27fec66f0a94e35a35548bd0b29ae616e62ec62 upstream.

The dm-integrity target did not report errors in bitmap mode just after
creation. The reason is that the function integrity_recalc didn't clean up
ic->recalc_bitmap as it proceeded with recalculation.

Fix this by updating the bitmap accordingly -- the double shift serves
to rounddown.

Signed-off-by: Mikulas Patocka <mpato...@redhat.com>
Fixes: 468dfca38b1a ("dm integrity: add a bitmap mode")
Cc: sta...@vger.kernel.org # v5.2+
Signed-off-by: Mike Snitzer <snit...@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>

---
 drivers/md/dm-integrity.c |   12 ++++++++++++
 1 file changed, 12 insertions(+)

--- a/drivers/md/dm-integrity.c
+++ b/drivers/md/dm-integrity.c
@@ -2487,6 +2487,7 @@ next_chunk:
        range.logical_sector = le64_to_cpu(ic->sb->recalc_sector);
        if (unlikely(range.logical_sector >= ic->provided_data_sectors)) {
                if (ic->mode == 'B') {
+                       block_bitmap_op(ic, ic->recalc_bitmap, 0, 
ic->provided_data_sectors, BITMAP_OP_CLEAR);
                        DEBUG_print("queue_delayed_work: bitmap_flush_work\n");
                        queue_delayed_work(ic->commit_wq, 
&ic->bitmap_flush_work, 0);
                }
@@ -2564,6 +2565,17 @@ next_chunk:
                goto err;
        }
 
+       if (ic->mode == 'B') {
+               sector_t start, end;
+               start = (range.logical_sector >>
+                        (ic->sb->log2_sectors_per_block + 
ic->log2_blocks_per_bitmap_bit)) <<
+                       (ic->sb->log2_sectors_per_block + 
ic->log2_blocks_per_bitmap_bit);
+               end = ((range.logical_sector + range.n_sectors) >>
+                      (ic->sb->log2_sectors_per_block + 
ic->log2_blocks_per_bitmap_bit)) <<
+                       (ic->sb->log2_sectors_per_block + 
ic->log2_blocks_per_bitmap_bit);
+               block_bitmap_op(ic, ic->recalc_bitmap, start, end - start, 
BITMAP_OP_CLEAR);
+       }
+
 advance_and_next:
        cond_resched();
 


Reply via email to