| 2346 | } |
| 2347 | |
| 2348 | static void |
| 2349 | buf_vlist_remove(struct buf *bp) |
| 2350 | { |
| 2351 | struct bufv *bv; |
| 2352 | b_xflags_t flags; |
| 2353 | |
| 2354 | flags = bp->b_xflags; |
| 2355 | |
| 2356 | KASSERT(bp->b_bufobj != NULL, ("No b_bufobj %p", bp)); |
| 2357 | ASSERT_BO_WLOCKED(bp->b_bufobj); |
| 2358 | KASSERT((flags & (BX_VNDIRTY | BX_VNCLEAN)) != 0 && |
| 2359 | (flags & (BX_VNDIRTY | BX_VNCLEAN)) != (BX_VNDIRTY | BX_VNCLEAN), |
| 2360 | ("%s: buffer %p has invalid queue state", __func__, bp)); |
| 2361 | |
| 2362 | if ((flags & BX_VNDIRTY) != 0) |
| 2363 | bv = &bp->b_bufobj->bo_dirty; |
| 2364 | else |
| 2365 | bv = &bp->b_bufobj->bo_clean; |
| 2366 | BUF_PCTRIE_REMOVE(&bv->bv_root, bp->b_lblkno); |
| 2367 | TAILQ_REMOVE(&bv->bv_hd, bp, b_bobufs); |
| 2368 | bv->bv_cnt--; |
| 2369 | bp->b_xflags &= ~(BX_VNDIRTY | BX_VNCLEAN); |
| 2370 | } |
| 2371 | |
| 2372 | /* |
| 2373 | * Add the buffer to the sorted clean or dirty block list. |
no outgoing calls
no test coverage detected