[PATCH v3] md/raid0: Provide admin guidance on multi-zone RAID0 layout migration

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Helping an administrator understand this issue and how to deal with it
requires more text than achievable in a kernel error message. Let's
clarify the issue in the admin guide, and have the kernel emit a link
to it.

v3:
  - Include "raid0" in each line of the error message, which I've found
    makes it easier to spot w/ grep.

v2:
  - Add info about setting layout w/ mdadm, using presumed-next-mdadm
    version.
  - Add comment to doc to help prevent future changes from breaking
    the link emitted by raid0.

Fixes: c84a1372df92 ("md/raid0: avoid RAID0 data corruption due to layout confusion.")
Cc: stable@xxxxxxxxxxxxxxx (3.14+)
Signed-off-by: dann frazier <dann.frazier@xxxxxxxxxxxxx>
---
 Documentation/admin-guide/md.rst | 48 ++++++++++++++++++++++++++++++++
 drivers/md/raid0.c               |  4 ++-
 2 files changed, 51 insertions(+), 1 deletion(-)

diff --git a/Documentation/admin-guide/md.rst b/Documentation/admin-guide/md.rst
index 3c51084ffd379..a736e3b4117fc 100644
--- a/Documentation/admin-guide/md.rst
+++ b/Documentation/admin-guide/md.rst
@@ -759,3 +759,51 @@ These currently include:
 
   ppl_write_hint
       NVMe stream ID to be set for each PPL write request.
+
+Multi-Zone RAID0 Layout Migration
+---------------------------------
+.. Note: a public URL to this section is emitted in an error message from
+   the raid0 driver, so please take care to not make changes that would
+   cause that link to break.
+An unintentional RAID0 layout change was introduced in the v3.14 kernel.
+This effectively means there are 2 different layouts Linux will use to
+write data to RAID0 arrays in the wild - the "pre-3.14" way and the
+"3.14 and later" way. Mixing these layouts by writing to an array while
+booted on these different kernel versions can lead to corruption.
+
+Note that this only impacts RAID0 arrays that include devices of different
+sizes. If your devices are all the same size, both layouts are equivalent,
+and your array is not at risk of corruption due to this issue.
+
+Unfortunately, the kernel cannot detect which layout was used for writes
+to pre-existing arrays, and therefore requires input from the
+administrator. This input can be provided via the kernel command line
+with the ``raid0.default_layout=<N>`` parameter, or by setting the
+``default_layout`` module parameter when loading the ``raid0`` module.
+With a new enough version of mdadm (>= 4.2, or equivalent distro backports),
+you can set the layout version when assembling a stopped array. For example::
+
+       mdadm --stop /dev/md0
+       mdadm --assemble -U layout-alternate /dev/md0 /dev/sda1 /dev/sda2
+
+See the mdadm manpage for more details. Once set in this manner, the layout
+will be recorded in the array and will not need to be explicitly specified
+in the future.
+
+Which layout version should I use?
+++++++++++++++++++++++++++++++++++
+If your RAID array has only been written to by a 3.14 or later kernel, then
+you should specify default_layout=2, or set ``layout-alternate`` in mdadm.
+If your kernel has only been written to by a < 3.14 kernel, then you should
+specify default_layout=1 or set ``layout-original`` in mdadm. If the array
+may have already been written to by both kernels < 3.14 and >= 3.14, then it
+is possible that your data has already suffered corruption. Note that
+``mdadm --detail`` will show you when an array was created, which may be
+useful in helping determine the kernel version that was in-use at the time.
+
+When determining the scope of corruption, it may also be useful to know
+that the area susceptible to this corruption is limited to the area of the
+array after "MIN_DEVICE_SIZE * NUM DEVICES".
+
+For new arrays you may choose either layout version. Neither version is
+inherently better than the other.
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
index b7c20979bd19a..587b9ab37d0ac 100644
--- a/drivers/md/raid0.c
+++ b/drivers/md/raid0.c
@@ -154,7 +154,9 @@ static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf)
 	} else {
 		pr_err("md/raid0:%s: cannot assemble multi-zone RAID0 with default_layout setting\n",
 		       mdname(mddev));
-		pr_err("md/raid0: please set raid0.default_layout to 1 or 2\n");
+		pr_err("md/raid0:%s: please set raid0.default_layout to 1 or 2\n", mdname(mddev));
+		pr_err("md/raid0:%s: Read the following page for more information:\n", mdname(mddev));
+		pr_err("md/raid0:%s: https://www.kernel.org/doc/html/latest/admin-guide/md.html#multi-zone-raid0-layout-migration\n";, mdname(mddev));
 		err = -ENOTSUPP;
 		goto abort;
 	}
-- 
2.25.0.rc2




[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux