Received: by 10.192.165.148 with SMTP id m20csp1755532imm; Sat, 5 May 2018 21:54:25 -0700 (PDT) X-Google-Smtp-Source: AB8JxZphzOcD9BOyMav/iGZikP1LWsWqGAgZwwNjoCnegLSDPAf9qw9xASQl9yMvMH0vM5FIl58l X-Received: by 2002:a63:7405:: with SMTP id p5-v6mr21569762pgc.289.1525582465668; Sat, 05 May 2018 21:54:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525582465; cv=none; d=google.com; s=arc-20160816; b=gzAnsaiC1K656Xz7wKKkOZHhJHGysdAJjHe9ci4/aIgSbR4kCy2KKC/5UY47CacGK+ kFSqv58rWgMdjCCxaUTZOwzf6ZPXDViaq/TKobZZs9oKyiv72je0B4MMaEvE6aB39Yh5 RepHckdzBmIqqe1+lk0I2ssSyLrmaq1LAflkE0GH9Vfh/RKpwy1/P8MR2jUCVg5Y0Sx6 HP6T7Xpqxhomg4nWSH1uJbSJXIrnUGEVTbxxCAHmR4/gGNrgNOCHNg3VdDO/QXWouSz2 aBpzSoQ7mPHL/m/ZBVWJHMXHFm2UKddg04+PhZaIc+srC+P0Y7jHfeA/LI2zi3E/qlCz c63Q== 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=fcs/vjkX5NHq4Y0zoeJPWpJAxZHmkMS6I/v5QYjalCo=; b=s7nFotvV6IMIMnR+k6Qv9gKMgmnUDQ2NM/oq7C+o5VCQXv4Z5brsja9tZ+pxzLa+Yj gaBiUb2KyedOxWw2f657GqUYNil+kBGZWaaVexg/It+ncj0RTj8anmVBFoPJnksSsfTw RDrFaPs7znU6zCDfPeQriVCi5zenZpHwMPEf7Jl6pt+tDT8XC/RiSu2poujx/nyh0DAh dCLSn45AnmgShUDE+oLQz1ML800eihxZfHXlakHN5Qd2VMV1KO+o4UNgKjdQnb5R4UXA /Hp82DoOw5ZqMl5Drm1neNqc5NLMgYz/zj3UlPVaBhgy2K+KRPxqR7V5GjVH/aqqKhs4 23Cw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=MzAIEuhG; 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 v13-v6si15456305pgr.676.2018.05.05.21.53.38; Sat, 05 May 2018 21:54:25 -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=MzAIEuhG; 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 S1751218AbeEFExY (ORCPT + 99 others); Sun, 6 May 2018 00:53:24 -0400 Received: from mail-pg0-f68.google.com ([74.125.83.68]:39525 "EHLO mail-pg0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750872AbeEFExW (ORCPT ); Sun, 6 May 2018 00:53:22 -0400 Received: by mail-pg0-f68.google.com with SMTP id e1-v6so6664467pga.6; Sat, 05 May 2018 21:53:21 -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=fcs/vjkX5NHq4Y0zoeJPWpJAxZHmkMS6I/v5QYjalCo=; b=MzAIEuhGxs2CUzxGwn1xPg4CE9mwt3pik7MswLjClFBlFcSrpncZn/D/V0RNBInrTp 0a8Qbja5qx5gM4rsJ1YBaCv4qjIQL2vuLgwr9gFDS8qOPvtdus+cSbCrDRhjEOIrHjLY 1QZHofYvvw245pKOe751e1qXDqVtUvtKoyRcAtg8CIRLYcepWs2gPTRwAlz5QSWKIFgn 2zeIR4SeZAtEPNVhw1yHrZO3n2IF1/R2RyJbtHW8ksdt189cHG9ZRYugAfXC9kMCamwa oaHoAA6GeC3RqvRFOEvvkXhhpkS7cC99jTQvF5yS9OLXu60lk5GV9n4tSxLeu/CBKIcz XuKw== 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=fcs/vjkX5NHq4Y0zoeJPWpJAxZHmkMS6I/v5QYjalCo=; b=WdxFxwa+DegKODhAaVkyTDB/Ric/H4EgDRHjSoY3esKY1vLMIodq1JBA0Ng+WxXWSy r6kMJhz6kMX9P53bMwmqvOXXM0t/vsQm9ATNBQLHGKGx7VHqHC96sstLn3gxBBMmfwMU kDHukaaUsY2c8yEeMQYNRlDeb4/XrSazVSy9/fGWNQTP9XXV1r1RFPcdmrmiH6DOCC3v k92RGHLrt5TDbZH2AolwfniJyrEXq12431WM/5Qr8PQaAOh8EAocK6WCQTfBHkrlr5Bh jDceIQYLQ55lEuZ3Jy2IJdeeDO4FlmhSFCT6cSc+5ESs9ErukLgRYAPhN7iJay2hZQI4 neuQ== X-Gm-Message-State: ALQs6tAAvyjDJkSshVKXdlFmmmqyl9p8kLRweyM+/UMuj2pIcgjLDwYs KT/oYHn4Q3odnQrAAyb1Cpo= X-Received: by 10.98.98.194 with SMTP id w185mr26451073pfb.78.1525582401592; Sat, 05 May 2018 21:53:21 -0700 (PDT) Received: from udknight.localhost ([183.90.36.235]) by smtp.gmail.com with ESMTPSA id r20sm44841847pff.152.2018.05.05.21.53.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 05 May 2018 21:53:20 -0700 (PDT) Received: from udknight.localhost (localhost [127.0.0.1]) by udknight.localhost (8.14.9/8.14.9) with ESMTP id w464qIXc009886; Sun, 6 May 2018 12:52:19 +0800 Received: (from root@localhost) by udknight.localhost (8.14.9/8.14.9/Submit) id w464qGr8009883; Sun, 6 May 2018 12:52:16 +0800 Date: Sun, 6 May 2018 12:52:16 +0800 From: Wang YanQing To: axboe@kernel.dk Cc: gregkh@linuxfoundation.org, pombredanne@nexb.com, tglx@linutronix.de, caizhiyong@hisilicon.com, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2] block: add verifier for cmdline partition Message-ID: <20180506045215.GA9738@udknight> Mail-Followup-To: Wang YanQing , axboe@kernel.dk, gregkh@linuxfoundation.org, pombredanne@nexb.com, tglx@linutronix.de, caizhiyong@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 v1-v2: 1:Don't treat overlaps partition as a error, but log a warning. block/partitions/cmdline.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/block/partitions/cmdline.c b/block/partitions/cmdline.c index e333583..7d70046 100644 --- a/block/partitions/cmdline.c +++ b/block/partitions/cmdline.c @@ -58,6 +58,73 @@ 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("\n"); + pr_warn("Overlaps partitions being used in command line partition.\n"); + pr_warn("Don't use filesystems on overlaps partitions:\n"); +} + +static inline void overlaps_warns_tailer(void) +{ + pr_warn("\n"); +} + +static void cmdline_parts_verifier(int slot, struct parsed_partitions *state) +{ + int i, j = slot; + bool header = true; + + for (; state->parts[slot].has_info; slot++) { + for (i = j; state->parts[i].has_info; i++) { + if (i == slot) + continue; + + 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].\n", + 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); + } + } + } + + if (!header) + overlaps_warns_tailer(); +} + /* * Purpose: allocate cmdline partitions. * Returns: @@ -93,6 +160,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, (void *)state); strlcat(state->pp_buf, "\n", PAGE_SIZE); -- 1.8.5.6.2.g3d8a54e.dirty