Skip to content

Commit 3be1622

Browse files
Mikulas PatockaMike Snitzer
authored andcommitted
dm integrity: scale down the recalculate buffer if memory allocation fails
If memory allocation fails, try to reduce the size of the recalculate buffer and continue with that smaller buffer. Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Signed-off-by: Mike Snitzer <snitzer@kernel.org>
1 parent da8b4fc commit 3be1622

File tree

1 file changed

+11
-5
lines changed

1 file changed

+11
-5
lines changed

drivers/md/dm-integrity.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2658,19 +2658,25 @@ static void integrity_recalc(struct work_struct *w)
26582658
unsigned int i;
26592659
int r;
26602660
unsigned int super_counter = 0;
2661+
unsigned recalc_sectors = RECALC_SECTORS;
26612662

2662-
recalc_buffer = __vmalloc(RECALC_SECTORS << SECTOR_SHIFT, GFP_NOIO);
2663+
retry:
2664+
recalc_buffer = __vmalloc(recalc_sectors << SECTOR_SHIFT, GFP_NOIO);
26632665
if (!recalc_buffer) {
2666+
oom:
2667+
recalc_sectors >>= 1;
2668+
if (recalc_sectors >= 1U << ic->sb->log2_sectors_per_block)
2669+
goto retry;
26642670
DMCRIT("out of memory for recalculate buffer - recalculation disabled");
26652671
goto free_ret;
26662672
}
2667-
recalc_tags_size = (RECALC_SECTORS >> ic->sb->log2_sectors_per_block) * ic->tag_size;
2673+
recalc_tags_size = (recalc_sectors >> ic->sb->log2_sectors_per_block) * ic->tag_size;
26682674
if (crypto_shash_digestsize(ic->internal_hash) > ic->tag_size)
26692675
recalc_tags_size += crypto_shash_digestsize(ic->internal_hash) - ic->tag_size;
26702676
recalc_tags = kvmalloc(recalc_tags_size, GFP_NOIO);
26712677
if (!recalc_tags) {
2672-
DMCRIT("out of memory for recalculate buffer - recalculation disabled");
2673-
goto free_ret;
2678+
vfree(recalc_buffer);
2679+
goto oom;
26742680
}
26752681

26762682
DEBUG_print("start recalculation... (position %llx)\n", le64_to_cpu(ic->sb->recalc_sector));
@@ -2693,7 +2699,7 @@ static void integrity_recalc(struct work_struct *w)
26932699
}
26942700

26952701
get_area_and_offset(ic, range.logical_sector, &area, &offset);
2696-
range.n_sectors = min((sector_t)RECALC_SECTORS, ic->provided_data_sectors - range.logical_sector);
2702+
range.n_sectors = min((sector_t)recalc_sectors, ic->provided_data_sectors - range.logical_sector);
26972703
if (!ic->meta_dev)
26982704
range.n_sectors = min(range.n_sectors, ((sector_t)1U << ic->sb->log2_interleave_sectors) - (unsigned int)offset);
26992705

0 commit comments

Comments
 (0)