As the new code shows much more clearly we always have a 1:1 relationship between EFI and EFD items, and thus don't need to count the number of extents that and EFD cancels out. Thus we can remove the efi_next_extent field and all logic related to it. Also this makes clear that the only field we actually use in the EFD is the efi_id, thus there's no need to even bother formatting the extents into the EFD. Signed-off-by: Christoph Hellwig <hch@xxxxxx> --- fs/xfs/xfs_extfree_item.c | 37 ++++++++++--------------------------- fs/xfs/xfs_extfree_item.h | 1 - fs/xfs/xfs_log_recover.c | 2 +- fs/xfs/xfs_trans.h | 2 +- 4 files changed, 12 insertions(+), 30 deletions(-) diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index 7ed0e01..da0ac7c 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -47,14 +47,17 @@ xfs_efi_item_free( } /* + * This is called by the efd item code below to release references to the given + * efi item. + * * Freeing the efi requires that we remove it from the AIL if it has already * been placed there. However, the EFI may not yet have been placed in the AIL - * when called by xfs_efi_release() from EFD processing due to the ordering of - * committed vs unpin operations in bulk insert operations. Hence the reference - * count to ensure only the last caller frees the EFI. + * when called by xfs_efd_item_committed due to the ordering of committed vs + * unpin operations in bulk insert operations. Hence the reference count to + * ensure only the last caller frees the EFI. */ -STATIC void -__xfs_efi_release( +void +xfs_efi_release( struct xfs_efi_log_item *efip) { struct xfs_ail *ailp = efip->efi_item.li_ailp; @@ -120,8 +123,6 @@ xfs_efi_item_format( elf->efi_id = efip->efi_id; for (free = efip->efi_flist.xbf_first; free; free = free->xbfi_next) { - atomic_inc(&efip->efi_next_extent); - elf->efi_extents[e].ext_start = free->xbfi_startblock; elf->efi_extents[e].ext_len = free->xbfi_blockcount; e++; @@ -161,7 +162,7 @@ xfs_efi_item_unpin( xfs_efi_item_free(efip); return; } - __xfs_efi_release(efip); + xfs_efi_release(efip); } /* @@ -240,7 +241,6 @@ xfs_efi_init( efip = kmem_zone_zalloc(xfs_efi_zone, KM_SLEEP); xfs_log_item_init(mp, &efip->efi_item, XFS_LI_EFI, &xfs_efi_item_ops); - atomic_set(&efip->efi_next_extent, 0); atomic_set(&efip->efi_refcount, 2); efip->efi_id = (unsigned long)efip; @@ -333,27 +333,10 @@ xfs_efi_item_from_disk( return EFSCORRUPTED; } - atomic_set(&efip->efi_next_extent, efip->efi_flist.xbf_count); *efipp = efip; return 0; } - -/* - * This is called by the efd item code below to release references to the given - * efi item. Each efd calls this with the number of extents that it has - * logged, and when the sum of these reaches the total number of extents logged - * by this efi item we can free the efi item. - */ -void -xfs_efi_release(xfs_efi_log_item_t *efip, - uint nextents) -{ - ASSERT(atomic_read(&efip->efi_next_extent) >= nextents); - if (atomic_sub_and_test(nextents, &efip->efi_next_extent)) - __xfs_efi_release(efip); -} - static inline struct xfs_efd_log_item *EFD_ITEM(struct xfs_log_item *lip) { return container_of(lip, struct xfs_efd_log_item, efd_item); @@ -479,7 +462,7 @@ xfs_efd_item_committed( * EFI got unpinned and freed before the EFD got aborted. */ if (!(lip->li_flags & XFS_LI_ABORTED)) - xfs_efi_release(efdp->efd_efip, efdp->efd_flist.xbf_count); + xfs_efi_release(efdp->efd_efip); kmem_zone_free(xfs_efd_zone, efdp); return (xfs_lsn_t)-1; diff --git a/fs/xfs/xfs_extfree_item.h b/fs/xfs/xfs_extfree_item.h index 724a7e4..e658d42 100644 --- a/fs/xfs/xfs_extfree_item.h +++ b/fs/xfs/xfs_extfree_item.h @@ -46,7 +46,6 @@ struct kmem_zone; typedef struct xfs_efi_log_item { xfs_log_item_t efi_item; atomic_t efi_refcount; - atomic_t efi_next_extent; unsigned long efi_flags; /* misc flags */ struct xfs_bmap_free efi_flist; unsigned long efi_id; diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 61e8587..b679a0b 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3641,7 +3641,7 @@ xlog_recover_process_efi( * memory associated with it. */ set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); - xfs_efi_release(efip, efip->efi_flist.xbf_count); + xfs_efi_release(efip); return XFS_ERROR(EIO); } } diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index f6b4cf0..6723157 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -216,7 +216,7 @@ void xfs_trans_ichgtime(struct xfs_trans *, struct xfs_inode *, int); void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *, uint); void xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint); void xfs_trans_log_inode(xfs_trans_t *, struct xfs_inode *, uint); -void xfs_efi_release(struct xfs_efi_log_item *, uint); +void xfs_efi_release(struct xfs_efi_log_item *); struct xfs_efi_log_item *xfs_trans_log_efi(struct xfs_trans *, struct xfs_bmap_free *); struct xfs_efd_log_item *xfs_trans_log_efd(struct xfs_trans *, -- 1.7.10.4 _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs