aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_extfree_item.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2010-06-23 04:11:15 -0400
committerAlex Elder <aelder@sgi.com>2010-07-26 14:16:34 -0400
commite98c414f9a3134fe7efc56ef8f1d394b54bfd40e (patch)
treeb3d4696cfb4875af39041f9ddcd642bd1cd90a29 /fs/xfs/xfs_extfree_item.c
parent3400777ff03a3cd4fdbc6cb15676fc7e7ceefc00 (diff)
xfs: simplify log item descriptor tracking
Currently we track log item descriptor belonging to a transaction using a complex opencoded chunk allocator. This code has been there since day one and seems to work around the lack of an efficient slab allocator. This patch replaces it with dynamically allocated log item descriptors from a dedicated slab pool, linked to the transaction by a linked list. This allows to greatly simplify the log item descriptor tracking to the point where it's just a couple hundred lines in xfs_trans.c instead of a separate file. The external API has also been simplified while we're at it - the xfs_trans_add_item and xfs_trans_del_item functions to add/ delete items from a transaction have been simplified to the bare minium, and the xfs_trans_find_item function is replaced with a direct dereference of the li_desc field. All debug code walking the list of log items in a transaction is down to a simple list_for_each_entry. Note that we could easily use a singly linked list here instead of the double linked list from list.h as the fastpath only does deletion from sequential traversal. But given that we don't have one available as a library function yet I use the list.h functions for simplicity. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com>
Diffstat (limited to 'fs/xfs/xfs_extfree_item.c')
-rw-r--r--fs/xfs/xfs_extfree_item.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c
index 1023b1fadfe8..8d0e543ca3c0 100644
--- a/fs/xfs/xfs_extfree_item.c
+++ b/fs/xfs/xfs_extfree_item.c
@@ -131,18 +131,18 @@ STATIC void
131xfs_efi_item_unpin_remove(xfs_efi_log_item_t *efip, xfs_trans_t *tp) 131xfs_efi_item_unpin_remove(xfs_efi_log_item_t *efip, xfs_trans_t *tp)
132{ 132{
133 struct xfs_ail *ailp = efip->efi_item.li_ailp; 133 struct xfs_ail *ailp = efip->efi_item.li_ailp;
134 xfs_log_item_desc_t *lidp;
135 134
136 spin_lock(&ailp->xa_lock); 135 spin_lock(&ailp->xa_lock);
137 if (efip->efi_flags & XFS_EFI_CANCELED) { 136 if (efip->efi_flags & XFS_EFI_CANCELED) {
137 struct xfs_log_item *lip = &efip->efi_item;
138
138 /* 139 /*
139 * free the xaction descriptor pointing to this item 140 * free the xaction descriptor pointing to this item
140 */ 141 */
141 lidp = xfs_trans_find_item(tp, (xfs_log_item_t *) efip); 142 xfs_trans_del_item(lip);
142 xfs_trans_free_item(tp, lidp);
143 143
144 /* xfs_trans_ail_delete() drops the AIL lock. */ 144 /* xfs_trans_ail_delete() drops the AIL lock. */
145 xfs_trans_ail_delete(ailp, (xfs_log_item_t *)efip); 145 xfs_trans_ail_delete(ailp, lip);
146 xfs_efi_item_free(efip); 146 xfs_efi_item_free(efip);
147 } else { 147 } else {
148 efip->efi_flags |= XFS_EFI_COMMITTED; 148 efip->efi_flags |= XFS_EFI_COMMITTED;