dm integrity: don't replay journal data past the end of the device
authorMikulas Patocka <mpatocka@redhat.com>
Sun, 22 Mar 2020 19:42:23 +0000 (20:42 +0100)
committerMike Snitzer <snitzer@redhat.com>
Tue, 24 Mar 2020 16:43:21 +0000 (12:43 -0400)
Following commits will make it possible to shrink or extend the device. If
the device was shrunk, we don't want to replay journal data pointing past
the end of the device.

Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
drivers/md/dm-integrity.c

index 8ce69355b8dc8a6938febe201f6f5eabbcf4174e..3c10a672322f67fd863e0801e00a6eb8f371fa93 100644 (file)
@@ -2194,6 +2194,8 @@ static void do_journal_write(struct dm_integrity_c *ic, unsigned write_start,
                                        sec &= ~(sector_t)(ic->sectors_per_block - 1);
                                }
                        }
+                       if (unlikely(sec >= ic->provided_data_sectors))
+                               continue;
                        get_area_and_offset(ic, sec, &area, &offset);
                        restore_last_bytes(ic, access_journal_data(ic, i, j), je);
                        for (k = j + 1; k < ic->journal_section_entries; k++) {
@@ -2203,6 +2205,8 @@ static void do_journal_write(struct dm_integrity_c *ic, unsigned write_start,
                                        break;
                                BUG_ON(unlikely(journal_entry_is_inprogress(je2)) && !from_replay);
                                sec2 = journal_entry_get_sector(je2);
+                               if (unlikely(sec2 >= ic->provided_data_sectors))
+                                       break;
                                get_area_and_offset(ic, sec2, &area2, &offset2);
                                if (area2 != area || offset2 != offset + ((k - j) << ic->sb->log2_sectors_per_block))
                                        break;