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

Reply via email to