mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 03:36:19 +00:00
nilfs2: get rid of BUG_ON use in btree lookup routines
The current btree lookup routines make a kernel oops when detected inconsistency in btree blocks. These routines should instead return a proper error code because the inconsistency usually comes from corruption of on-disk metadata. This fixes the issue by converting BUG_ON calls to proper error handlings. Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
This commit is contained in:
parent
648f4e3e50
commit
9b945d537d
1 changed files with 16 additions and 2 deletions
|
@ -444,6 +444,18 @@ nilfs_btree_get_node(const struct nilfs_btree *btree,
|
|||
nilfs_btree_get_nonroot_node(path, level);
|
||||
}
|
||||
|
||||
static inline int
|
||||
nilfs_btree_bad_node(struct nilfs_btree_node *node, int level)
|
||||
{
|
||||
if (unlikely(nilfs_btree_node_get_level(node) != level)) {
|
||||
dump_stack();
|
||||
printk(KERN_CRIT "NILFS: btree level mismatch: %d != %d\n",
|
||||
nilfs_btree_node_get_level(node), level);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nilfs_btree_do_lookup(const struct nilfs_btree *btree,
|
||||
struct nilfs_btree_path *path,
|
||||
__u64 key, __u64 *ptrp, int minlevel)
|
||||
|
@ -467,7 +479,8 @@ static int nilfs_btree_do_lookup(const struct nilfs_btree *btree,
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
node = nilfs_btree_get_nonroot_node(path, level);
|
||||
BUG_ON(level != nilfs_btree_node_get_level(node));
|
||||
if (nilfs_btree_bad_node(node, level))
|
||||
return -EINVAL;
|
||||
if (!found)
|
||||
found = nilfs_btree_node_lookup(node, key, &index);
|
||||
else
|
||||
|
@ -512,7 +525,8 @@ static int nilfs_btree_do_lookup_last(const struct nilfs_btree *btree,
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
node = nilfs_btree_get_nonroot_node(path, level);
|
||||
BUG_ON(level != nilfs_btree_node_get_level(node));
|
||||
if (nilfs_btree_bad_node(node, level))
|
||||
return -EINVAL;
|
||||
index = nilfs_btree_node_get_nchildren(node) - 1;
|
||||
ptr = nilfs_btree_node_get_ptr(btree, node, index);
|
||||
path[level].bp_index = index;
|
||||
|
|
Loading…
Reference in a new issue