From: Dave Chinner <david@fromorbit.com>
To: xfs@oss.sgi.com
Subject: [PATCH 1/9] xfs: fix EFI transaction cancellation.
Date: Mon, 13 Dec 2010 15:32:15 +1100 [thread overview]
Message-ID: <1292214743-18073-2-git-send-email-david@fromorbit.com> (raw)
In-Reply-To: <1292214743-18073-1-git-send-email-david@fromorbit.com>
From: Dave Chinner <dchinner@redhat.com>
XFS_EFI_CANCELED has not been set in the code base since
xfs_efi_cancel() was removed back in 2006 by commit
065d312e15902976d256ddaf396a7950ec0350a8 ("[XFS] Remove unused
iop_abort log item operation), and even then xfs_efi_cancel() was
never called. I haven't tracked it back further than that (beyond
git history), but it indicates that the handling of EFIs in
cancelled transactions has been broken for a long time.
Basically, when we get an IOP_UNPIN(lip, 1); call from
xfs_trans_uncommit() (i.e. remove == 1), if we don't free the log
item descriptor we leak it. Fix the behviour to be correct and kill
the XFS_EFI_CANCELED flag.
Signed-off-by: Dave Chinner <dchinner@redhat.com>
---
fs/xfs/xfs_extfree_item.c | 20 +++++++++-----------
fs/xfs/xfs_extfree_item.h | 1 -
2 files changed, 9 insertions(+), 12 deletions(-)
diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c
index a55e687..5997efa 100644
--- a/fs/xfs/xfs_extfree_item.c
+++ b/fs/xfs/xfs_extfree_item.c
@@ -99,10 +99,11 @@ xfs_efi_item_pin(
}
/*
- * While EFIs cannot really be pinned, the unpin operation is the
- * last place at which the EFI is manipulated during a transaction.
- * Here we coordinate with xfs_efi_cancel() to determine who gets to
- * free the EFI.
+ * While EFIs cannot really be pinned, the unpin operation is the last place at
+ * which the EFI is manipulated during a transaction. If we are being asked to
+ * remove the EFI it's because the transaction has been cancelled and by
+ * definition that means the EFI cannot be in the AIL so remove it from the
+ * transaction and free it.
*/
STATIC void
xfs_efi_item_unpin(
@@ -113,17 +114,14 @@ xfs_efi_item_unpin(
struct xfs_ail *ailp = lip->li_ailp;
spin_lock(&ailp->xa_lock);
- if (efip->efi_flags & XFS_EFI_CANCELED) {
- if (remove)
- xfs_trans_del_item(lip);
-
- /* xfs_trans_ail_delete() drops the AIL lock. */
- xfs_trans_ail_delete(ailp, lip);
+ if (remove) {
+ ASSERT(!(lip->li_flags & XFS_LI_IN_AIL));
+ xfs_trans_del_item(lip);
xfs_efi_item_free(efip);
} else {
efip->efi_flags |= XFS_EFI_COMMITTED;
- spin_unlock(&ailp->xa_lock);
}
+ spin_unlock(&ailp->xa_lock);
}
/*
diff --git a/fs/xfs/xfs_extfree_item.h b/fs/xfs/xfs_extfree_item.h
index 0d22c56..f7834ec 100644
--- a/fs/xfs/xfs_extfree_item.h
+++ b/fs/xfs/xfs_extfree_item.h
@@ -115,7 +115,6 @@ typedef struct xfs_efd_log_format_64 {
*/
#define XFS_EFI_RECOVERED 0x1
#define XFS_EFI_COMMITTED 0x2
-#define XFS_EFI_CANCELED 0x4
/*
* This is the "extent free intention" log item. It is used
--
1.7.2.3
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
next prev parent reply other threads:[~2010-12-13 4:32 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-13 4:32 xfs: AIL lock contention reduction V3 Dave Chinner
2010-12-13 4:32 ` Dave Chinner [this message]
2010-12-17 11:18 ` [PATCH 1/9] xfs: fix EFI transaction cancellation Christoph Hellwig
2010-12-13 4:32 ` [PATCH 2/9] xfs: Pull EFI/EFD handling out from under the AIL lock Dave Chinner
2010-12-17 11:22 ` Christoph Hellwig
2010-12-20 1:00 ` Dave Chinner
2010-12-13 4:32 ` [PATCH 3/9] xfs: clean up xfs_ail_delete() Dave Chinner
2010-12-13 4:32 ` [PATCH 4/9] xfs: bulk AIL insertion during transaction commit Dave Chinner
2010-12-17 11:25 ` Christoph Hellwig
2010-12-13 4:32 ` [PATCH 5/9] xfs: reduce the number of AIL push wakeups Dave Chinner
2010-12-16 15:38 ` Christoph Hellwig
2010-12-16 21:50 ` Dave Chinner
2010-12-17 0:23 ` Christoph Hellwig
2010-12-13 4:32 ` [PATCH 6/9] xfs: consume iodone callback items on buffers as they are processed Dave Chinner
2010-12-13 4:32 ` [PATCH 7/9] xfs: remove all the inodes on a buffer from the AIL in bulk Dave Chinner
2010-12-17 11:25 ` Christoph Hellwig
2010-12-13 4:32 ` [PATCH 9/9] xfs: use AIL bulk delete function to implement single delete Dave Chinner
2010-12-17 14:16 ` Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1292214743-18073-2-git-send-email-david@fromorbit.com \
--to=david@fromorbit.com \
--cc=xfs@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.