As I am looking at this further, I convince myself this should really be an assert. (I am running release builds, so assert-s do not fire).
I think in a debug build, I should be seeing the !list_empty() assert in: list_remove(list_t *list, void *object) { list_node_t *lold = list_d2l(list, object); ASSERT(!list_empty(list)); ASSERT(lold->list_next != NULL); list_remove_node(lold); } I am suspecting, maybe this is a race. Assuming there is not other interfering thread, this crash could never happen.. tatic void zfs_acl_release_nodes(zfs_acl_t *aclp) { zfs_acl_node_t *aclnode; while (aclnode = list_head(&aclp->z_acl)) { list_remove(&aclp->z_acl, aclnode); zfs_acl_node_free(aclnode); } aclp->z_acl_count = 0; aclp->z_acl_bytes = 0; } List_head does a list_empty() check, and returns null on empty. So if we got past that, list_remove() should never find an empty list, perhaps there is interference from another thread. -- This message posted from opensolaris.org _______________________________________________ zfs-discuss mailing list zfs-discuss@opensolaris.org http://mail.opensolaris.org/mailman/listinfo/zfs-discuss