On Sun, Jun 07, 2020 at 12:42:57AM +1000, Joel Sing wrote:
> While this works, you would be better off making use of the error
> reporting mechanism that exists. A compile tested only diff for
> the kernel side is below. A diff to installboot would be needed to
> graft some code similar to that in bioctl's bio_status() function.
Thanks, I didn't even look how bioctl(8) does it; that seems better.
The complete diff for softraid(4), <dev/biovar.h> and installboot(8)
makes sparc64 look like this:
# ./obj/installboot -v sd2 /usr/mdec/bootblk /ofwboot.big
Using / as root
installing bootstrap on /dev/rsd2c
using first-stage /usr/mdec/bootblk, second-stage /ofwboot.big
boot block is 6882 bytes (14 blocks @ 512 bytes = 7168 bytes)
sd2: softraid volume with 1 disk(s)
sd2: installing boot loader on softraid volume
installboot: boot loader too large (272452 > 163840)
# echo $?
1
I ommitted "is" from the kernel message to stay in line with other
"too large" ones in softraid.c.
Contrary to bioctl's bio_status(), installboot's new sr_status() uses
warnx(3) for simplicity and put warnings on stderr (where they belong).
Feedback? OK?
Index: sys/dev/biovar.h
===================================================================
RCS file: /cvs/src/sys/dev/biovar.h,v
retrieving revision 1.45
diff -u -p -r1.45 biovar.h
--- sys/dev/biovar.h 14 Aug 2016 04:08:03 -0000 1.45
+++ sys/dev/biovar.h 7 Jun 2020 11:55:15 -0000
@@ -26,6 +26,9 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#ifndef BIOVAR_H
+#define BIOVAR_H
+
/*
* Devices getting ioctls through this interface should use ioctl class 'B'
* and command numbers starting from 32, lower ones are reserved for generic
@@ -305,3 +308,5 @@ void bio_info(struct bio_status *, int,
void bio_warn(struct bio_status *, int, const char *, ...);
void bio_error(struct bio_status *, int, const char *, ...);
#endif
+
+#endif /* BIOVAR_H */
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 7 Jun 2020 11:20:05 -0000
@@ -3704,11 +3704,17 @@ sr_ioctl_installboot(struct sr_softc *sc
goto done;
}
- if (bb->bb_bootblk_size > SR_BOOT_BLOCKS_SIZE * DEV_BSIZE)
+ if (bb->bb_bootblk_size > SR_BOOT_BLOCKS_SIZE * DEV_BSIZE) {
+ sr_error(sc, "boot block is too large (%d > %d)",
+ bb->bb_bootblk_size, SR_BOOT_BLOCKS_SIZE * DEV_BSIZE);
goto done;
+ }
- if (bb->bb_bootldr_size > SR_BOOT_LOADER_SIZE * DEV_BSIZE)
+ if (bb->bb_bootldr_size > SR_BOOT_LOADER_SIZE * DEV_BSIZE) {
+ sr_error(sc, "boot loader is too large (%d > %d)",
+ bb->bb_bootldr_size, SR_BOOT_LOADER_SIZE * DEV_BSIZE);
goto done;
+ }
secsize = sd->sd_meta->ssdi.ssd_secsize;
Index: usr.sbin/installboot/i386_softraid.c
===================================================================
RCS file: /cvs/src/usr.sbin/installboot/i386_softraid.c,v
retrieving revision 1.15
diff -u -p -r1.15 i386_softraid.c
--- usr.sbin/installboot/i386_softraid.c 9 Mar 2020 06:16:56 -0000
1.15
+++ usr.sbin/installboot/i386_softraid.c 7 Jun 2020 12:31:20 -0000
@@ -178,6 +178,7 @@ sr_install_bootldr(int devfd, char *dev)
"softraid volume\n", dev);
if (ioctl(devfd, BIOCINSTALLBOOT, &bb) == -1)
errx(1, "softraid installboot failed");
+ sr_status(&bb.bb_bio.bio_status);
}
/*
Index: usr.sbin/installboot/installboot.h
===================================================================
RCS file: /cvs/src/usr.sbin/installboot/installboot.h,v
retrieving revision 1.11
diff -u -p -r1.11 installboot.h
--- usr.sbin/installboot/installboot.h 1 Sep 2018 16:55:29 -0000 1.11
+++ usr.sbin/installboot/installboot.h 7 Jun 2020 11:46:52 -0000
@@ -15,6 +15,8 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+#include <dev/biovar.h>
+
#include <stdlib.h>
extern int nowrite;
@@ -41,4 +43,5 @@ void md_installboot(int, char *);
void sr_installboot(int, char *);
void sr_install_bootblk(int, int, int);
void sr_install_bootldr(int, char *);
+void sr_status(struct bio_status *);
#endif
Index: usr.sbin/installboot/softraid.c
===================================================================
RCS file: /cvs/src/usr.sbin/installboot/softraid.c,v
retrieving revision 1.4
diff -u -p -r1.4 softraid.c
--- usr.sbin/installboot/softraid.c 3 Oct 2015 16:56:52 -0000 1.4
+++ usr.sbin/installboot/softraid.c 7 Jun 2020 13:04:24 -0000
@@ -92,3 +92,19 @@ sr_volume(int devfd, char *dev, int *vol
return 1;
}
+
+void
+sr_status(struct bio_status *bs)
+{
+ int i;
+
+ for (i = 0; i < bs->bs_msg_count; i++)
+ warnx("%s", bs->bs_msgs[i].bm_msg);
+
+ if (bs->bs_status == BIO_STATUS_ERROR) {
+ if (bs->bs_msg_count == 0)
+ errx(1, "unknown error");
+ else
+ exit(1);
+ }
+}
Index: usr.sbin/installboot/sparc64_softraid.c
===================================================================
RCS file: /cvs/src/usr.sbin/installboot/sparc64_softraid.c,v
retrieving revision 1.4
diff -u -p -r1.4 sparc64_softraid.c
--- usr.sbin/installboot/sparc64_softraid.c 28 Jun 2019 13:32:48 -0000
1.4
+++ usr.sbin/installboot/sparc64_softraid.c 7 Jun 2020 12:31:18 -0000
@@ -97,5 +97,6 @@ sr_install_bootldr(int devfd, char *dev)
"softraid volume\n", dev);
if (ioctl(devfd, BIOCINSTALLBOOT, &bb) == -1)
errx(1, "softraid installboot failed");
+ sr_status(&bb.bb_bio.bio_status);
}
}