mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-26 03:09:34 +03:00
Fix panic in dsl_process_sub_livelist for EINTR
= Issue Recently we hit an assertion panic in `dsl_process_sub_livelist` while exporting the spa and interrupting `bpobj_iterate_nofree`. In that case `bpobj_iterate_nofree` stops mid-way returning an EINTR without clearing the intermediate AVL tree that keeps track of the livelist entries it has encountered so far. At that point the code has a VERIFY for the number of elements of the AVL expecting it to be zero (which is not the case for EINTR). = Fix Cleanup any intermediate state before destroying the AVL when encountering EINTR. Also added a comment documenting the scenario where the EINTR comes up. There is no need to do anything else for the calles of `dsl_process_sub_livelist` as they already handle the EINTR case. Reviewed-by: Matthew Ahrens <mahrens@delphix.com> Reviewed-by: Mark Maybee <mark.maybee@delphix.com> Reviewed-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Signed-off-by: Serapheim Dimitropoulos <serapheim@delphix.com> Closes #13939
This commit is contained in:
parent
1b87195c3c
commit
4acc36ed7c
@ -1028,8 +1028,13 @@ dsl_process_sub_livelist(bpobj_t *bpobj, bplist_t *to_free, zthr_t *t,
|
|||||||
.t = t
|
.t = t
|
||||||
};
|
};
|
||||||
int err = bpobj_iterate_nofree(bpobj, dsl_livelist_iterate, &arg, size);
|
int err = bpobj_iterate_nofree(bpobj, dsl_livelist_iterate, &arg, size);
|
||||||
|
VERIFY(err != 0 || avl_numnodes(&avl) == 0);
|
||||||
|
|
||||||
VERIFY0(avl_numnodes(&avl));
|
void *cookie = NULL;
|
||||||
|
livelist_entry_t *le = NULL;
|
||||||
|
while ((le = avl_destroy_nodes(&avl, &cookie)) != NULL) {
|
||||||
|
kmem_free(le, sizeof (livelist_entry_t));
|
||||||
|
}
|
||||||
avl_destroy(&avl);
|
avl_destroy(&avl);
|
||||||
return (err);
|
return (err);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user