2237 }
2238 if (state->extravalid && state->extrablk.bp)
2239 xfs_da_buf_done(state->extrablk.bp);
2240#ifdef DEBUG
2241 memset((char *)state, 0, sizeof(*state));
2242#endif
2243 kmem_zone_free(xfs_da_state_zone, state);
2244}
2245
2246#ifdef XFS_DABUF_DEBUG
2247xfs_dabuf_t *xfs_dabuf_global_list;
2248static DEFINE_SPINLOCK(xfs_dabuf_global_lock);
2249#endif
2250
2251
2252
2253
2254
2255STATIC xfs_dabuf_t *
2256xfs_da_buf_make(int nbuf, xfs_buf_t **bps, inst_t *ra)
2257{
2258 xfs_buf_t *bp;
2259 xfs_dabuf_t *dabuf;
2260 int i;
2261 int off;
2262
2263 if (nbuf == 1)
2264 dabuf = kmem_zone_alloc(xfs_dabuf_zone, KM_SLEEP);
2265 else
2266 dabuf = kmem_alloc(XFS_DA_BUF_SIZE(nbuf), KM_SLEEP);
2267 dabuf->dirty = 0;
2268#ifdef XFS_DABUF_DEBUG
2269 dabuf->ra = ra;
2270 dabuf->target = XFS_BUF_TARGET(bps[0]);
2271 dabuf->blkno = XFS_BUF_ADDR(bps[0]);
2272#endif
2273 if (nbuf == 1) {
2274 dabuf->nbuf = 1;
2275 bp = bps[0];
2276 dabuf->bbcount = (short)BTOBB(XFS_BUF_COUNT(bp));
2277 dabuf->data = XFS_BUF_PTR(bp);