Hello again!
On Sat, Dec 21, 2024 at 16:58:59 +0000, Alan Mackenzie wrote:
> Hello, Karl.
> On Sat, Dec 21, 2024 at 17:45:13 +0100, [email protected] wrote:
> > Alan Mackenzie:
> > ...
> > > I've now got working code which assembles a metadata 1.2 RAID array at
> > > boot time. The syntax needed on the command line is, again,
> > > md=124,1.2,/dev/nvme0n1p6,/dev/nvme1n1p6
> > > .. In place of 1.2 can be any of 0.90, 1.0, 1.1, though I haven't tested
> > > it with anything but 1.2 as yet.
> > ...
> > Fun! Which kernel, can you send a patch ?
> 6.6.62. Patch enclosed. It should apply cleanly from the directory
> ..../drivers/md.
There was an error in yesterday's patch. For some reason I can't
fathom, I'd started a loop with
for (i = 1; ....)
in place of the correct
for (i = 0; ....)
.. The consequence was that the driver would not recognise "0.90" when
given explicitly in the kernel command line, for example as
md=126,0.90,/dev/nvme0n1p4,/dev/nvme1n1p4
.. Please use the enclosed patch in place of that patch from yesterday.
Thanks!
> Have fun!
> > Regards,
> > /Karl Hammar
--
Alan Mackenzie (Nuremberg, Germany).
diff --git a/drivers/md/md-autodetect.c b/drivers/md/md-autodetect.c
index b2a00f213c2c..6bd6e9177969 100644
--- a/drivers/md/md-autodetect.c
+++ b/drivers/md/md-autodetect.c
@@ -124,6 +124,17 @@ static void __init md_setup_drive(struct md_setup_args
*args)
struct mddev *mddev;
int err = 0, i;
char name[16];
+ int major_version = 0, minor_version = 90;
+ char *pp;
+ static struct {
+ char *metadata;
+ int major_version;
+ int minor_version;
+ } metadata_table[] =
+ {{"0.90", 0, 90},
+ {"1.0", 1, 0},
+ {"1.1", 1, 1},
+ {"1.2", 1, 2}};
if (args->partitioned) {
mdev = MKDEV(mdp_major, args->minor << MdpMinorShift);
@@ -133,6 +144,21 @@ static void __init md_setup_drive(struct md_setup_args
*args)
sprintf(name, "md%d", args->minor);
}
+ pp = strchr(devname, ',');
+ if (pp)
+ {
+ *pp = 0;
+ for (i = 0; i < ARRAY_SIZE(metadata_table); i++)
+ if (!strcmp(devname, metadata_table[i].metadata))
+ {
+ major_version = metadata_table[i].major_version;
+ minor_version = metadata_table[i].minor_version;
+ devname = pp + 1;
+ break;
+ }
+ *pp = ',';
+ }
+
for (i = 0; i < MD_SB_DISKS && devname != NULL; i++) {
struct kstat stat;
char *p;
@@ -183,6 +209,8 @@ static void __init md_setup_drive(struct md_setup_args
*args)
goto out_unlock;
}
+ ainfo.major_version = major_version;
+ ainfo.minor_version = minor_version;
if (args->level != LEVEL_NONE) {
/* non-persistent */
ainfo.level = args->level;