[RFC PATCH v2 2/4] md: pass struct mdu_disk_info64 to md_add_new_disk()

From: Abd-Alrhman Masalkhi

Date: Thu Oct 01 2026 - 09:26:41 EST


The md control device passes disk information as struct mdu_disk_info64.
Make md_add_new_disk() take this structure, so that the control device
and the old ADD_NEW_DISK ioctl can share it.

The ADD_NEW_DISK ioctl converts its mdu_disk_info_t with the new helper
convert_to_disk_info64(), and md_setup_drive() uses a struct
mdu_disk_info64 directly.

No functional change.

Signed-off-by: Abd-Alrhman Masalkhi <abd.masalkhi@xxxxxxxxx>
---
drivers/md/md-autodetect.c | 2 +-
drivers/md/md.c | 26 +++++++++++++++++++++-----
drivers/md/md.h | 4 ++--
3 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/drivers/md/md-autodetect.c b/drivers/md/md-autodetect.c
index 4b80165afd23..9ba061f1a628 100644
--- a/drivers/md/md-autodetect.c
+++ b/drivers/md/md-autodetect.c
@@ -201,7 +201,7 @@ static void __init md_setup_drive(struct md_setup_args *args)
err = md_set_array_info(mddev, &ainfo);

for (i = 0; i <= MD_SB_DISKS && devices[i]; i++) {
- struct mdu_disk_info_s dinfo = {
+ struct mdu_disk_info64 dinfo = {
.major = MAJOR(devices[i]),
.minor = MINOR(devices[i]),
};
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 154ee5a65cb7..be1634ae1d09 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -7486,7 +7486,7 @@ static int get_disk_info(struct mddev *mddev, void __user * arg)
return 0;
}

-int md_add_new_disk(struct mddev *mddev, struct mdu_disk_info_s *info)
+int md_add_new_disk(struct mddev *mddev, struct mdu_disk_info64 *info)
{
struct md_rdev *rdev;
dev_t dev = MKDEV(info->major,info->minor);
@@ -8305,6 +8305,16 @@ static bool md_ioctl_need_suspend(unsigned int cmd)
}
}

+static void convert_to_disk_info64(struct mdu_disk_info64 *info64,
+ mdu_disk_info_t *info)
+{
+ info64->number = info->number;
+ info64->major = info->major;
+ info64->minor = info->minor;
+ info64->raid_disk = info->raid_disk;
+ info64->state = info->state;
+}
+
static int __md_set_array_info(struct mddev *mddev, void __user *argp)
{
mdu_array_info_t info;
@@ -8452,13 +8462,16 @@ static int md_ioctl(struct block_device *bdev, blk_mode_t mode,
*/
if (mddev->pers) {
mdu_disk_info_t info;
+ struct mdu_disk_info64 info64 = {0};
if (copy_from_user(&info, argp, sizeof(info)))
err = -EFAULT;
else if (!(info.state & (1<<MD_DISK_SYNC)))
/* Need to clear read-only for this */
break;
- else
- err = md_add_new_disk(mddev, &info);
+ else {
+ convert_to_disk_info64(&info64, &info);
+ err = md_add_new_disk(mddev, &info64);
+ }
goto unlock;
}
break;
@@ -8493,10 +8506,13 @@ static int md_ioctl(struct block_device *bdev, blk_mode_t mode,
case ADD_NEW_DISK:
{
mdu_disk_info_t info;
+ struct mdu_disk_info64 info64 = {0};
if (copy_from_user(&info, argp, sizeof(info)))
err = -EFAULT;
- else
- err = md_add_new_disk(mddev, &info);
+ else {
+ convert_to_disk_info64(&info64, &info);
+ err = md_add_new_disk(mddev, &info64);
+ }
goto unlock;
}

diff --git a/drivers/md/md.h b/drivers/md/md.h
index 6440da292105..a84c8b97fa2c 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -1043,12 +1043,12 @@ static inline void mddev_unlock_and_resume(struct mddev *mddev)
}

struct mdu_array_info_s;
-struct mdu_disk_info_s;
+struct mdu_disk_info64;

extern int mdp_major;
void md_autostart_arrays(int part);
int md_set_array_info(struct mddev *mddev, struct mdu_array_info_s *info);
-int md_add_new_disk(struct mddev *mddev, struct mdu_disk_info_s *info);
+int md_add_new_disk(struct mddev *mddev, struct mdu_disk_info64 *info);
int do_md_run(struct mddev *mddev);
#define MDDEV_STACK_INTEGRITY (1u << 0)
int mddev_stack_rdev_limits(struct mddev *mddev, struct queue_limits *lim,
--
2.43.0