Lines Matching +full:- +full:gp
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
6 * Copyright (c) 2006-2016 Maxim Sobolev <sobomax@FreeBSD.org>
62 FEATURE(geom_uzip, "GEOM read-only compressed disks support");
73 #define ABS(a) ((a) < 0 ? -(a) : (a))
108 "Debug level (0-4)");
120 BLK_IN_RANGE(cn, g_uzip_debug_block, -8)) { \
128 (intmax_t)ecn - (intmax_t)bcn)) { \
135 * Maximum allowed valid block size (to prevent foot-shooting)
145 g_uzip_softc_free(struct g_geom *gp) in g_uzip_softc_free() argument
147 struct g_uzip_softc *sc = gp->softc; in g_uzip_softc_free()
150 gp->name, sc->req_total, sc->req_cached)); in g_uzip_softc_free()
152 mtx_lock(&sc->queue_mtx); in g_uzip_softc_free()
153 sc->wrkthr_flags |= GUZ_SHUTDOWN; in g_uzip_softc_free()
155 while (!(sc->wrkthr_flags & GUZ_EXITING)) { in g_uzip_softc_free()
156 msleep(sc->procp, &sc->queue_mtx, PRIBIO, "guzfree", in g_uzip_softc_free()
159 mtx_unlock(&sc->queue_mtx); in g_uzip_softc_free()
161 sc->dcp->free(sc->dcp); in g_uzip_softc_free()
162 free(sc->toc, M_GEOM_UZIP); in g_uzip_softc_free()
163 mtx_destroy(&sc->queue_mtx); in g_uzip_softc_free()
164 mtx_destroy(&sc->last_mtx); in g_uzip_softc_free()
165 free(sc->last_buf, M_GEOM_UZIP); in g_uzip_softc_free()
167 gp->softc = NULL; in g_uzip_softc_free()
171 g_uzip_cached(struct g_geom *gp, struct bio *bp) in g_uzip_cached() argument
177 sc = gp->softc; in g_uzip_cached()
178 ofs = bp->bio_offset + bp->bio_completed; in g_uzip_cached()
179 blk = ofs / sc->blksz; in g_uzip_cached()
180 mtx_lock(&sc->last_mtx); in g_uzip_cached()
181 if (blk == sc->last_blk) { in g_uzip_cached()
182 blkofs = ofs % sc->blksz; in g_uzip_cached()
183 usz = sc->blksz - blkofs; in g_uzip_cached()
184 if (bp->bio_resid < usz) in g_uzip_cached()
185 usz = bp->bio_resid; in g_uzip_cached()
186 memcpy(bp->bio_data + bp->bio_completed, sc->last_buf + blkofs, in g_uzip_cached()
188 sc->req_cached++; in g_uzip_cached()
189 mtx_unlock(&sc->last_mtx); in g_uzip_cached()
192 "from cache\n", __func__, gp->name, bp, (intmax_t)ofs, in g_uzip_cached()
195 bp->bio_completed += usz; in g_uzip_cached()
196 bp->bio_resid -= usz; in g_uzip_cached()
198 if (bp->bio_resid == 0) { in g_uzip_cached()
203 mtx_unlock(&sc->last_mtx); in g_uzip_cached()
208 #define BLK_ENDS(sc, bi) ((sc)->toc[(bi)].offset + \
209 (sc)->toc[(bi)].blen)
211 #define BLK_IS_CONT(sc, bi) (BLK_ENDS((sc), (bi) - 1) == \
212 (sc)->toc[(bi)].offset)
213 #define BLK_IS_NIL(sc, bi) ((sc)->toc[(bi)].blen == 0)
215 #define TOFF_2_BOFF(sc, pp, bi) ((sc)->toc[(bi)].offset - \
216 (sc)->toc[(bi)].offset % (pp)->sectorsize)
217 #define TLEN_2_BLEN(sc, pp, bp, ei) roundup(BLK_ENDS((sc), (ei)) - \
218 (bp)->bio_offset, (pp)->sectorsize)
221 g_uzip_request(struct g_geom *gp, struct bio *bp) in g_uzip_request() argument
230 if (g_uzip_cached(gp, bp) != 0) in g_uzip_request()
233 sc = gp->softc; in g_uzip_request()
235 cp = LIST_FIRST(&gp->consumer); in g_uzip_request()
236 pp = cp->provider; in g_uzip_request()
238 ofs = bp->bio_offset + bp->bio_completed; in g_uzip_request()
239 start_blk = ofs / sc->blksz; in g_uzip_request()
240 KASSERT(start_blk < sc->nblocks, ("start_blk out of range")); in g_uzip_request()
241 end_blk = howmany(ofs + bp->bio_resid, sc->blksz); in g_uzip_request()
242 KASSERT(end_blk <= sc->nblocks, ("end_blk out of range")); in g_uzip_request()
246 start_blk_ofs = ofs % sc->blksz; in g_uzip_request()
247 zsize = MIN(sc->blksz - start_blk_ofs, bp->bio_resid); in g_uzip_request()
249 "filling %ju zero bytes\n", __func__, gp->name, gp, in g_uzip_request()
250 (uintmax_t)bp->bio_completed, (uintmax_t)zsize)); in g_uzip_request()
251 bzero(bp->bio_data + bp->bio_completed, zsize); in g_uzip_request()
252 bp->bio_completed += zsize; in g_uzip_request()
253 bp->bio_resid -= zsize; in g_uzip_request()
258 KASSERT(bp->bio_resid == 0, ("bp->bio_resid is invalid")); in g_uzip_request()
260 * No non-Nil data is left, complete request immediately. in g_uzip_request()
263 "bytes\n", __func__, gp->name, gp, in g_uzip_request()
264 (uintmax_t)bp->bio_completed)); in g_uzip_request()
278 "start=%u (%ju[%jd]), end=%u (%ju)\n", __func__, gp->name, bp, in g_uzip_request()
279 (u_int)start_blk, (uintmax_t)sc->toc[start_blk].offset, in g_uzip_request()
280 (intmax_t)sc->toc[start_blk].blen, in g_uzip_request()
281 (u_int)end_blk, (uintmax_t)BLK_ENDS(sc, end_blk - 1))); in g_uzip_request()
288 bp2->bio_done = g_uzip_read_done; in g_uzip_request()
290 bp2->bio_offset = TOFF_2_BOFF(sc, pp, start_blk); in g_uzip_request()
292 bp2->bio_length = TLEN_2_BLEN(sc, pp, bp2, end_blk - 1); in g_uzip_request()
293 if (bp2->bio_length <= maxphys) { in g_uzip_request()
299 end_blk--; in g_uzip_request()
302 DPRINTF(GUZ_DBG_IO, ("%s/%s: bp2->bio_length = %jd, " in g_uzip_request()
303 "bp2->bio_offset = %jd\n", __func__, gp->name, in g_uzip_request()
304 (intmax_t)bp2->bio_length, (intmax_t)bp2->bio_offset)); in g_uzip_request()
306 bp2->bio_data = malloc(bp2->bio_length, M_GEOM_UZIP, M_NOWAIT); in g_uzip_request()
307 if (bp2->bio_data == NULL) { in g_uzip_request()
314 "reading %jd bytes from offset %jd\n", __func__, gp->name, bp, in g_uzip_request()
315 (intmax_t)bp2->bio_length, (intmax_t)bp2->bio_offset)); in g_uzip_request()
325 struct g_geom *gp; in g_uzip_read_done() local
328 bp2 = bp->bio_parent; in g_uzip_read_done()
329 gp = bp2->bio_to->geom; in g_uzip_read_done()
330 sc = gp->softc; in g_uzip_read_done()
332 mtx_lock(&sc->queue_mtx); in g_uzip_read_done()
333 bioq_disksort(&sc->bio_queue, bp); in g_uzip_read_done()
334 mtx_unlock(&sc->queue_mtx); in g_uzip_read_done()
344 return (*mm == val) && memcmp(mm, mm + 1, size - 1) == 0; in g_uzip_memvcmp()
353 struct g_geom *gp; in g_uzip_do() local
359 bp2 = bp->bio_parent; in g_uzip_do()
360 gp = bp2->bio_to->geom; in g_uzip_do()
362 cp = LIST_FIRST(&gp->consumer); in g_uzip_do()
363 pp = cp->provider; in g_uzip_do()
365 bp2->bio_error = bp->bio_error; in g_uzip_do()
366 if (bp2->bio_error != 0) in g_uzip_do()
370 if (bp->bio_completed == 0) { in g_uzip_do()
371 bp2->bio_error = ECANCELED; in g_uzip_do()
375 ofs = bp2->bio_offset + bp2->bio_completed; in g_uzip_do()
376 firstblk = blk = ofs / sc->blksz; in g_uzip_do()
377 blkofs = ofs % sc->blksz; in g_uzip_do()
378 data = bp->bio_data + sc->toc[blk].offset % pp->sectorsize; in g_uzip_do()
379 data2 = bp2->bio_data + bp2->bio_completed; in g_uzip_do()
380 while (bp->bio_completed && bp2->bio_resid) { in g_uzip_do()
384 __func__, gp->name, bp2, (u_int)blk)); in g_uzip_do()
387 ulen = MIN(sc->blksz - blkofs, bp2->bio_resid); in g_uzip_do()
388 len = sc->toc[blk].blen; in g_uzip_do()
390 "data=%p, len=%u\n", __func__, gp->name, gp, in g_uzip_do()
391 bp->bio_completed, data2, (u_int)ulen, data, (u_int)len)); in g_uzip_do()
396 } else if (len <= bp->bio_completed) { in g_uzip_do()
397 mtx_lock(&sc->last_mtx); in g_uzip_do()
398 err = sc->dcp->decompress(sc->dcp, gp->name, data, in g_uzip_do()
399 len, sc->last_buf); in g_uzip_do()
400 if (err != 0 && sc->toc[blk].last != 0) { in g_uzip_do()
406 sc->toc[blk].blen = 0; in g_uzip_do()
407 sc->last_blk = -1; in g_uzip_do()
408 mtx_unlock(&sc->last_mtx); in g_uzip_do()
414 sc->last_blk = -1; in g_uzip_do()
415 mtx_unlock(&sc->last_mtx); in g_uzip_do()
416 bp2->bio_error = EILSEQ; in g_uzip_do()
419 gp->name, sc->dcp, (uintmax_t)blk, in g_uzip_do()
423 sc->last_blk = blk; in g_uzip_do()
424 memcpy(data2, sc->last_buf + blkofs, ulen); in g_uzip_do()
425 mtx_unlock(&sc->last_mtx); in g_uzip_do()
426 err = sc->dcp->rewind(sc->dcp, gp->name); in g_uzip_do()
428 bp2->bio_error = EILSEQ; in g_uzip_do()
430 "failed\n", __func__, gp->name, sc->dcp)); in g_uzip_do()
438 bp2->bio_completed += ulen; in g_uzip_do()
439 bp2->bio_resid -= ulen; in g_uzip_do()
440 bp->bio_completed -= len; in g_uzip_do()
447 free(bp->bio_data, M_GEOM_UZIP); in g_uzip_do()
449 if (bp2->bio_error != 0 || bp2->bio_resid == 0) in g_uzip_do()
450 g_io_deliver(bp2, bp2->bio_error); in g_uzip_do()
452 g_uzip_request(gp, bp2); in g_uzip_do()
459 struct g_geom *gp; in g_uzip_start() local
462 pp = bp->bio_to; in g_uzip_start()
463 gp = pp->geom; in g_uzip_start()
466 "buffer=%p\n", __func__, gp->name, bp, bp->bio_cmd, in g_uzip_start()
467 (intmax_t)bp->bio_offset, (intmax_t)bp->bio_length, bp->bio_data)); in g_uzip_start()
469 sc = gp->softc; in g_uzip_start()
470 sc->req_total++; in g_uzip_start()
472 if (bp->bio_cmd == BIO_GETATTR) { in g_uzip_start()
475 struct g_geom *gp; in g_uzip_start() local
479 if (strncmp(bp->bio_attribute, "MNT:", 4) == 0) { in g_uzip_start()
485 bp2->bio_done = g_std_done; in g_uzip_start()
486 pp = bp->bio_to; in g_uzip_start()
487 gp = pp->geom; in g_uzip_start()
488 cp = LIST_FIRST(&gp->consumer); in g_uzip_start()
493 if (bp->bio_cmd != BIO_READ) { in g_uzip_start()
498 bp->bio_resid = bp->bio_length; in g_uzip_start()
499 bp->bio_completed = 0; in g_uzip_start()
501 g_uzip_request(gp, bp); in g_uzip_start()
507 struct g_geom *gp; in g_uzip_orphan() local
511 gp = cp->geom; in g_uzip_orphan()
512 g_trace(G_T_TOPOLOGY, "%s(%p/%s)", __func__, cp, gp->name); in g_uzip_orphan()
513 g_wither_geom(gp, ENXIO); in g_uzip_orphan()
519 if ((cp->acr + cp->acw + cp->ace) == 0) in g_uzip_orphan()
520 g_uzip_softc_free(gp); in g_uzip_orphan()
527 g_trace(G_T_TOPOLOGY, "%s(%p/%s)", __func__, cp, cp->geom->name); in g_uzip_spoiled()
528 cp->flags |= G_CF_ORPHAN; in g_uzip_spoiled()
535 struct g_geom *gp; in g_uzip_access() local
539 gp = pp->geom; in g_uzip_access()
540 cp = LIST_FIRST(&gp->consumer); in g_uzip_access()
543 if (cp->acw + dw > 0) in g_uzip_access()
552 if (error == 0 && (gp->flags & G_GEOM_WITHER) != 0 && in g_uzip_access()
553 (cp->acr + cp->acw + cp->ace) == 0) in g_uzip_access()
554 g_uzip_softc_free(gp); in g_uzip_access()
561 struct g_geom *gp) in g_uzip_parse_toc() argument
568 (sc->nblocks + 1) * sizeof(uint64_t); in g_uzip_parse_toc()
569 max_offset = sc->toc[0].offset - 1; in g_uzip_parse_toc()
570 last_blk = &sc->toc[0]; in g_uzip_parse_toc()
571 for (i = 0; i < sc->nblocks; i++) { in g_uzip_parse_toc()
573 if ((sc->toc[i].offset < min_offset) || in g_uzip_parse_toc()
574 (sc->toc[i].offset > pp->mediasize)) { in g_uzip_parse_toc()
578 "offset=%ju max_offset=%ju\n", gp->name, in g_uzip_parse_toc()
579 (u_int)i, (uintmax_t)sc->toc[i].offset, in g_uzip_parse_toc()
582 if (sc->toc[i].offset < max_offset) { in g_uzip_parse_toc()
589 if (sc->toc[j].offset == sc->toc[i].offset && in g_uzip_parse_toc()
598 gp->name, i)); in g_uzip_parse_toc()
599 return (-1); in g_uzip_parse_toc()
601 sc->toc[i].blen = sc->toc[j].blen; in g_uzip_parse_toc()
604 last_blk = &sc->toc[i]; in g_uzip_parse_toc()
610 for (j = i + 1; j < sc->nblocks + 1; j++) { in g_uzip_parse_toc()
611 if (sc->toc[j].offset > max_offset) { in g_uzip_parse_toc()
615 sc->toc[i].blen = sc->toc[j].offset - in g_uzip_parse_toc()
616 sc->toc[i].offset; in g_uzip_parse_toc()
617 if (BLK_ENDS(sc, i) > pp->mediasize) { in g_uzip_parse_toc()
620 gp->name, (u_int)i, in g_uzip_parse_toc()
622 (intmax_t)pp->mediasize)); in g_uzip_parse_toc()
623 return (-1); in g_uzip_parse_toc()
625 KASSERT(max_offset <= sc->toc[i].offset, ( in g_uzip_parse_toc()
627 gp->name, (uintmax_t)max_offset)); in g_uzip_parse_toc()
628 max_offset = BLK_ENDS(sc, i) - 1; in g_uzip_parse_toc()
631 "bytes, in %u bytes", gp->name, i, sc->blksz, in g_uzip_parse_toc()
632 sc->toc[i].blen)); in g_uzip_parse_toc()
634 DPRINTF_BLK(GUZ_DBG_TOC, i, (" (->#%u)", in g_uzip_parse_toc()
639 last_blk->last = 1; in g_uzip_parse_toc()
641 for (i = 0; i < sc->nblocks; i++) { in g_uzip_parse_toc()
642 if (sc->toc[i].blen > sc->dcp->max_blen) { in g_uzip_parse_toc()
643 if (sc->toc[i].last == 0) { in g_uzip_parse_toc()
646 "max_blen (%ju)\n", gp->name, i, in g_uzip_parse_toc()
647 (uintmax_t)sc->toc[i].blen, in g_uzip_parse_toc()
648 (uintmax_t)sc->dcp->max_blen)); in g_uzip_parse_toc()
649 return (-1); in g_uzip_parse_toc()
653 gp->name, i, (uintmax_t)sc->dcp->max_blen)); in g_uzip_parse_toc()
654 sc->toc[i].blen = sc->dcp->max_blen; in g_uzip_parse_toc()
655 sc->toc[i].padded = 1; in g_uzip_parse_toc()
662 "min_offset=%ju mediasize=%jd\n", gp->name, (u_int)i, in g_uzip_parse_toc()
663 sc->toc[i].offset, min_offset, pp->mediasize)); in g_uzip_parse_toc()
664 return (-1); in g_uzip_parse_toc()
675 struct g_geom *gp; in g_uzip_taste() local
686 g_trace(G_T_TOPOLOGY, "%s(%s,%s)", __func__, mp->name, pp->name); in g_uzip_taste()
690 if (pp->acw > 0) in g_uzip_taste()
693 if ((fnmatch(g_uzip_attach_to, pp->name, 0) != 0) || in g_uzip_taste()
694 (fnmatch(g_uzip_noattach_to, pp->name, 0) == 0)) { in g_uzip_taste()
696 mp->name, pp->name)); in g_uzip_taste()
705 gp = g_new_geomf(mp, GUZ_DEV_NAME("%s"), pp->name); in g_uzip_taste()
706 cp = g_new_consumer(gp); in g_uzip_taste()
720 gp->name, pp->sectorsize, (intmax_t)pp->mediasize)); in g_uzip_taste()
721 buf = g_read_data(cp, 0, pp->sectorsize, NULL); in g_uzip_taste()
725 if (strncmp(header->magic, CLOOP_MAGIC_START, in g_uzip_taste()
726 sizeof(CLOOP_MAGIC_START) - 1) != 0) { in g_uzip_taste()
727 DPRINTF(GUZ_DBG_ERR, ("%s: no CLOOP magic\n", gp->name)); in g_uzip_taste()
731 cloop_version = header->magic[CLOOP_OFS_VERSN]; in g_uzip_taste()
732 switch (header->magic[CLOOP_OFS_COMPR]) { in g_uzip_taste()
738 gp->name)); in g_uzip_taste()
742 gp->name)); in g_uzip_taste()
749 gp->name)); in g_uzip_taste()
753 gp->name)); in g_uzip_taste()
759 gp->name)); in g_uzip_taste()
764 gp->name)); in g_uzip_taste()
769 gp->name)); in g_uzip_taste()
775 gp->name)); in g_uzip_taste()
783 gp->softc = sc; in g_uzip_taste()
784 sc->blksz = ntohl(header->blksz); in g_uzip_taste()
785 sc->nblocks = ntohl(header->nblocks); in g_uzip_taste()
786 if (sc->blksz % 512 != 0) { in g_uzip_taste()
788 gp->name, sc->blksz); in g_uzip_taste()
791 if (sc->blksz > MAX_BLKSZ) { in g_uzip_taste()
793 gp->name, sc->blksz, MAX_BLKSZ); in g_uzip_taste()
795 total_offsets = sc->nblocks + 1; in g_uzip_taste()
797 total_offsets * sizeof(uint64_t) > pp->mediasize) { in g_uzip_taste()
799 gp->name, sc->nblocks); in g_uzip_taste()
802 sc->toc = malloc(total_offsets * sizeof(struct g_uzip_blk), in g_uzip_taste()
805 (pp->sectorsize - sizeof(*header)) / sizeof(uint64_t)); in g_uzip_taste()
807 sc->toc[i].offset = be64toh(((uint64_t *) (header + 1))[i]); in g_uzip_taste()
808 sc->toc[i].blen = BLEN_UNDEF; in g_uzip_taste()
811 gp->name, offsets_read)); in g_uzip_taste()
824 cp, blk * pp->sectorsize, pp->sectorsize, NULL); in g_uzip_taste()
827 nread = MIN(total_offsets - offsets_read, in g_uzip_taste()
828 pp->sectorsize / sizeof(uint64_t)); in g_uzip_taste()
830 gp->name, nread, blk)); in g_uzip_taste()
832 sc->toc[offsets_read + i].offset = in g_uzip_taste()
834 sc->toc[offsets_read + i].blen = BLEN_UNDEF; in g_uzip_taste()
840 offsets_read -= 1; in g_uzip_taste()
842 "sectors\n", gp->name, offsets_read, blk)); in g_uzip_taste()
843 if (sc->nblocks != offsets_read) { in g_uzip_taste()
845 "blocks\n", gp->name, in g_uzip_taste()
846 sc->nblocks < offsets_read ? "more" : "less")); in g_uzip_taste()
852 sc->dcp = g_uzip_zlib_ctor(sc->blksz); in g_uzip_taste()
855 sc->dcp = g_uzip_lzma_ctor(sc->blksz); in g_uzip_taste()
859 sc->dcp = g_uzip_zstd_ctor(sc->blksz); in g_uzip_taste()
874 sc->toc[sc->nblocks].offset != 0) { in g_uzip_taste()
875 if (sc->toc[sc->nblocks].offset > pp->mediasize) { in g_uzip_taste()
878 gp->name, (uintmax_t)sc->toc[sc->nblocks].offset, in g_uzip_taste()
879 (uintmax_t)pp->mediasize)); in g_uzip_taste()
883 sc->toc[sc->nblocks].offset = pp->mediasize; in g_uzip_taste()
886 if (g_uzip_parse_toc(sc, pp, gp) != 0) { in g_uzip_taste()
887 DPRINTF(GUZ_DBG_ERR, ("%s: TOC error\n", gp->name)); in g_uzip_taste()
890 mtx_init(&sc->last_mtx, "geom_uzip cache", NULL, MTX_DEF); in g_uzip_taste()
891 mtx_init(&sc->queue_mtx, "geom_uzip wrkthread", NULL, MTX_DEF); in g_uzip_taste()
892 bioq_init(&sc->bio_queue); in g_uzip_taste()
893 sc->last_blk = -1; in g_uzip_taste()
894 sc->last_buf = malloc(sc->blksz, M_GEOM_UZIP, M_WAITOK); in g_uzip_taste()
895 sc->req_total = 0; in g_uzip_taste()
896 sc->req_cached = 0; in g_uzip_taste()
898 sc->uzip_do = &g_uzip_do; in g_uzip_taste()
900 error = kproc_create(g_uzip_wrkthr, sc, &sc->procp, 0, 0, "%s", in g_uzip_taste()
901 gp->name); in g_uzip_taste()
907 pp2 = g_new_providerf(gp, "%s", gp->name); in g_uzip_taste()
908 pp2->sectorsize = 512; in g_uzip_taste()
909 pp2->mediasize = (off_t)sc->nblocks * sc->blksz; in g_uzip_taste()
910 pp2->stripesize = pp->stripesize; in g_uzip_taste()
911 pp2->stripeoffset = pp->stripeoffset; in g_uzip_taste()
912 LIST_FOREACH(gap, &pp->aliases, ga_next) in g_uzip_taste()
913 g_provider_add_alias(pp2, GUZ_DEV_NAME("%s"), gap->ga_alias); in g_uzip_taste()
915 g_access(cp, -1, 0, 0); in g_uzip_taste()
918 gp->name, pp2->sectorsize, (uintmax_t)pp2->mediasize, in g_uzip_taste()
919 (uintmax_t)pp2->stripeoffset, (uintmax_t)pp2->stripesize, pp2->flags)); in g_uzip_taste()
920 DPRINTF(GUZ_DBG_INFO, ("%s: %u x %u blocks\n", gp->name, sc->nblocks, in g_uzip_taste()
921 sc->blksz)); in g_uzip_taste()
922 return (gp); in g_uzip_taste()
925 free(sc->last_buf, M_GEOM); in g_uzip_taste()
926 mtx_destroy(&sc->queue_mtx); in g_uzip_taste()
927 mtx_destroy(&sc->last_mtx); in g_uzip_taste()
929 sc->dcp->free(sc->dcp); in g_uzip_taste()
931 free(sc->toc, M_GEOM); in g_uzip_taste()
933 free(gp->softc, M_GEOM_UZIP); in g_uzip_taste()
940 g_access(cp, -1, 0, 0); in g_uzip_taste()
945 g_destroy_geom(gp); in g_uzip_taste()
951 g_uzip_destroy_geom(struct gctl_req *req, struct g_class *mp, struct g_geom *gp) in g_uzip_destroy_geom() argument
955 KASSERT(gp != NULL, ("NULL geom")); in g_uzip_destroy_geom()
956 g_trace(G_T_TOPOLOGY, "%s(%s, %s)", __func__, mp->name, gp->name); in g_uzip_destroy_geom()
959 if (gp->softc == NULL) { in g_uzip_destroy_geom()
960 DPRINTF(GUZ_DBG_ERR, ("%s(%s): gp->softc == NULL\n", __func__, in g_uzip_destroy_geom()
961 gp->name)); in g_uzip_destroy_geom()
965 pp = LIST_FIRST(&gp->provider); in g_uzip_destroy_geom()
967 if (pp->acr > 0 || pp->acw > 0 || pp->ace > 0) in g_uzip_destroy_geom()
970 g_wither_geom(gp, ENXIO); in g_uzip_destroy_geom()
971 g_uzip_softc_free(gp); in g_uzip_destroy_geom()