aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_log_recover.c
diff options
context:
space:
mode:
authorDavid Chinner <david@fromorbit.com>2008-10-30 02:40:09 -0400
committerLachlan McIlroy <lachlan@sgi.com>2008-10-30 02:40:09 -0400
commit5a792c4579af8466246408e38fd4eff45d8493b8 (patch)
tree33b9d578dc42fe47bf8fff9ca60326cf9a22bef0 /fs/xfs/xfs_log_recover.c
parent783a2f656f9674c31d4019708a94af93fa1d1c22 (diff)
[XFS] XFS: Check for valid transaction headers in recovery
When we are about to add a new item to a transaction in recovery, we need to check that it is valid first. Currently we just assert that header magic number matches, but in production systems that is not present and we add a corrupted transaction to the list to be processed. This results in a kernel oops later when processing the corrupted transaction. Instead, if we detect a corrupted transaction, abort recovery and leave the user to clean up the mess that has occurred. SGI-PV: 988145 SGI-Modid: xfs-linux-melb:xfs-kern:32356a Signed-off-by: David Chinner <david@fromorbit.com> Signed-off-by: Tim Shimmin <tes@sgi.com> Signed-off-by: Eric Sandeen <sandeen@sandeen.net> Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_log_recover.c')
-rw-r--r--fs/xfs/xfs_log_recover.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
index cff901efc24b..b411d4947318 100644
--- a/fs/xfs/xfs_log_recover.c
+++ b/fs/xfs/xfs_log_recover.c
@@ -1417,7 +1417,13 @@ xlog_recover_add_to_trans(
1417 return 0; 1417 return 0;
1418 item = trans->r_itemq; 1418 item = trans->r_itemq;
1419 if (item == NULL) { 1419 if (item == NULL) {
1420 ASSERT(*(uint *)dp == XFS_TRANS_HEADER_MAGIC); 1420 /* we need to catch log corruptions here */
1421 if (*(uint *)dp != XFS_TRANS_HEADER_MAGIC) {
1422 xlog_warn("XFS: xlog_recover_add_to_trans: "
1423 "bad header magic number");
1424 ASSERT(0);
1425 return XFS_ERROR(EIO);
1426 }
1421 if (len == sizeof(xfs_trans_header_t)) 1427 if (len == sizeof(xfs_trans_header_t))
1422 xlog_recover_add_item(&trans->r_itemq); 1428 xlog_recover_add_item(&trans->r_itemq);
1423 memcpy(&trans->r_theader, dp, len); /* d, s, l */ 1429 memcpy(&trans->r_theader, dp, len); /* d, s, l */