aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_bmap.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_bmap.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_bmap.c')
-rw-r--r--fs/xfs/xfs_bmap.c45
1 files changed, 10 insertions, 35 deletions
diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c
index ed4e3ae2c1d0..ff8675b41973 100644
--- a/fs/xfs/xfs_bmap.c
+++ b/fs/xfs/xfs_bmap.c
@@ -5857,43 +5857,18 @@ xfs_bmap_get_bp(
5857 bp = NULL; 5857 bp = NULL;
5858 5858
5859 if (!bp) { /* Chase down all the log items to see if the bp is there */ 5859 if (!bp) { /* Chase down all the log items to see if the bp is there */
5860 xfs_log_item_chunk_t *licp; 5860 struct xfs_log_item_desc *lidp;
5861 xfs_trans_t *tp; 5861 struct xfs_buf_log_item *bip;
5862 5862
5863 tp = cur->bc_tp; 5863 list_for_each_entry(lidp, &cur->bc_tp->t_items, lid_trans) {
5864 licp = &tp->t_items; 5864 bip = (struct xfs_buf_log_item *)lidp->lid_item;
5865 while (!bp && licp != NULL) { 5865 if (bip->bli_item.li_type == XFS_LI_BUF &&
5866 if (xfs_lic_are_all_free(licp)) { 5866 XFS_BUF_ADDR(bip->bli_buf) == bno)
5867 licp = licp->lic_next; 5867 return bip->bli_buf;
5868 continue;
5869 }
5870 for (i = 0; i < licp->lic_unused; i++) {
5871 xfs_log_item_desc_t *lidp;
5872 xfs_log_item_t *lip;
5873 xfs_buf_log_item_t *bip;
5874 xfs_buf_t *lbp;
5875
5876 if (xfs_lic_isfree(licp, i)) {
5877 continue;
5878 }
5879
5880 lidp = xfs_lic_slot(licp, i);
5881 lip = lidp->lid_item;
5882 if (lip->li_type != XFS_LI_BUF)
5883 continue;
5884
5885 bip = (xfs_buf_log_item_t *)lip;
5886 lbp = bip->bli_buf;
5887
5888 if (XFS_BUF_ADDR(lbp) == bno) {
5889 bp = lbp;
5890 break; /* Found it */
5891 }
5892 }
5893 licp = licp->lic_next;
5894 } 5868 }
5895 } 5869 }
5896 return(bp); 5870
5871 return bp;
5897} 5872}
5898 5873
5899STATIC void 5874STATIC void