Hello,

I couldn't but notice that the requirements on softraid level 1 in
base OpenBSD are actually lower than what the current user interface
returns.

The proposed patch does two things :
 - It relaxes the check for number of chunks for raid level 1 in the kernel
 - it allows building a level 1 array with only one disk.

This patch allows for the following workflow :
 - Install OpenBSD on one disk
 - format another disk as a single chunk RAID1
 - copy the OpenBSD installation on the RAID1 disk
 - check that you can boot on RAID1
 - boot on bsd.rd and copy the single chunk RAID1 disk to the OpenBSD disk
 - reassemble the RAID1 with two disks

It also allows reassembling a RAID1 array with a different number of
chunks, which is terribly useful I think.

-----------------------------

Index: sbin/bioctl/bioctl.c
===================================================================
RCS file: /cvs/src/sbin/bioctl/bioctl.c,v
retrieving revision 1.144
diff -u -p -r1.144 bioctl.c
--- sbin/bioctl/bioctl.c        25 Apr 2020 14:37:43 -0000      1.144
+++ sbin/bioctl/bioctl.c        21 Sep 2020 16:38:41 -0000
@@ -841,7 +841,7 @@ bio_createraid(u_int16_t level, char *de
                min_disks = 2;
                break;
        case 1:
-               min_disks = 2;
+               min_disks = 1;
                break;
        case 5:
                min_disks = 3;
Index: sys/dev/softraid.c
===================================================================
RCS file: /cvs/src/sys/dev/softraid.c,v
retrieving revision 1.401
diff -u -p -r1.401 softraid.c
--- sys/dev/softraid.c  14 Apr 2020 07:38:21 -0000      1.401
+++ sys/dev/softraid.c  21 Sep 2020 16:38:42 -0000
@@ -3413,7 +3413,7 @@ sr_ioctl_createraid(struct sr_softc *sc,
        } else {

                /* Ensure we are assembling the correct # of chunks. */
-               if (sd->sd_meta->ssdi.ssd_chunk_no != no_chunk) {
+               if (bc->bc_level != 1 &&
sd->sd_meta->ssdi.ssd_chunk_no != no_chunk) {
                        sr_error(sc, "volume chunk count does not
match metadata "
                            "chunk count");
                        goto unwind;
Index: sys/dev/softraid_raid1.c
===================================================================
RCS file: /cvs/src/sys/dev/softraid_raid1.c,v
retrieving revision 1.65
diff -u -p -r1.65 softraid_raid1.c
--- sys/dev/softraid_raid1.c    12 Apr 2016 16:26:54 -0000      1.65
+++ sys/dev/softraid_raid1.c    21 Sep 2020 16:38:42 -0000
@@ -76,8 +76,8 @@ int
 sr_raid1_create(struct sr_discipline *sd, struct bioc_createraid *bc,
     int no_chunk, int64_t coerced_size)
 {
-       if (no_chunk < 2) {
-               sr_error(sd->sd_sc, "%s requires two or more chunks",
+       if (no_chunk < 1) {
+               sr_error(sd->sd_sc, "%s requires one or more chunks",
                    sd->sd_name);
                return EINVAL;
        }


-- 
 Thomas de Grivel
 kmx.io
Index: sbin/bioctl/bioctl.c
===================================================================
RCS file: /cvs/src/sbin/bioctl/bioctl.c,v
retrieving revision 1.144
diff -u -p -r1.144 bioctl.c
--- sbin/bioctl/bioctl.c	25 Apr 2020 14:37:43 -0000	1.144
+++ sbin/bioctl/bioctl.c	21 Sep 2020 16:38:41 -0000
@@ -841,7 +841,7 @@ bio_createraid(u_int16_t level, char *de
 		min_disks = 2;
 		break;
 	case 1:
-		min_disks = 2;
+		min_disks = 1;
 		break;
 	case 5:
 		min_disks = 3;
Index: sys/dev/softraid.c
===================================================================
RCS file: /cvs/src/sys/dev/softraid.c,v
retrieving revision 1.401
diff -u -p -r1.401 softraid.c
--- sys/dev/softraid.c	14 Apr 2020 07:38:21 -0000	1.401
+++ sys/dev/softraid.c	21 Sep 2020 16:38:42 -0000
@@ -3413,7 +3413,7 @@ sr_ioctl_createraid(struct sr_softc *sc,
 	} else {
 
 		/* Ensure we are assembling the correct # of chunks. */
-		if (sd->sd_meta->ssdi.ssd_chunk_no != no_chunk) {
+		if (bc->bc_level != 1 && sd->sd_meta->ssdi.ssd_chunk_no != no_chunk) {
 			sr_error(sc, "volume chunk count does not match metadata "
 			    "chunk count");
 			goto unwind;
Index: sys/dev/softraid_raid1.c
===================================================================
RCS file: /cvs/src/sys/dev/softraid_raid1.c,v
retrieving revision 1.65
diff -u -p -r1.65 softraid_raid1.c
--- sys/dev/softraid_raid1.c	12 Apr 2016 16:26:54 -0000	1.65
+++ sys/dev/softraid_raid1.c	21 Sep 2020 16:38:42 -0000
@@ -76,8 +76,8 @@ int
 sr_raid1_create(struct sr_discipline *sd, struct bioc_createraid *bc,
     int no_chunk, int64_t coerced_size)
 {
-	if (no_chunk < 2) {
-		sr_error(sd->sd_sc, "%s requires two or more chunks",
+	if (no_chunk < 1) {
+		sr_error(sd->sd_sc, "%s requires one or more chunks",
 		    sd->sd_name);
 		return EINVAL;
 	}

Reply via email to