On Wed, May 01, 2024 at 03:13:15PM GMT, Alexander Klimov wrote:
> Oh, I didn't init them first with bioctl.
Init and assemble/attach is the same command.
> And I neither even involved two devices.
> I, literally,
>
> - created one fresh RAID partition with disklabel -E
> - ran ./bioctl -c 1 -l vnd0a,OFFLINE softraid0
>
> Crashed SP and MP kernels, with HDD, USB stick and vndX.
> All on i386, tested on two different machines.
> (amd64 box is still at cvs -q, / is on USB stick.)
The trace in your picture:
panic: pool_put: NULL item
...
pool_put()
dma_free()
sd_get_parms()
Haven't looked at why or how, but it seems obvious this is your double-free:
sd_get_parms() {
...
buf = dma_alloc(sizeof(*buf), PR_NOWAIT);
if (buf == NULL)
goto validate;
...
validate:
if (buf) {
dma_free(buf, sizeof(*buf));
buf = NULL;
}
if (dp.disksize == 0)
goto die;
...
sc->params = dp;
return 0;
die:
dma_free(buf, sizeof(*buf));
return -1;
}
It should either return -1 early or die: must check for NULL.
Does this avoid the panic?
Index: sys/scsi/sd.c
===================================================================
RCS file: /cvs/src/sys/scsi/sd.c,v
diff -u -p -r1.335 sd.c
--- sys/scsi/sd.c 10 Nov 2023 17:43:39 -0000 1.335
+++ sys/scsi/sd.c 1 May 2024 22:32:42 -0000
@@ -1771,7 +1771,7 @@ validate:
}
if (dp.disksize == 0)
- goto die;
+ return -1;
/*
* Restrict secsize values to powers of two between 512 and 64k.