Commit 17e6afc7 authored by Dave Kleikamp's avatar Dave Kleikamp

JFS: Avoid BUG() on a damaged file system

On Mon, 2006-12-18 at 19:51 +0100, Eric Sesterhenn wrote:
> hi,
>
> while playing around with fsfuzzer, i got the following oops with jfs:
>
> [  851.804875] BUG at fs/jfs/jfs_xtree.c:760
> assert(!BT_STACK_FULL(btstack))
> [  851.805179] ------------[ cut here ]------------
> [  851.805238] kernel BUG at fs/jfs/jfs_xtree.c:760!

JFS should mark the superblock dirty and return an error rather than
calling BUG().
Signed-off-by: default avatarDave Kleikamp <shaggy@austin.ibm.com>
parent efa06708
...@@ -757,6 +757,11 @@ static int xtSearch(struct inode *ip, s64 xoff, s64 *nextp, ...@@ -757,6 +757,11 @@ static int xtSearch(struct inode *ip, s64 xoff, s64 *nextp,
nsplit = 0; nsplit = 0;
/* push (bn, index) of the parent page/entry */ /* push (bn, index) of the parent page/entry */
if (BT_STACK_FULL(btstack)) {
jfs_error(ip->i_sb, "stack overrun in xtSearch!");
XT_PUTPAGE(mp);
return -EIO;
}
BT_PUSH(btstack, bn, index); BT_PUSH(btstack, bn, index);
/* get the child page block number */ /* get the child page block number */
...@@ -3915,6 +3920,11 @@ s64 xtTruncate(tid_t tid, struct inode *ip, s64 newsize, int flag) ...@@ -3915,6 +3920,11 @@ s64 xtTruncate(tid_t tid, struct inode *ip, s64 newsize, int flag)
*/ */
getChild: getChild:
/* save current parent entry for the child page */ /* save current parent entry for the child page */
if (BT_STACK_FULL(&btstack)) {
jfs_error(ip->i_sb, "stack overrun in xtTruncate!");
XT_PUTPAGE(mp);
return -EIO;
}
BT_PUSH(&btstack, bn, index); BT_PUSH(&btstack, bn, index);
/* get child page */ /* get child page */
...@@ -4112,6 +4122,11 @@ s64 xtTruncate_pmap(tid_t tid, struct inode *ip, s64 committed_size) ...@@ -4112,6 +4122,11 @@ s64 xtTruncate_pmap(tid_t tid, struct inode *ip, s64 committed_size)
*/ */
getChild: getChild:
/* save current parent entry for the child page */ /* save current parent entry for the child page */
if (BT_STACK_FULL(&btstack)) {
jfs_error(ip->i_sb, "stack overrun in xtTruncate_pmap!");
XT_PUTPAGE(mp);
return -EIO;
}
BT_PUSH(&btstack, bn, index); BT_PUSH(&btstack, bn, index);
/* get child page */ /* get child page */
......
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