Lines Matching refs:wip
84 static void g_union_doio(struct g_union_wip *wip);
800 struct g_union_wip *wip; in g_union_start() local
805 wip = g_malloc(sizeof(*wip), M_NOWAIT); in g_union_start()
806 if (wip == NULL) { in g_union_start()
810 TAILQ_INIT(&wip->wip_waiting); in g_union_start()
811 wip->wip_bp = bp; in g_union_start()
812 wip->wip_sc = sc; in g_union_start()
813 wip->wip_start = bp->bio_offset + sc->sc_offset; in g_union_start()
814 wip->wip_end = wip->wip_start + bp->bio_length - 1; in g_union_start()
815 wip->wip_numios = 1; in g_union_start()
816 wip->wip_error = 0; in g_union_start()
817 g_union_doio(wip); in g_union_start()
879 g_union_doio(struct g_union_wip *wip) in g_union_doio() argument
903 sc = wip->wip_sc; in g_union_doio()
906 if (wip->wip_end < activewip->wip_start || in g_union_doio()
907 wip->wip_start > activewip->wip_end) in g_union_doio()
910 if (wip->wip_bp->bio_cmd == BIO_WRITE) in g_union_doio()
924 TAILQ_INSERT_TAIL(&activewip->wip_waiting, wip, in g_union_doio()
931 TAILQ_INSERT_TAIL(&sc->sc_wiplist, wip, wip_next); in g_union_doio()
936 cbp = g_clone_bio(wip->wip_bp); in g_union_doio()
938 TAILQ_REMOVE(&sc->sc_wiplist, wip, wip_next); in g_union_doio()
940 KASSERT(TAILQ_FIRST(&wip->wip_waiting) == NULL, in g_union_doio()
942 g_io_deliver(wip->wip_bp, ENOMEM); in g_union_doio()
943 g_free(wip); in g_union_doio()
947 cbp->bio_caller1 = wip; in g_union_doio()
949 cbp->bio_offset = wip->wip_start; in g_union_doio()
1015 atomic_add_long(&wip->wip_numios, 1); in g_union_doio()
1024 cbp = g_clone_bio(wip->wip_bp); in g_union_doio()
1026 wip->wip_error = ENOMEM; in g_union_doio()
1027 atomic_add_long(&wip->wip_numios, -1); in g_union_doio()
1030 cbp->bio_caller1 = wip; in g_union_doio()
1047 struct g_union_wip *wip, *waitingwip; in g_union_done() local
1050 wip = bp->bio_caller1; in g_union_done()
1051 if (wip->wip_error != 0 && bp->bio_error == 0) in g_union_done()
1052 bp->bio_error = wip->wip_error; in g_union_done()
1053 wip->wip_error = 0; in g_union_done()
1054 if (atomic_fetchadd_long(&wip->wip_numios, -1) == 1) { in g_union_done()
1055 sc = wip->wip_sc; in g_union_done()
1059 TAILQ_REMOVE(&sc->sc_wiplist, wip, wip_next); in g_union_done()
1061 while ((waitingwip = TAILQ_FIRST(&wip->wip_waiting)) != NULL) { in g_union_done()
1062 TAILQ_REMOVE(&wip->wip_waiting, waitingwip, wip_next); in g_union_done()
1065 g_free(wip); in g_union_done()