From patchwork Wed Dec 18 14:31:23 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: dann frazier X-Patchwork-Id: 1212463 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=canonical.com Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47dHWZ31thz9sP3; Thu, 19 Dec 2019 01:31:38 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1ihaMQ-0005U8-JT; Wed, 18 Dec 2019 14:31:34 +0000 Received: from youngberry.canonical.com ([91.189.89.112]) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1ihaMP-0005TV-8G for kernel-team@lists.ubuntu.com; Wed, 18 Dec 2019 14:31:33 +0000 Received: from mail-il1-f199.google.com ([209.85.166.199]) by youngberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1ihaMO-0007PX-Sc for kernel-team@lists.ubuntu.com; Wed, 18 Dec 2019 14:31:33 +0000 Received: by mail-il1-f199.google.com with SMTP id s9so1898719ilk.0 for ; Wed, 18 Dec 2019 06:31:32 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=L5A+6fh4wmI7aoz5NHZc/z4z2TJ9P27uj5fhMdNhpYA=; b=OnQyjAFlj/rnDZfPWVhPyaRlXMrrSJ10auH4kL+0Is+J52qzoB5kRNf2Thj2bqoriq xAGZ1lr4AYv9RebOdO0mPlbHUXpxjj0afTm1TEMo4jr8mF5jxecYpFhF+K3JsRpfIqR+ SC4931bC3DC46sVc353kVeOes4FPAELqaElWCmirxtsPTGKat3qchthR8rgXxONhSfSQ NgGCV26hEdp5Ch2V7ryzglroT2Bcq5E+woxwB9a9JjN2CCqazw4WhdGW7kM51ku2YCKU vxw4UgAR5g9NheniQXiECEy46p031MNrwWoYFNfZiHB9k1Tz6LEcbWa2W3VijQZFz3FT HgXQ== X-Gm-Message-State: APjAAAWbKdSXxfizmmda8hvRlHZIMbamU/48MZl6RxsYmf+e0XUqwkI5 CPjS3+HmoGZB5AHrMyDLPJnkLQUj6tkaS2/mwFCZZoOXSNIFtSUW5SeVH5Kv9wsYD1Z16aYrX/M 9dqPFfDp21LnRdx5tP662vWPgzV5rJ35NllxbIp9ksA== X-Received: by 2002:a92:381b:: with SMTP id f27mr2213360ila.291.1576679491739; Wed, 18 Dec 2019 06:31:31 -0800 (PST) X-Google-Smtp-Source: APXvYqzAymvsQhFO4M+PYfGDCmoKKK9A1zbgJTk8FAlAwyqlLyfN2GZDsQNEx76nI9LsNKhiiejLqw== X-Received: by 2002:a92:381b:: with SMTP id f27mr2213335ila.291.1576679491492; Wed, 18 Dec 2019 06:31:31 -0800 (PST) Received: from xps13.canonical.com (c-71-56-235-36.hsd1.co.comcast.net. [71.56.235.36]) by smtp.gmail.com with ESMTPSA id n5sm714870ili.28.2019.12.18.06.31.30 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Dec 2019 06:31:31 -0800 (PST) From: dann frazier To: kernel-team@lists.ubuntu.com Subject: [PATCH 2/5][SRU Bionic] md: add feature flag MD_FEATURE_RAID0_LAYOUT Date: Wed, 18 Dec 2019 07:31:23 -0700 Message-Id: <20191218143126.208077-2-dann.frazier@canonical.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20191218143126.208077-1-dann.frazier@canonical.com> References: <20191218142041.206383-1-dann.frazier@canonical.com> <20191218143126.208077-1-dann.frazier@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: NeilBrown BugLink: https://bugs.launchpad.net/bugs/1850540 Due to a bug introduced in Linux 3.14 we cannot determine the correctly layout for a multi-zone RAID0 array - there are two possibilities. It is possible to tell the kernel which to chose using a module parameter, but this can be clumsy to use. It would be best if the choice were recorded in the metadata. So add a feature flag for this purpose. If it is set, then the 'layout' field of the superblock is used to determine which layout to use. If this flag is not set, then mddev->layout gets set to -1, which causes the module parameter to be required. Acked-by: Guoqing Jiang Signed-off-by: NeilBrown Signed-off-by: Song Liu (cherry picked from commit 33f2c35a54dfd75ad0e7e86918dcbe4de799a56c) Signed-off-by: dann frazier --- drivers/md/md.c | 13 +++++++++++++ drivers/md/raid0.c | 3 +++ include/uapi/linux/raid/md_p.h | 2 ++ 3 files changed, 18 insertions(+) diff --git a/drivers/md/md.c b/drivers/md/md.c index 2399e7e847bd7..2cc671ff071db 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -1191,6 +1191,8 @@ static int super_90_validate(struct mddev *mddev, struct md_rdev *rdev) mddev->new_layout = mddev->layout; mddev->new_chunk_sectors = mddev->chunk_sectors; } + if (mddev->level == 0) + mddev->layout = -1; if (sb->state & (1<recovery_cp = MaxSector; @@ -1607,6 +1609,10 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_ rdev->ppl.sector = rdev->sb_start + rdev->ppl.offset; } + if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_RAID0_LAYOUT) && + sb->level != 0) + return -EINVAL; + if (!refdev) { ret = 1; } else { @@ -1717,6 +1723,10 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev) mddev->new_chunk_sectors = mddev->chunk_sectors; } + if (mddev->level == 0 && + !(le32_to_cpu(sb->feature_map) & MD_FEATURE_RAID0_LAYOUT)) + mddev->layout = -1; + if (le32_to_cpu(sb->feature_map) & MD_FEATURE_JOURNAL) set_bit(MD_HAS_JOURNAL, &mddev->flags); @@ -6803,6 +6813,9 @@ static int set_array_info(struct mddev *mddev, mdu_array_info_t *info) mddev->external = 0; mddev->layout = info->layout; + if (mddev->level == 0) + /* Cannot trust RAID0 layout info here */ + mddev->layout = -1; mddev->chunk_sectors = info->chunk_size >> 9; if (mddev->persistent) { diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index 599274b4d4d4e..f4b3638637631 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c @@ -152,6 +152,9 @@ static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf) if (conf->nr_strip_zones == 1) { conf->layout = RAID0_ORIG_LAYOUT; + } else if (mddev->layout == RAID0_ORIG_LAYOUT || + mddev->layout == RAID0_ALT_MULTIZONE_LAYOUT) { + conf->layout = mddev->layout; } else if (default_layout == RAID0_ORIG_LAYOUT || default_layout == RAID0_ALT_MULTIZONE_LAYOUT) { conf->layout = default_layout; diff --git a/include/uapi/linux/raid/md_p.h b/include/uapi/linux/raid/md_p.h index b0d15c73f6d75..1f2d8c81f0e0c 100644 --- a/include/uapi/linux/raid/md_p.h +++ b/include/uapi/linux/raid/md_p.h @@ -329,6 +329,7 @@ struct mdp_superblock_1 { #define MD_FEATURE_JOURNAL 512 /* support write cache */ #define MD_FEATURE_PPL 1024 /* support PPL */ #define MD_FEATURE_MULTIPLE_PPLS 2048 /* support for multiple PPLs */ +#define MD_FEATURE_RAID0_LAYOUT 4096 /* layout is meaningful for RAID0 */ #define MD_FEATURE_ALL (MD_FEATURE_BITMAP_OFFSET \ |MD_FEATURE_RECOVERY_OFFSET \ |MD_FEATURE_RESHAPE_ACTIVE \ @@ -341,6 +342,7 @@ struct mdp_superblock_1 { |MD_FEATURE_JOURNAL \ |MD_FEATURE_PPL \ |MD_FEATURE_MULTIPLE_PPLS \ + |MD_FEATURE_RAID0_LAYOUT \ ) struct r5l_payload_header {