Skip to content

Commit 7ec0e1f

Browse files
mbrozmehmetb0
authored andcommitted
dm-integrity: Avoid divide by zero in table status in Inline mode
BugLink: https://bugs.launchpad.net/bugs/2106703 commit 7fb3988 upstream. 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+ #959 : EIP: dm_integrity_status+0x2f8/0xab0 [dm_integrity] ... Signed-off-by: Milan Broz <[email protected]> Signed-off-by: Mikulas Patocka <[email protected]> Fixes: fb09876 ("dm-integrity: introduce the Inline mode") Cc: [email protected] # 6.11+ Signed-off-by: Greg Kroah-Hartman <[email protected]> Signed-off-by: Noah Wager <[email protected]> Signed-off-by: Mehmet Basaran <[email protected]>
1 parent a1d8b10 commit 7ec0e1f

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
@@ -3595,10 +3595,6 @@ static void dm_integrity_status(struct dm_target *ti, status_type_t type,
35953595
break;
35963596

35973597
case STATUSTYPE_TABLE: {
3598-
__u64 watermark_percentage = (__u64)(ic->journal_entries - ic->free_sectors_threshold) * 100;
3599-
3600-
watermark_percentage += ic->journal_entries / 2;
3601-
do_div(watermark_percentage, ic->journal_entries);
36023598
arg_count = 3;
36033599
arg_count += !!ic->meta_dev;
36043600
arg_count += ic->sectors_per_block != 1;
@@ -3631,6 +3627,10 @@ static void dm_integrity_status(struct dm_target *ti, status_type_t type,
36313627
DMEMIT(" interleave_sectors:%u", 1U << ic->sb->log2_interleave_sectors);
36323628
DMEMIT(" buffer_sectors:%u", 1U << ic->log2_buffer_sectors);
36333629
if (ic->mode == 'J') {
3630+
__u64 watermark_percentage = (__u64)(ic->journal_entries - ic->free_sectors_threshold) * 100;
3631+
3632+
watermark_percentage += ic->journal_entries / 2;
3633+
do_div(watermark_percentage, ic->journal_entries);
36343634
DMEMIT(" journal_watermark:%u", (unsigned int)watermark_percentage);
36353635
DMEMIT(" commit_time:%u", ic->autocommit_msec);
36363636
}

0 commit comments

Comments
 (0)