When an IO error happens during inode deletion run from xlog_recover_process_iunlinks() filesystem gets shutdown. Thus any subsequent attempt to read buffers fails. Code in xlog_recover_process_iunlinks() does not count with the fact that read of a buffer which was read a while ago can really fail which results in the oops on agi = XFS_BUF_TO_AGI(agibp); Fix the problem by handling error from xfs_read_agi() in all cases. Signed-off-by: Jan Kara <jack@xxxxxxx> --- fs/xfs/xfs_log_recover.c | 15 ++++++++++++--- 1 files changed, 12 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 0ed9ee7..3899264 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3178,11 +3178,17 @@ xlog_recover_process_iunlinks( /* * Reacquire the agibuffer and continue around - * the loop. This should never fail as we know - * the buffer was good earlier on. + * the loop. */ error = xfs_read_agi(mp, NULL, agno, &agibp); - ASSERT(error == 0); + /* + * We failed to read a buffer we succeeded + * reading just a while ago. Likely because the + * filesystem is shutdown now. Just try the + * next AG. + */ + if (error) + goto next_ag; agi = XFS_BUF_TO_AGI(agibp); } } @@ -3192,6 +3198,9 @@ xlog_recover_process_iunlinks( * go on to the next one. */ xfs_buf_relse(agibp); +next_ag: + /* Hrm... C9x seems to require this */ + ; } mp->m_dmevmask = mp_dmevmask; -- 1.7.1 _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs