在 2025/8/25 16:10, Paul Menzel 写道:
Dear Li,
Thank you for your patch.
Am 25.08.25 um 09:59 schrieb linan666@xxxxxxxxxxxxxxx:
From: Li Nan <linan122@xxxxxxxxxx>
When adding a disk to a md array, avoid updating the array's
logical_block_size to match the new disk. This prevents accidental
partition table loss that renders the array unusable.
Do you have a reproducer to test this?
Please try the following script:
```
#sd[de] lbs is 512, sdf is 4096
mdadm -CR /dev/md0 -l1 -n2 /dev/sd[de] --assume-clean
#512
cat /sys/block/md0/queue/logical_block_size
#create md0p1
printf "g\nn\n\n\n\nw\n" | fdisk /dev/md0
lsblk | grep md0
mdadm --fail /dev/md0 /dev/sdd
mdadm --add /dev/md0 /dev/sdf
#4096
cat /sys/block/md0/queue/logical_block_size
#partition loss
partprobe /dev/md0
lsblk | grep md0
```
The later patch will introduce a way to configure the array's
logical_block_size.
Signed-off-by: Li Nan <linan122@xxxxxxxxxx>
Reviewed-by: Martin K. Petersen <martin.petersen@xxxxxxxxxx>
---
drivers/md/md.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/md/md.c b/drivers/md/md.c
index cea8fc96abd3..206434591b97 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -6064,6 +6064,13 @@ int mddev_stack_new_rdev(struct mddev *mddev,
struct md_rdev *rdev)
if (mddev_is_dm(mddev))
return 0;
+ if (queue_logical_block_size(rdev->bdev->bd_disk->queue) >
+ queue_logical_block_size(mddev->gendisk->queue)) {
+ pr_err("%s: incompatible logical_block_size, can not add\n",
+ mdname(mddev));
+ return -EINVAL;
+ }
+
lim = queue_limits_start_update(mddev->gendisk->queue);
queue_limits_stack_bdev(&lim, rdev->bdev, rdev->data_offset,
mddev->gendisk->disk_name);
Kind regards,
Paul
.
--
Thanks,
Nan