Hi, The SLIST_REMOVE within a SLIST_FOREACH loop without SAFE looks scary. The old code removed the entries from the root link ony by one. This can be done in a single step.
Replace some manual loops with SLIST macros and remove unnecessary code. I am running this with softraid crypto, could someone with raid 0 or 1 try it? ok? bluhm Index: dev/softraid.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/dev/softraid.c,v retrieving revision 1.350 diff -u -p -r1.350 softraid.c --- dev/softraid.c 14 Mar 2015 03:38:46 -0000 1.350 +++ dev/softraid.c 28 Mar 2015 10:30:55 -0000 @@ -263,8 +263,7 @@ sr_meta_attach(struct sr_discipline *sd, goto bad; /* Force chunks into correct order now that metadata is attached. */ - SLIST_FOREACH(ch_entry, cl, src_link) - SLIST_REMOVE(cl, ch_entry, sr_chunk, src_link); + SLIST_INIT(cl); for (i = 0; i < chunk_no; i++) { ch_entry = sd->sd_vol.sv_chunks[i]; chunk2 = NULL; @@ -1137,7 +1136,7 @@ sr_boot_assembly(struct sr_softc *sc) struct sr_boot_volume_head bvh; struct sr_boot_chunk_head bch, kdh; struct sr_boot_volume *bv, *bv1, *bv2; - struct sr_boot_chunk *bc, *bcnext, *bc1, *bc2; + struct sr_boot_chunk *bc, *bc1, *bc2; struct sr_disk_head sdklist; struct sr_disk *sdk; struct disk *dk; @@ -1201,10 +1200,9 @@ sr_boot_assembly(struct sr_softc *sc) /* * Create a list of volumes and associate chunks with each volume. */ - for (bc = SLIST_FIRST(&bch); bc != NULL; bc = bcnext) { - - bcnext = SLIST_NEXT(bc, sbc_link); - SLIST_REMOVE(&bch, bc, sr_boot_chunk, sbc_link); + while (!SLIST_EMPTY(&bch)) { + bc = SLIST_FIRST(&bch); + SLIST_REMOVE_HEAD(&bch, sbc_link); bc->sbc_chunk_id = bc->sbc_metadata->ssdi.ssd_chunk_id; /* Handle key disks separately. */ @@ -1456,11 +1454,8 @@ sr_boot_assembly(struct sr_softc *sc) /* done with metadata */ unwind: /* Free boot volumes and associated chunks. */ - for (bv1 = SLIST_FIRST(&bvh); bv1 != NULL; bv1 = bv2) { - bv2 = SLIST_NEXT(bv1, sbv_link); - for (bc1 = SLIST_FIRST(&bv1->sbv_chunks); bc1 != NULL; - bc1 = bc2) { - bc2 = SLIST_NEXT(bc1, sbc_link); + SLIST_FOREACH_SAFE(bv1, &bvh, sbv_link, bv2) { + SLIST_FOREACH_SAFE(bc1, &bv1->sbv_chunks, sbc_link, bc2) { if (bc1->sbc_metadata) free(bc1->sbc_metadata, M_DEVBUF, 0); free(bc1, M_DEVBUF, 0); @@ -1468,15 +1463,13 @@ unwind: free(bv1, M_DEVBUF, 0); } /* Free keydisks chunks. */ - for (bc1 = SLIST_FIRST(&kdh); bc1 != NULL; bc1 = bc2) { - bc2 = SLIST_NEXT(bc1, sbc_link); + SLIST_FOREACH_SAFE(bc1, &kdh, sbc_link, bc2) { if (bc1->sbc_metadata) free(bc1->sbc_metadata, M_DEVBUF, 0); free(bc1, M_DEVBUF, 0); } /* Free unallocated chunks. */ - for (bc1 = SLIST_FIRST(&bch); bc1 != NULL; bc1 = bc2) { - bc2 = SLIST_NEXT(bc1, sbc_link); + SLIST_FOREACH_SAFE(bc1, &bch, sbc_link, bc2) { if (bc1->sbc_metadata) free(bc1->sbc_metadata, M_DEVBUF, 0); free(bc1, M_DEVBUF, 0); @@ -1662,10 +1655,7 @@ sr_meta_native_attach(struct sr_discipli /* mixed metadata versions; mark bad disks offline */ if (old_meta) { d = 0; - for (ch_entry = SLIST_FIRST(cl); ch_entry != NULL; - ch_entry = ch_next, d++) { - ch_next = SLIST_NEXT(ch_entry, src_link); - + SLIST_FOREACH_SAFE(ch_entry, cl, src_link, ch_next) { /* XXX do we want to read this again? */ if (ch_entry->src_dev_mm == NODEV) panic("src_dev_mm == NODEV"); @@ -1675,6 +1665,7 @@ sr_meta_native_attach(struct sr_discipli if (md->ssd_ondisk != version) sd->sd_vol.sv_chunks[d]->src_meta.scm_status = BIOC_SDOFFLINE; + d++; } } @@ -1751,8 +1742,6 @@ sr_hotplug_unregister(struct sr_discipli SLIST_REMOVE(&sr_hotplug_callbacks, mhe, sr_hotplug_list, shl_link); free(mhe, M_DEVBUF, 0); - if (SLIST_EMPTY(&sr_hotplug_callbacks)) - SLIST_INIT(&sr_hotplug_callbacks); return; } } @@ -3769,9 +3758,7 @@ sr_chunks_unwind(struct sr_softc *sc, st if (!cl) return; - for (ch_entry = SLIST_FIRST(cl); ch_entry != NULL; ch_entry = ch_next) { - ch_next = SLIST_NEXT(ch_entry, src_link); - + SLIST_FOREACH_SAFE(ch_entry, cl, src_link, ch_next) { DNPRINTF(SR_D_IOCTL, "%s: sr_chunks_unwind closing: %s\n", DEVNAME(sc), ch_entry->src_devname); if (ch_entry->src_vn) { @@ -3796,7 +3783,6 @@ sr_discipline_free(struct sr_discipline { struct sr_softc *sc; struct sr_discipline *sdtmp1, *sdtmp2; - struct sr_meta_opt_head *som; struct sr_meta_opt_item *omi, *omi_next; if (!sd) @@ -3816,9 +3802,7 @@ sr_discipline_free(struct sr_discipline if (sd->sd_meta_foreign) free(sd->sd_meta_foreign, M_DEVBUF, 0); - som = &sd->sd_meta_opt; - for (omi = SLIST_FIRST(som); omi != NULL; omi = omi_next) { - omi_next = SLIST_NEXT(omi, omi_link); + SLIST_FOREACH_SAFE(omi, &sd->sd_meta_opt, omi_link, omi_next) { if (omi->omi_som) free(omi->omi_som, M_DEVBUF, 0); free(omi, M_DEVBUF, 0); Index: dev/softraid_crypto.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/dev/softraid_crypto.c,v retrieving revision 1.117 diff -u -p -r1.117 softraid_crypto.c --- dev/softraid_crypto.c 14 Mar 2015 03:38:46 -0000 1.117 +++ dev/softraid_crypto.c 28 Mar 2015 10:30:55 -0000 @@ -879,8 +879,7 @@ sr_crypto_read_key_disk(struct sr_discip open = 0; done: - for (omi = SLIST_FIRST(&som); omi != NULL; omi = omi_next) { - omi_next = SLIST_NEXT(omi, omi_link); + SLIST_FOREACH_SAFE(omi, &som, omi_link, omi_next) { if (omi->omi_som) free(omi->omi_som, M_DEVBUF, 0); free(omi, M_DEVBUF, 0);