Skip to content

Commit

Permalink
block: add verifier for cmdline partition
Browse files Browse the repository at this point in the history
I meet strange filesystem corruption issue recently, the reason
is there are overlaps partitions in cmdline partition argument.

This patch add verifier for cmdline partition, then if there are
overlaps partitions, cmdline_partition will log a warning. We don't
treat overlaps partition as a error:
"
Caizhiyong <[email protected]> said:
Partition overlap was intentionally designed in this cmdline partition.
reference http://lists.infradead.org/pipermail/linux-mtd/2013-August/048092.html
"

Signed-off-by: Wang YanQing <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
wyqkp authored and axboe committed Jun 5, 2018
1 parent 0ec6937 commit 645d409
Showing 1 changed file with 57 additions and 0 deletions.
57 changes: 57 additions & 0 deletions block/partitions/cmdline.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,62 @@ static int __init cmdline_parts_setup(char *s)
}
__setup("blkdevparts=", cmdline_parts_setup);

static bool has_overlaps(sector_t from, sector_t size,
sector_t from2, sector_t size2)
{
sector_t end = from + size;
sector_t end2 = from2 + size2;

if (from >= from2 && from < end2)
return true;

if (end > from2 && end <= end2)
return true;

if (from2 >= from && from2 < end)
return true;

if (end2 > from && end2 <= end)
return true;

return false;
}

static inline void overlaps_warns_header(void)
{
pr_warn("Overlapping partitions are used in command line partitions.");
pr_warn("Don't use filesystems on overlapping partitions:");
}

static void cmdline_parts_verifier(int slot, struct parsed_partitions *state)
{
int i;
bool header = true;

for (; slot < state->limit && state->parts[slot].has_info; slot++) {
for (i = slot+1; i < state->limit && state->parts[i].has_info;
i++) {
if (has_overlaps(state->parts[slot].from,
state->parts[slot].size,
state->parts[i].from,
state->parts[i].size)) {
if (header) {
header = false;
overlaps_warns_header();
}
pr_warn("%s[%llu,%llu] overlaps with "
"%s[%llu,%llu].",
state->parts[slot].info.volname,
(u64)state->parts[slot].from << 9,
(u64)state->parts[slot].size << 9,
state->parts[i].info.volname,
(u64)state->parts[i].from << 9,
(u64)state->parts[i].size << 9);
}
}
}
}

/*
* Purpose: allocate cmdline partitions.
* Returns:
Expand Down Expand Up @@ -93,6 +149,7 @@ int cmdline_partition(struct parsed_partitions *state)
disk_size = get_capacity(state->bdev->bd_disk) << 9;

cmdline_parts_set(parts, disk_size, 1, add_part, (void *)state);
cmdline_parts_verifier(1, state);

strlcat(state->pp_buf, "\n", PAGE_SIZE);

Expand Down

0 comments on commit 645d409

Please sign in to comment.