[PATCH 2/8] xfs: fix efi item leak on forced shutdown
Christoph Hellwig
hch at infradead.org
Tue Jan 25 17:53:54 CST 2011
On Tue, Jan 25, 2011 at 07:50:38PM +1100, Dave Chinner wrote:
> diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c
> index 75f2ef6..effbb41 100644
> --- a/fs/xfs/xfs_extfree_item.c
> +++ b/fs/xfs/xfs_extfree_item.c
> @@ -138,7 +138,6 @@ xfs_efi_item_unpin(
>
> if (remove) {
> ASSERT(!(lip->li_flags & XFS_LI_IN_AIL));
> - xfs_trans_del_item(lip);
> xfs_efi_item_free(efip);
> return;
> }
> STATIC void
> xfs_trans_uncommit(
> struct xfs_trans *tp,
> uint flags)
> {
> - struct xfs_log_item_desc *lidp;
> + struct xfs_log_item_desc *lidp, *n;
>
> - list_for_each_entry(lidp, &tp->t_items, lid_trans) {
> + list_for_each_entry_safe(lidp, n, &tp->t_items, lid_trans) {
> /*
> * Unpin all but those that aren't dirty.
> */
> - if (lidp->lid_flags & XFS_LID_DIRTY)
> + if (lidp->lid_flags & XFS_LID_DIRTY) {
> + xfs_trans_del_item(lidp->lid_item);
> IOP_UNPIN(lidp->lid_item, 1);
> + }
This part of the patch isn't explained in the changelog, and I suspect
it should be a separate patch from the addition of the IOP_UNPIN with
remove call to the CIL error path.
Moving the xfs_trans_del_item from the IOP_UNPIN implementation into
the caller seems sane to me, but:
- why is the call to xfs_trans_del_item left in xfs_buf_item_unpin
- why did xfs_buf_item_unpin get away only calling it for the stale
case, and the other log item implementations completely without
it
I suspect the answer lies in xfs_trans_free_items opencoding the
call to xfs_trans_del_item, thus avoiding any leak of log item
descriptors or log items on the transaction list. By adding the
call of xfs_trans_del_item to xfs_trans_uncommit we thus skip
the calls to IOP_UNLOCK for dirty log items, which is a large
change in behaviour for the existing log items that didn't have
the xfs_trans_del_item calls, and at least for the dquot and
inode items seems incorrect.
More information about the xfs
mailing list