Skip to content

Commit 7fb3988

Browse files
mbrozMikulas Patocka
authored and
Mikulas Patocka
committed
dm-integrity: Avoid divide by zero in table status in Inline mode
In Inline mode, the journal is unused, and journal_sectors is zero. Calculating the journal watermark requires dividing by journal_sectors, which should be done only if the journal is configured. Otherwise, a simple table query (dmsetup table) can cause OOPS. This bug did not show on some systems, perhaps only due to compiler optimization. On my 32-bit testing machine, this reliably crashes with the following: : Oops: divide error: 0000 [#1] PREEMPT SMP : CPU: 0 UID: 0 PID: 2450 Comm: dmsetup Not tainted 6.14.0-rc2+ Rust-for-Linux#959 : EIP: dm_integrity_status+0x2f8/0xab0 [dm_integrity] ... Signed-off-by: Milan Broz <gmazyland@gmail.com> Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Fixes: fb09876 ("dm-integrity: introduce the Inline mode") Cc: stable@vger.kernel.org # 6.11+
1 parent 0ad2507 commit 7fb3988

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

drivers/md/dm-integrity.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3790,10 +3790,6 @@ static void dm_integrity_status(struct dm_target *ti, status_type_t type,
37903790
break;
37913791

37923792
case STATUSTYPE_TABLE: {
3793-
__u64 watermark_percentage = (__u64)(ic->journal_entries - ic->free_sectors_threshold) * 100;
3794-
3795-
watermark_percentage += ic->journal_entries / 2;
3796-
do_div(watermark_percentage, ic->journal_entries);
37973793
arg_count = 3;
37983794
arg_count += !!ic->meta_dev;
37993795
arg_count += ic->sectors_per_block != 1;
@@ -3826,6 +3822,10 @@ static void dm_integrity_status(struct dm_target *ti, status_type_t type,
38263822
DMEMIT(" interleave_sectors:%u", 1U << ic->sb->log2_interleave_sectors);
38273823
DMEMIT(" buffer_sectors:%u", 1U << ic->log2_buffer_sectors);
38283824
if (ic->mode == 'J') {
3825+
__u64 watermark_percentage = (__u64)(ic->journal_entries - ic->free_sectors_threshold) * 100;
3826+
3827+
watermark_percentage += ic->journal_entries / 2;
3828+
do_div(watermark_percentage, ic->journal_entries);
38293829
DMEMIT(" journal_watermark:%u", (unsigned int)watermark_percentage);
38303830
DMEMIT(" commit_time:%u", ic->autocommit_msec);
38313831
}

0 commit comments

Comments
 (0)