Commit 2ad01f53 authored by Dave Chinner's avatar Dave Chinner Committed by Ben Myers

xfs: use reference counts to free clean buffer items

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: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarMark Tinguely <tinguely@sgi.com>
Signed-off-by: default avatarBen Myers <bpm@sgi.com>
parent d6970d4b
...@@ -613,11 +613,9 @@ xfs_buf_item_unlock( ...@@ -613,11 +613,9 @@ xfs_buf_item_unlock(
} }
} }
} }
if (clean) if (clean || aborted) {
xfs_buf_item_relse(bp);
else if (aborted) {
if (atomic_dec_and_test(&bip->bli_refcount)) { 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); xfs_buf_item_relse(bp);
} }
} else } else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment