From d2fcf987ee5f2a91b07d0ee2a4305b78bcf2354b Mon Sep 17 00:00:00 2001 From: Duane Griffin Date: Fri, 11 Jul 2008 19:27:31 -0400 Subject: [PATCH] --- yaml --- r: 101066 b: refs/heads/master c: 71dc8fbcf5f6363342bd636a646eeac7cfef25c3 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/ext4/inode.c | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 90f3aa8b788d..91e55d7dbaf7 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 91ef4caf800030fa6e5224b8a41f8c74787b303d +refs/heads/master: 71dc8fbcf5f6363342bd636a646eeac7cfef25c3 diff --git a/trunk/fs/ext4/inode.c b/trunk/fs/ext4/inode.c index 269763b66361..7cce96a6935e 100644 --- a/trunk/fs/ext4/inode.c +++ b/trunk/fs/ext4/inode.c @@ -2179,7 +2179,21 @@ static void ext4_free_data(handle_t *handle, struct inode *inode, if (this_bh) { BUFFER_TRACE(this_bh, "call ext4_journal_dirty_metadata"); - ext4_journal_dirty_metadata(handle, this_bh); + + /* + * The buffer head should have an attached journal head at this + * point. However, if the data is corrupted and an indirect + * block pointed to itself, it would have been detached when + * the block was cleared. Check for this instead of OOPSing. + */ + if (bh2jh(this_bh)) + ext4_journal_dirty_metadata(handle, this_bh); + else + ext4_error(inode->i_sb, __func__, + "circular indirect block detected, " + "inode=%lu, block=%llu", + inode->i_ino, + (unsigned long long) this_bh->b_blocknr); } }