panic: assertion: parent != NULL in hammer_cursor_removed_node (v2.5.1.187.gc1543-DEV, X86_64)

YONETANI Tomokazu qhwt+dfly at les.ath.cx
Sat Nov 7 14:24:42 PST 2009


Hi,

On Sat, Nov 07, 2009 at 05:23:12PM +0530, Saifi Khan wrote:
> After about 8 hrs of uptime on the X86_64 build, the system had
> an assertion failure.
> 
>  assertion: parent != NULL in hammer_cursor_removed_node

Although the backtrace is garbled, this is most likely the panic
introduced by the committed fix for http://bugs.dragonflybsd.org/issue1577,
especially since it happened while running `hammer cleanup' from
a periodic(8) job.
For some reason the search facility on our bug tracker can't find it
with a keyword like `hammer_cursor_removed_node' even with full text search.

The commit f3a4893b has moved the call to hammer_cursor_removed_node()
in btree_remove() to after the recursive call to itself, but a call to
btree_remove() moves the cursor up after deleting the sub tree, so it's
possible that it reaches the root of the tree during the recursion.
When that happens, cursor->parent is set to NULL and ondisk->parent of
the current node is also 0.

I have a bandaid for this problem (it's being tested):

HAMMER VFS - don't call hammer_cursor_removed_node when the recursion reached the root of the filesystem

---
 sys/vfs/hammer/hammer_btree.c |   12 +++++++++---
 1 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/sys/vfs/hammer/hammer_btree.c b/sys/vfs/hammer/hammer_btree.c
index 6ee1e1a..551fb5f 100644
--- a/sys/vfs/hammer/hammer_btree.c
+++ b/sys/vfs/hammer/hammer_btree.c
@@ -2226,9 +2226,15 @@ btree_remove(hammer_cursor_t cursor)
 			hammer_cursor_deleted_element(cursor->node, 0);
 			error = btree_remove(cursor);
 			if (error == 0) {
-				hammer_cursor_removed_node(
-					node, cursor->parent,
-					cursor->parent_index);
+				KKASSERT(
+					cursor->parent != NULL ||
+					cursor->node->ondisk->parent == 0
+				);
+				if (cursor->parent != NULL) {
+					hammer_cursor_removed_node(
+						node, cursor->parent,
+						cursor->parent_index);
+				}
 				hammer_modify_node_all(cursor->trans, node);
 				ondisk = node->ondisk;
 				ondisk->type = HAMMER_BTREE_TYPE_DELETED;
-- 
1.6.4






More information about the Bugs mailing list