/* * This is called to unlock all of the items of a transaction and to free * all the descriptors of that transaction. * * It walks the list of descriptors and unlocks each item. It frees * each chunk except that embedded in the transaction as it goes along. */ void xfs_trans_free_items( xfs_trans_t *tp, int flags) { xfs_log_item_chunk_t *licp; xfs_log_item_chunk_t *next_licp; int abort; abort = flags & XFS_TRANS_ABORT; licp = &tp->t_items; /* * Special case the embedded chunk so we don't free it below. */ if (!XFS_LIC_ARE_ALL_FREE(licp)) { (void) xfs_trans_unlock_chunk(licp, 1, abort, NULLCOMMITLSN); XFS_LIC_ALL_FREE(licp); licp->lic_unused = 0; } licp = licp->lic_next; /* * Unlock each item in each chunk and free the chunks. */ while (licp != NULL) { ASSERT(!XFS_LIC_ARE_ALL_FREE(licp)); (void) xfs_trans_unlock_chunk(licp, 1, abort, NULLCOMMITLSN); next_licp = licp->lic_next; kmem_free(licp, sizeof(xfs_log_item_chunk_t)); licp = next_licp; } /* * Reset the transaction structure's free item count. */ tp->t_items_free = XFS_LIC_NUM_SLOTS; tp->t_items.lic_next = NULL; }
void xfs_lic_all_free(xfs_log_item_chunk_t *cp) { XFS_LIC_ALL_FREE(cp); }