aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Chinner <[email protected]>2015-01-22 09:29:05 +1100
committerDave Chinner <[email protected]>2015-01-22 09:29:05 +1100
commit0d612fb570b71ea2e49554a770cff4c489018b2c (patch)
tree65d2a976802155e9de2c33b271a1e590c78022d8
parent97bf6af1f928216fd6c5a66e8a57bfa95a659672 (diff)
xfs: ensure buffer types are set correctly
Jan Kara reported that log recovery was finding buffers with invalid types in them. This should not happen, and indicates a bug in the logging of buffers. To catch this, add asserts to the buffer formatting code to ensure that the buffer type is in range when the transaction is committed. We don't set a type on buffers being marked stale - they are not going to get replayed, the format item exists only for recovery to be able to prevent replay of the buffer, so the type does not matter. Hence that needs special casing here. cc: <[email protected]> # 3.10 to current Reported-by: Jan Kara <[email protected]> Tested-by: Jan Kara <[email protected]> Signed-off-by: Dave Chinner <[email protected]> Reviewed-by: Brian Foster <[email protected]> Signed-off-by: Dave Chinner <[email protected]>
-rw-r--r--fs/xfs/xfs_buf_item.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c
index 3f9bd58edec7..744352bf3240 100644
--- a/fs/xfs/xfs_buf_item.c
+++ b/fs/xfs/xfs_buf_item.c
@@ -319,6 +319,10 @@ xfs_buf_item_format(
ASSERT(atomic_read(&bip->bli_refcount) > 0);
ASSERT((bip->bli_flags & XFS_BLI_LOGGED) ||
(bip->bli_flags & XFS_BLI_STALE));
+ ASSERT((bip->bli_flags & XFS_BLI_STALE) ||
+ (xfs_blft_from_flags(&bip->__bli_format) > XFS_BLFT_UNKNOWN_BUF
+ && xfs_blft_from_flags(&bip->__bli_format) < XFS_BLFT_MAX_BUF));
+
/*
* If it is an inode buffer, transfer the in-memory state to the