Received: by 10.192.165.148 with SMTP id m20csp625478imm; Wed, 9 May 2018 20:08:38 -0700 (PDT) X-Google-Smtp-Source: AB8JxZpFJI1jAQld0bOFHb6a0lounwW+r0Eko5s6tI/O5yblSWLUyOyYoYrw5h9W+7+YZCdcuC7D X-Received: by 10.98.17.82 with SMTP id z79mr45634658pfi.135.1525921718580; Wed, 09 May 2018 20:08:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525921718; cv=none; d=google.com; s=arc-20160816; b=t0JO64JxVkXt5r9Zgel4ulfeh6os7GMZw1wb3W3NGFcfT79ylX1phgzV3OLNY0NAzb euVM9f3ZAggE2q8M/ngYBWdnYJik/mUOgmAeGjwez3WmK+kj0+pd9JgtjUHJ+tqy68uH wXyurfWPkt2WM5knlgK0gyzTF0xI26J773fHEKkTy94uMEfVQqUrvHm1dYzJyjhG5wVM 5YFCrE+WeH5tkh38R0MclpdfzgmaToNc/clurMbWNX/isErTcGGrxqqGbAO8o+JLgBeZ z/s6k0Rj9vsQD4HN5pco485qigz6qHCH6eHFRJW+Y3kO34KjpyOgouliIAu0xN25W3Ee zCXw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:content-disposition :mime-version:mail-followup-to:message-id:subject:cc:to:from:date :dkim-signature:arc-authentication-results; bh=TNfwmFxVarWEwBcMNqYqD9/w8qmAcpi4zLogFbfvy3o=; b=xgSJssNa5IYBF7ht5FthoLzNHI0FTBfKAlbMb/W390ybarjtKcT0jU/7IPecquzSWn 1mcKpnjGGwMdqZNIMd73knw1esNvPHDIs4KoxIn5uhRyrKpZFgAImmkbI6wrpg4RBSGw otMU6/aJdpgnokLqEV++L/8lspAlUQyGgiCEmYddjbbCsKqx/lt1XFHyMrkSZdnhajf7 VcXxR2EPjbUAu8LfltYz4Mf4SmP0Nwi1ConlOi85xqm7l4RR1q321tp9+tbDa4PFIEZs DjALFuj2NhzHOf5bAPLzYc2GY9W4f1WygXAdt/rpm3yIwr5ko9ie5kZd1uRbKB2aSS3q rJMg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Kh90MiGG; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id o76si6730998pfj.118.2018.05.09.20.08.22; Wed, 09 May 2018 20:08:38 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Kh90MiGG; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756562AbeEJDGx (ORCPT + 99 others); Wed, 9 May 2018 23:06:53 -0400 Received: from mail-pg0-f67.google.com ([74.125.83.67]:34853 "EHLO mail-pg0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756462AbeEJDGu (ORCPT ); Wed, 9 May 2018 23:06:50 -0400 Received: by mail-pg0-f67.google.com with SMTP id n1-v6so316560pgs.2; Wed, 09 May 2018 20:06:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:mail-followup-to:mime-version :content-disposition:user-agent; bh=TNfwmFxVarWEwBcMNqYqD9/w8qmAcpi4zLogFbfvy3o=; b=Kh90MiGG/RO2mkNtK3NZzfdrD64d6y4FA72nPwq7dWwp7dUDa+R32DXIOmxDBMgtqf WmOoeQLI54nCQ1kR+p3DFIPbIjW0x8H0PwvwAPT6fXiJj/4mWtwM7tm/hCKWr+2emvvE tSsD8+QGrcr+c8AliUHy+S5qNzc2aI2+sQvhpRzt5BFTfPEFRDroHfs6bmEgvztwrAuD qckj+gZH1k5q0ZV4rGjM0xY7Y9moL2cQujr4aO21S/skb1YeTym28nPtIdG6zr/U5Wv/ SRUdKA1VV6wUo6xDDtSr3v38SdeMZG1vktXOWRXUe/8WQl6LyMPpmKlKjPU1ZWjt4GKs arow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id :mail-followup-to:mime-version:content-disposition:user-agent; bh=TNfwmFxVarWEwBcMNqYqD9/w8qmAcpi4zLogFbfvy3o=; b=rUCyl2/TLSHvZrMWuKTUYW3HIc230SnMev71Vr/qdr/Z7FB3Q8VgnKU8oSLiOF641f av48hGEF9bYw3aczqwZe2ryq5F/MVkB3MC2JnepIV/hKV0gfXDSGplZC+kxIYqXmc2YR I49JoKgsgTJeCt9XoB5OI+IZITeBowt1UIM3epqTO+UAKhCc8lCmY2L9cCM88593P0Te CJnN2XeE0INRmBTTzUess2xF9kXmzR/ymErbCOuxL2mBmF1epnujcewBBuctihenqORS vtvbo6VaTaj+mQ0HNEq6W46PWhcwcj6sG8QUZXe4Y69GRYrzHNJ9/M1n2CPnybywbEpa kAcA== X-Gm-Message-State: ALQs6tDbEBYzqW/joS6wVpTXI+ApXdmIRrbJD2ppwj0xWT/aONrW0yLa rnFuII/gNflhnF9WC/HEFk0= X-Received: by 10.98.86.16 with SMTP id k16mr45826846pfb.19.1525921610168; Wed, 09 May 2018 20:06:50 -0700 (PDT) Received: from udknight.localhost ([183.90.36.235]) by smtp.gmail.com with ESMTPSA id k13sm64837621pfj.186.2018.05.09.20.06.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 09 May 2018 20:06:49 -0700 (PDT) Received: from udknight.localhost (localhost [127.0.0.1]) by udknight.localhost (8.14.9/8.14.9) with ESMTP id w4A36it3025923; Thu, 10 May 2018 11:06:44 +0800 Received: (from root@localhost) by udknight.localhost (8.14.9/8.14.9/Submit) id w4A36bhe025918; Thu, 10 May 2018 11:06:37 +0800 Date: Thu, 10 May 2018 11:06:37 +0800 From: Wang YanQing To: axboe@kernel.dk Cc: gregkh@linuxfoundation.org, pombredanne@nexb.com, tglx@linutronix.de, caizhiyong@hisilicon.com, rdunlap@infradead.org, jiangheng@hisilicon.com, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5] block: add verifier for cmdline partition Message-ID: <20180510030637.GA25734@udknight> Mail-Followup-To: Wang YanQing , axboe@kernel.dk, gregkh@linuxfoundation.org, pombredanne@nexb.com, tglx@linutronix.de, caizhiyong@hisilicon.com, rdunlap@infradead.org, jiangheng@hisilicon.com, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.7.1 (2016-10-04) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 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 --- Changes v4-v5: 1:Delete unnecessary blank line at begin and end of logs. 2:Delete newline character in log, pr_* will add newline automatically. v3-v4: 1:Fix grammar typo, reported by Randy Dunlap. 2:Delete unnecessary type casting, reported by Caizhiyong. 3:Record the reason why we can't treat overlapping partitions as errors into changelog. v2-v3: 1:Fix log one pair of overlaps partitions twice in cmdline_parts_verifier. 2:Fix out of bound access in cmdline_parts_verifier. v1-v2: 1:Don't treat overlaps partition as a error, but log a warning. Hi! Jens Axboe What is your suggestion? block/partitions/cmdline.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/block/partitions/cmdline.c b/block/partitions/cmdline.c index e333583..60fb3df 100644 --- a/block/partitions/cmdline.c +++ b/block/partitions/cmdline.c @@ -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: @@ -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); -- 1.8.5.6.2.g3d8a54e.dirty