mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH V3 0/3] md/raid0: fix a takeover BUG and tidy member-size rounding
@ 2026-11-02  8:38 Zizhi Wo
  2026-11-02  8:38 ` [PATCH V3 1/3] md/raid0: reject a takeover whose zones cannot cover the array Zizhi Wo
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Zizhi Wo @ 2026-11-02  8:38 UTC (permalink / raw)
  To: song, yukuai, magiclinan, xiao, linux-raid
  Cc: linux-kernel, yangerkun, chengzhihao1, wozizhi

Patch 1 fixes a syzbot BUG() in find_zone(): a takeover can build strip
zones that cover less than the array still advertises, and I/O for the tail
reaches find_zone(), which cannot map it. Reject such a takeover up front.

Patch 2 factors out the "member size rounded down to a chunk" computation.

Patch 3 uses it in raid0_size() in place of a power-of-2 mask, which is not
a round down for a non-power-of-2 chunk, to consistent with how
create_strip_zones() already rounds the members when building the zones.

Changes since v2:
 - Dropped the first three patches; only the last three are kept. The
   changes needed to restore state on a failed takeover, as well as on the
   subsequent error paths in level_store(), are fairly large and are not
   addressed in this patch set for now.

v2:
https://lore.kernel.org/all/20261019010827.2922617-1-wozizhi@huaweicloud.com/

v1:
https://lore.kernel.org/all/20261017005802.2212102-1-wozizhi@huaweicloud.com/

Zizhi Wo (3):
  md/raid0: reject a takeover whose zones cannot cover the array
  md/raid0: factor out raid0_member_sectors()
  md/raid0: round member size in raid0_size() with sector_div()

 drivers/md/raid0.c | 48 +++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 43 insertions(+), 5 deletions(-)

-- 
2.52.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH V3 1/3] md/raid0: reject a takeover whose zones cannot cover the array
  2026-11-02  8:38 [PATCH V3 0/3] md/raid0: fix a takeover BUG and tidy member-size rounding Zizhi Wo
@ 2026-11-02  8:38 ` Zizhi Wo
  2026-11-06  6:34   ` yu kuai
  2026-11-02  8:38 ` [PATCH V3 2/3] md/raid0: factor out raid0_member_sectors() Zizhi Wo
  2026-11-02  8:38 ` [PATCH V3 3/3] md/raid0: round member size in raid0_size() with sector_div() Zizhi Wo
  2 siblings, 1 reply; 6+ messages in thread
From: Zizhi Wo @ 2026-11-02  8:38 UTC (permalink / raw)
  To: song, yukuai, magiclinan, xiao, linux-raid
  Cc: linux-kernel, yangerkun, chengzhihao1, wozizhi

From: Zizhi Wo <wozizhi@huawei.com>

If a raid0 takeover builds strip zones that cover less than the advertised
array size, the block layer still accepts I/O for the whole size.
raid0_make_request() hands any request past the zones to the mapping code,
which fails to map it and triggers a BUG_ON.

The zones are built from the member sizes in rdev->sectors, which may not
match the size the array already advertises, so the zones can come out
covering less than it. The extreme case is a member with no size recorded
at all: an array created without metadata imports its devices through
md_import_device(dev, -1, -1), which never sets rdev->sectors, and
bind_rdev_to_array() does not reject such a member either, because its
check that mddev->dev_sectors fits inside a member is skipped when
rdev->sectors is zero.

Refuse a raid0 takeover when its zones cannot cover the size the gendisk
advertises. This prevents the takeover from silently shrinking the array,
mirroring the rule raid5_start_reshape() and raid10_start_reshape() apply
to a reshape.

The check iterates the same devices and uses the same rounding as
create_strip_zones(). It does not skip devices with rdev->raid_disk < 0:
such devices cannot be raid0 members, so counting them only overestimates
the coverage and, if present, the takeover fails later in
create_strip_zones() anyway.

Fixes: 9af204cf720c ("md: Add support for Raid5->Raid0 and Raid10->Raid0 takeover")
Fixes: fc3a08b85b7a ("Add raid1->raid0 takeover support")
Signed-off-by: Zizhi Wo <wozizhi@huawei.com>
---
 drivers/md/raid0.c | 37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
index 35e103f0c2c3..fccc62a5fecc 100644
--- a/drivers/md/raid0.c
+++ b/drivers/md/raid0.c
@@ -643,6 +643,34 @@ static void raid0_error(struct mddev *mddev, struct md_rdev *rdev)
 	}
 }
 
+/*
+ * Refuse a takeover whose strip zones cannot cover the capacity the gendisk
+ * advertises: raid0 derives those zones from the sizes of its members, so
+ * find_zone() cannot map I/O that falls beyond them.
+ */
+static int raid0_takeover_check(struct mddev *mddev, int chunk)
+{
+	sector_t capacity = get_capacity(mddev->gendisk);
+	sector_t coverage = 0;
+	struct md_rdev *rdev;
+
+	rdev_for_each(rdev, mddev) {
+		sector_t sectors = rdev->sectors;
+
+		sector_div(sectors, chunk);
+		coverage += sectors * chunk;
+	}
+
+	if (coverage < capacity) {
+		pr_warn("md/raid0:%s: refusing takeover, zones cover only %llu of %llu sectors\n",
+			mdname(mddev), (unsigned long long)coverage,
+			(unsigned long long)capacity);
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
 static void *raid0_takeover_raid45(struct mddev *mddev)
 {
 	struct md_rdev *rdev;
@@ -665,6 +693,9 @@ static void *raid0_takeover_raid45(struct mddev *mddev)
 		rdev->sectors = mddev->dev_sectors;
 	}
 
+	if (raid0_takeover_check(mddev, mddev->chunk_sectors))
+		return ERR_PTR(-EINVAL);
+
 	/* Set new parameters */
 	mddev->new_level = 0;
 	mddev->new_layout = 0;
@@ -707,6 +738,9 @@ static void *raid0_takeover_raid10(struct mddev *mddev)
 		return ERR_PTR(-EINVAL);
 	}
 
+	if (raid0_takeover_check(mddev, mddev->chunk_sectors))
+		return ERR_PTR(-EINVAL);
+
 	/* Set new parameters */
 	mddev->new_level = 0;
 	mddev->new_layout = 0;
@@ -750,6 +784,9 @@ static void *raid0_takeover_raid1(struct mddev *mddev)
 		/* array size does not allow a suitable chunk size */
 		return ERR_PTR(-EINVAL);
 
+	if (raid0_takeover_check(mddev, chunksect))
+		return ERR_PTR(-EINVAL);
+
 	/* Set new parameters */
 	mddev->new_level = 0;
 	mddev->new_layout = 0;
-- 
2.52.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH V3 2/3] md/raid0: factor out raid0_member_sectors()
  2026-11-02  8:38 [PATCH V3 0/3] md/raid0: fix a takeover BUG and tidy member-size rounding Zizhi Wo
  2026-11-02  8:38 ` [PATCH V3 1/3] md/raid0: reject a takeover whose zones cannot cover the array Zizhi Wo
@ 2026-11-02  8:38 ` Zizhi Wo
  2026-11-02  8:38 ` [PATCH V3 3/3] md/raid0: round member size in raid0_size() with sector_div() Zizhi Wo
  2 siblings, 0 replies; 6+ messages in thread
From: Zizhi Wo @ 2026-11-02  8:38 UTC (permalink / raw)
  To: song, yukuai, magiclinan, xiao, linux-raid
  Cc: linux-kernel, yangerkun, chengzhihao1, wozizhi

From: Zizhi Wo <wozizhi@huawei.com>

create_strip_zones() and the takeover coverage check both compute the size
a member contributes to a raid0 array. Pull that into a small helper so the
two sites share one definition.

No functional change.

Signed-off-by: Zizhi Wo <wozizhi@huawei.com>
---
 drivers/md/raid0.c | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
index fccc62a5fecc..c96ee54f9acc 100644
--- a/drivers/md/raid0.c
+++ b/drivers/md/raid0.c
@@ -63,6 +63,12 @@ static void dump_zones(struct mddev *mddev)
 	}
 }
 
+static sector_t raid0_member_sectors(sector_t sectors, unsigned int chunk)
+{
+	sector_div(sectors, chunk);
+	return sectors * chunk;
+}
+
 static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf)
 {
 	int i, c, err;
@@ -86,9 +92,8 @@ static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf)
 		c = 0;
 
 		/* round size to chunk_size */
-		sectors = rdev1->sectors;
-		sector_div(sectors, mddev->chunk_sectors);
-		rdev1->sectors = sectors * mddev->chunk_sectors;
+		rdev1->sectors = raid0_member_sectors(rdev1->sectors,
+						      mddev->chunk_sectors);
 
 		if (mddev_is_dm(mddev))
 			blksize = max(blksize, queue_logical_block_size(
@@ -654,12 +659,8 @@ static int raid0_takeover_check(struct mddev *mddev, int chunk)
 	sector_t coverage = 0;
 	struct md_rdev *rdev;
 
-	rdev_for_each(rdev, mddev) {
-		sector_t sectors = rdev->sectors;
-
-		sector_div(sectors, chunk);
-		coverage += sectors * chunk;
-	}
+	rdev_for_each(rdev, mddev)
+		coverage += raid0_member_sectors(rdev->sectors, chunk);
 
 	if (coverage < capacity) {
 		pr_warn("md/raid0:%s: refusing takeover, zones cover only %llu of %llu sectors\n",
-- 
2.52.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH V3 3/3] md/raid0: round member size in raid0_size() with sector_div()
  2026-11-02  8:38 [PATCH V3 0/3] md/raid0: fix a takeover BUG and tidy member-size rounding Zizhi Wo
  2026-11-02  8:38 ` [PATCH V3 1/3] md/raid0: reject a takeover whose zones cannot cover the array Zizhi Wo
  2026-11-02  8:38 ` [PATCH V3 2/3] md/raid0: factor out raid0_member_sectors() Zizhi Wo
@ 2026-11-02  8:38 ` Zizhi Wo
  2 siblings, 0 replies; 6+ messages in thread
From: Zizhi Wo @ 2026-11-02  8:38 UTC (permalink / raw)
  To: song, yukuai, magiclinan, xiao, linux-raid
  Cc: linux-kernel, yangerkun, chengzhihao1, wozizhi

From: Zizhi Wo <wozizhi@huawei.com>

raid0_size() rounds each member device down to the chunk boundary by
masking with 'chunk_sectors - 1':

	rdev->sectors & ~(sector_t)(mddev->chunk_sectors - 1)

This bit-masking only yields a correct round-down when chunk_sectors is a
power of 2. However, raid0 also supports non-power-of-2 chunk sizes, as
handled in raid0_make_request() and map_sector(), so the rounding is wrong
in that case.

Use raid0_member_sectors() instead, so that each member is rounded down
with sector_div() for any chunk size, consistent with how
create_strip_zones() already rounds the members when building the zones.

Signed-off-by: Zizhi Wo <wozizhi@huawei.com>
---
 drivers/md/raid0.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
index c96ee54f9acc..623b0701ce70 100644
--- a/drivers/md/raid0.c
+++ b/drivers/md/raid0.c
@@ -369,8 +369,8 @@ static sector_t raid0_size(struct mddev *mddev, sector_t sectors, int raid_disks
 		  "%s does not support generic reshape\n", __func__);
 
 	rdev_for_each(rdev, mddev)
-		array_sectors += (rdev->sectors &
-				  ~(sector_t)(mddev->chunk_sectors-1));
+		array_sectors += raid0_member_sectors(rdev->sectors,
+						      mddev->chunk_sectors);
 
 	return array_sectors;
 }
-- 
2.52.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH V3 1/3] md/raid0: reject a takeover whose zones cannot cover the array
  2026-11-02  8:38 ` [PATCH V3 1/3] md/raid0: reject a takeover whose zones cannot cover the array Zizhi Wo
@ 2026-11-06  6:34   ` yu kuai
  2026-11-06  8:20     ` Zizhi Wo
  0 siblings, 1 reply; 6+ messages in thread
From: yu kuai @ 2026-11-06  6:34 UTC (permalink / raw)
  To: Zizhi Wo, song, magiclinan, xiao, linux-raid, yu kuai
  Cc: linux-kernel, yangerkun, chengzhihao1, wozizhi

Hi,

在 2026/11/2 16:38, Zizhi Wo 写道:
> From: Zizhi Wo <wozizhi@huawei.com>
>
> If a raid0 takeover builds strip zones that cover less than the advertised
> array size, the block layer still accepts I/O for the whole size.
> raid0_make_request() hands any request past the zones to the mapping code,
> which fails to map it and triggers a BUG_ON.
>
> The zones are built from the member sizes in rdev->sectors, which may not
> match the size the array already advertises, so the zones can come out
> covering less than it. The extreme case is a member with no size recorded
> at all: an array created without metadata imports its devices through
> md_import_device(dev, -1, -1), which never sets rdev->sectors, and
> bind_rdev_to_array() does not reject such a member either, because its
> check that mddev->dev_sectors fits inside a member is skipped when
> rdev->sectors is zero.
>
> Refuse a raid0 takeover when its zones cannot cover the size the gendisk
> advertises. This prevents the takeover from silently shrinking the array,
> mirroring the rule raid5_start_reshape() and raid10_start_reshape() apply
> to a reshape.
>
> The check iterates the same devices and uses the same rounding as
> create_strip_zones(). It does not skip devices with rdev->raid_disk < 0:
> such devices cannot be raid0 members, so counting them only overestimates
> the coverage and, if present, the takeover fails later in
> create_strip_zones() anyway.
>
> Fixes: 9af204cf720c ("md: Add support for Raid5->Raid0 and Raid10->Raid0 takeover")
> Fixes: fc3a08b85b7a ("Add raid1->raid0 takeover support")
> Signed-off-by: Zizhi Wo <wozizhi@huawei.com>
> ---
>   drivers/md/raid0.c | 37 +++++++++++++++++++++++++++++++++++++
>   1 file changed, 37 insertions(+)
>
> diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
> index 35e103f0c2c3..fccc62a5fecc 100644
> --- a/drivers/md/raid0.c
> +++ b/drivers/md/raid0.c
> @@ -643,6 +643,34 @@ static void raid0_error(struct mddev *mddev, struct md_rdev *rdev)
>   	}
>   }
>   
> +/*
> + * Refuse a takeover whose strip zones cannot cover the capacity the gendisk
> + * advertises: raid0 derives those zones from the sizes of its members, so
> + * find_zone() cannot map I/O that falls beyond them.
> + */
> +static int raid0_takeover_check(struct mddev *mddev, int chunk)
> +{
> +	sector_t capacity = get_capacity(mddev->gendisk);
> +	sector_t coverage = 0;
> +	struct md_rdev *rdev;
> +
> +	rdev_for_each(rdev, mddev) {
> +		sector_t sectors = rdev->sectors;
> +
> +		sector_div(sectors, chunk);
> +		coverage += sectors * chunk;
> +	}
> +
> +	if (coverage < capacity) {
> +		pr_warn("md/raid0:%s: refusing takeover, zones cover only %llu of %llu sectors\n",
> +			mdname(mddev), (unsigned long long)coverage,
> +			(unsigned long long)capacity);

Other than raid1, other levels already have mddev->chunk_secotrs set, and raid456/raid10 already
have a full functional raid0, their takeover can not fail.

Noted normally mdadm will set rdev->sectors and 1.x metadata will reject zero rdev->sectors in super_1_load.
However, it's still possible raid1 can be created with rdev->sectors be zero, this is the root cause of the
problem syzbot reported.

Although raid0_takeover_raid1() already calculate chunksect by mddev->array_sectors, which is exactly the
real rdev->sectors for raid1, and it should be guaranteed such takeover can succeed. However, as it's legacy
usage that rdev->sectors can be zero, I'll suggest just checking rdev->sectors in raid0_takeover_raid1() and
reject if it's 0.

> +		return -EINVAL;
> +	}
> +
> +	return 0;
> +}
> +
>   static void *raid0_takeover_raid45(struct mddev *mddev)
>   {
>   	struct md_rdev *rdev;
> @@ -665,6 +693,9 @@ static void *raid0_takeover_raid45(struct mddev *mddev)
>   		rdev->sectors = mddev->dev_sectors;
>   	}
>   
> +	if (raid0_takeover_check(mddev, mddev->chunk_sectors))
> +		return ERR_PTR(-EINVAL);
> +
>   	/* Set new parameters */
>   	mddev->new_level = 0;
>   	mddev->new_layout = 0;
> @@ -707,6 +738,9 @@ static void *raid0_takeover_raid10(struct mddev *mddev)
>   		return ERR_PTR(-EINVAL);
>   	}
>   
> +	if (raid0_takeover_check(mddev, mddev->chunk_sectors))
> +		return ERR_PTR(-EINVAL);
> +
>   	/* Set new parameters */
>   	mddev->new_level = 0;
>   	mddev->new_layout = 0;
> @@ -750,6 +784,9 @@ static void *raid0_takeover_raid1(struct mddev *mddev)
>   		/* array size does not allow a suitable chunk size */
>   		return ERR_PTR(-EINVAL);
>   
> +	if (raid0_takeover_check(mddev, chunksect))
> +		return ERR_PTR(-EINVAL);
> +
>   	/* Set new parameters */
>   	mddev->new_level = 0;
>   	mddev->new_layout = 0;

-- 
Thanks,
Kuai

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH V3 1/3] md/raid0: reject a takeover whose zones cannot cover the array
  2026-11-06  6:34   ` yu kuai
@ 2026-11-06  8:20     ` Zizhi Wo
  0 siblings, 0 replies; 6+ messages in thread
From: Zizhi Wo @ 2026-11-06  8:20 UTC (permalink / raw)
  To: yukuai, song, magiclinan, xiao, linux-raid
  Cc: linux-kernel, yangerkun, chengzhihao1, wozizhi

Hi,yukuai

在 2026/11/6 14:34, yu kuai 写道:
> Hi,
> 
> 在 2026/11/2 16:38, Zizhi Wo 写道:
>> From: Zizhi Wo <wozizhi@huawei.com>
>>
>> If a raid0 takeover builds strip zones that cover less than the advertised
>> array size, the block layer still accepts I/O for the whole size.
>> raid0_make_request() hands any request past the zones to the mapping code,
>> which fails to map it and triggers a BUG_ON.
>>
>> The zones are built from the member sizes in rdev->sectors, which may not
>> match the size the array already advertises, so the zones can come out
>> covering less than it. The extreme case is a member with no size recorded
>> at all: an array created without metadata imports its devices through
>> md_import_device(dev, -1, -1), which never sets rdev->sectors, and
>> bind_rdev_to_array() does not reject such a member either, because its
>> check that mddev->dev_sectors fits inside a member is skipped when
>> rdev->sectors is zero.
>>
>> Refuse a raid0 takeover when its zones cannot cover the size the gendisk
>> advertises. This prevents the takeover from silently shrinking the array,
>> mirroring the rule raid5_start_reshape() and raid10_start_reshape() apply
>> to a reshape.
>>
>> The check iterates the same devices and uses the same rounding as
>> create_strip_zones(). It does not skip devices with rdev->raid_disk < 0:
>> such devices cannot be raid0 members, so counting them only overestimates
>> the coverage and, if present, the takeover fails later in
>> create_strip_zones() anyway.
>>
>> Fixes: 9af204cf720c ("md: Add support for Raid5->Raid0 and Raid10->Raid0 takeover")
>> Fixes: fc3a08b85b7a ("Add raid1->raid0 takeover support")
>> Signed-off-by: Zizhi Wo <wozizhi@huawei.com>
>> ---
>>    drivers/md/raid0.c | 37 +++++++++++++++++++++++++++++++++++++
>>    1 file changed, 37 insertions(+)
>>
>> diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
>> index 35e103f0c2c3..fccc62a5fecc 100644
>> --- a/drivers/md/raid0.c
>> +++ b/drivers/md/raid0.c
>> @@ -643,6 +643,34 @@ static void raid0_error(struct mddev *mddev, struct md_rdev *rdev)
>>    	}
>>    }
>>    
>> +/*
>> + * Refuse a takeover whose strip zones cannot cover the capacity the gendisk
>> + * advertises: raid0 derives those zones from the sizes of its members, so
>> + * find_zone() cannot map I/O that falls beyond them.
>> + */
>> +static int raid0_takeover_check(struct mddev *mddev, int chunk)
>> +{
>> +	sector_t capacity = get_capacity(mddev->gendisk);
>> +	sector_t coverage = 0;
>> +	struct md_rdev *rdev;
>> +
>> +	rdev_for_each(rdev, mddev) {
>> +		sector_t sectors = rdev->sectors;
>> +
>> +		sector_div(sectors, chunk);
>> +		coverage += sectors * chunk;
>> +	}
>> +
>> +	if (coverage < capacity) {
>> +		pr_warn("md/raid0:%s: refusing takeover, zones cover only %llu of %llu sectors\n",
>> +			mdname(mddev), (unsigned long long)coverage,
>> +			(unsigned long long)capacity);
> 
> Other than raid1, other levels already have mddev->chunk_secotrs set, and raid456/raid10 already
> have a full functional raid0, their takeover can not fail.
> 
> Noted normally mdadm will set rdev->sectors and 1.x metadata will reject zero rdev->sectors in super_1_load.
> However, it's still possible raid1 can be created with rdev->sectors be zero, this is the root cause of the
> problem syzbot reported.
> 

Please consider the following two cases, both of which reproduce the
same BUG_ON locally for me:

1. An array created without metadata leaves rdev->sectors at 0. This
isn't raid1-specific — raid10 hits the same BUG_ON too. raid45 only
escapes because raid0_takeover_raid45() overwrites rdev->sectors with
mddev->dev_sectors first; raid0_takeover_raid10() doesn't.

2. Even with valid non-zero rdev->sectors, growing the chunk of a
running raid45 can make the post-takeover coverage smaller than the
previously advertised gendisk capacity. E.g. create a raid5 with
component_size=8K, chunk=4K, run it, then change chunk to 16K and run
raid0_takeover_raid45().

So I think the real root cause is that the size changes across the
takeover, and rdev->sectors == 0 is just one special case of it. That's
why the patch compares coverage against the gendisk capacity on every
takeover path.

For case 2, the problem exists even without a takeover: if the chunk
change shrinks the usable size, I/O from the upper filesystem will break
just the same. So I'm now inclined to reject a chunk change in raid5/10
when it would shrink the usable array size, and additionally check rdev-
 >sectors for raid1/10 at the takeover path. What do you think?

Thanks,
Zizhi Wo

> Although raid0_takeover_raid1() already calculate chunksect by mddev->array_sectors, which is exactly the
> real rdev->sectors for raid1, and it should be guaranteed such takeover can succeed. However, as it's legacy
> usage that rdev->sectors can be zero, I'll suggest just checking rdev->sectors in raid0_takeover_raid1() and
> reject if it's 0.
> 
>> +		return -EINVAL;
>> +	}
>> +
>> +	return 0;
>> +}
>> +
>>    static void *raid0_takeover_raid45(struct mddev *mddev)
>>    {
>>    	struct md_rdev *rdev;
>> @@ -665,6 +693,9 @@ static void *raid0_takeover_raid45(struct mddev *mddev)
>>    		rdev->sectors = mddev->dev_sectors;
>>    	}
>>    
>> +	if (raid0_takeover_check(mddev, mddev->chunk_sectors))
>> +		return ERR_PTR(-EINVAL);
>> +
>>    	/* Set new parameters */
>>    	mddev->new_level = 0;
>>    	mddev->new_layout = 0;
>> @@ -707,6 +738,9 @@ static void *raid0_takeover_raid10(struct mddev *mddev)
>>    		return ERR_PTR(-EINVAL);
>>    	}
>>    
>> +	if (raid0_takeover_check(mddev, mddev->chunk_sectors))
>> +		return ERR_PTR(-EINVAL);
>> +
>>    	/* Set new parameters */
>>    	mddev->new_level = 0;
>>    	mddev->new_layout = 0;
>> @@ -750,6 +784,9 @@ static void *raid0_takeover_raid1(struct mddev *mddev)
>>    		/* array size does not allow a suitable chunk size */
>>    		return ERR_PTR(-EINVAL);
>>    
>> +	if (raid0_takeover_check(mddev, chunksect))
>> +		return ERR_PTR(-EINVAL);
>> +
>>    	/* Set new parameters */
>>    	mddev->new_level = 0;
>>    	mddev->new_layout = 0;
> 


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2026-11-06  8:20 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-11-02  8:38 [PATCH V3 0/3] md/raid0: fix a takeover BUG and tidy member-size rounding Zizhi Wo
2026-11-02  8:38 ` [PATCH V3 1/3] md/raid0: reject a takeover whose zones cannot cover the array Zizhi Wo
2026-11-06  6:34   ` yu kuai
2026-11-06  8:20     ` Zizhi Wo
2026-11-02  8:38 ` [PATCH V3 2/3] md/raid0: factor out raid0_member_sectors() Zizhi Wo
2026-11-02  8:38 ` [PATCH V3 3/3] md/raid0: round member size in raid0_size() with sector_div() Zizhi Wo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®