From: Edward Shishkin Problem: Failed assertion (nikita-2754): child znode is not loaded when looking at its number of items in kill_hook_internal(). Nobody cares about its loading. Fixup: Added missed zload/zrelse of the child. Signed-off-by: Andrew Morton --- fs/reiser4/plugin/item/internal.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff -puN fs/reiser4/plugin/item/internal.c~reiser4-fix-kill_hook_internal fs/reiser4/plugin/item/internal.c --- a/fs/reiser4/plugin/item/internal.c~reiser4-fix-kill_hook_internal +++ a/fs/reiser4/plugin/item/internal.c @@ -308,6 +308,7 @@ int kill_hook_internal(const coord_t * i struct carry_kill_data *p UNUSED_ARG) { znode *child; + int result = 0; assert("nikita-1222", item != NULL); assert("nikita-1224", from == 0); @@ -316,7 +317,14 @@ int kill_hook_internal(const coord_t * i child = znode_at(item, item->node); if (IS_ERR(child)) return PTR_ERR(child); - else if (node_is_empty(child)) { + assert("edward-1560", child != NULL); + + result = zload(child); + if (result) { + zput(child); + return result; + } + if (node_is_empty(child)) { reiser4_tree *tree; assert("nikita-1397", znode_is_write_locked(child)); @@ -328,14 +336,14 @@ int kill_hook_internal(const coord_t * i init_parent_coord(&child->in_parent, NULL); --item->node->c_count; write_unlock_tree(tree); - zput(child); - return 0; } else { warning("nikita-1223", "Cowardly refuse to remove link to non-empty node"); - zput(child); - return RETERR(-EIO); + result = RETERR(-EIO); } + zrelse(child); + zput(child); + return result; } /* hook called by ->shift() node plugin method when iternal item was just _