| To: | xfs@xxxxxxxxxxx |
|---|---|
| Subject: | ***** SUSPECTED SPAM ***** [PATCH 50/50] xfs: use reference counts to free clean buffer items |
| From: | Dave Chinner <david@xxxxxxxxxxxxx> |
| Date: | Mon, 12 Aug 2013 20:50:11 +1000 |
| Delivered-to: | xfs@xxxxxxxxxxx |
| Importance: | Low |
| In-reply-to: | <1376304611-22994-1-git-send-email-david@xxxxxxxxxxxxx> |
| References: | <1376304611-22994-1-git-send-email-david@xxxxxxxxxxxxx> |
From: Dave Chinner <dchinner@xxxxxxxxxx>
When a transaction is cancelled and the buffer log item is clean in
the transaction, the buffer log item is unconditionally freed. If
the log item is in the AIL, however, this leads to a use after free
condition as the item still has other users.
In this case, xfs_buf_item_relse() should only be called on clean
buffer items if the reference count has dropped to zero. This
ensures only the last user frees the item.
Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx>
---
fs/xfs/xfs_buf_item.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c
index 9358504..3a944b1 100644
--- a/fs/xfs/xfs_buf_item.c
+++ b/fs/xfs/xfs_buf_item.c
@@ -613,11 +613,9 @@ xfs_buf_item_unlock(
}
}
}
- if (clean)
- xfs_buf_item_relse(bp);
- else if (aborted) {
+ if (clean || aborted) {
if (atomic_dec_and_test(&bip->bli_refcount)) {
- ASSERT(XFS_FORCED_SHUTDOWN(lip->li_mountp));
+ ASSERT(!aborted || XFS_FORCED_SHUTDOWN(lip->li_mountp));
xfs_buf_item_relse(bp);
}
} else
--
1.8.3.2
|
| Previous by Date: | ***** SUSPECTED SPAM ***** [PATCH 16/50] xfs: reshuffle dir2 definitions around for userspace, Dave Chinner |
|---|---|
| Next by Date: | ***** SUSPECTED SPAM ***** [PATCH 10/50] xfs: sync minor header differences needed by userspace., Dave Chinner |
| Previous by Thread: | ***** SUSPECTED SPAM ***** [PATCH 16/50] xfs: reshuffle dir2 definitions around for userspace, Dave Chinner |
| Next by Thread: | Re: [PATCH 50/50] xfs: use reference counts to free clean buffer items, Mark Tinguely |
| Indexes: | [Date] [Thread] [Top] [All Lists] |