Xin Li
2013-09-18 19:44:43 UTC
Hi,
We have seen this panic a few times in field but have not yet figured
out a way to reproduce it. The backtrace is usually
vdev_mirror_io_start() -> vdev_mirror_child_select() ->
vdev_is_dead()+0x1.
Looking at the code, it seems like:
In vdev_mirror_child_select():
for (i = 0, c = mm->mm_preferred; i < mm->mm_children; i++, c++) {
(...)
if (!vdev_readable(mc->mc_vd)) {
Where, in vdev_readable, it calls vdev_is_dead() with NULL (based on
the fault pointer we have seen).
My question is, should we expect mc->mc_vd be not NULL? (Apparently
vdev_lookup_top could return NULL). If so, maybe we should add a test
in vdev_is_dead?
Cheers,
- --
Xin LI <***@delphij.net> https://www.delphij.net/
FreeBSD - The Power to Serve! Live free or die
We have seen this panic a few times in field but have not yet figured
out a way to reproduce it. The backtrace is usually
vdev_mirror_io_start() -> vdev_mirror_child_select() ->
vdev_is_dead()+0x1.
Looking at the code, it seems like:
In vdev_mirror_child_select():
for (i = 0, c = mm->mm_preferred; i < mm->mm_children; i++, c++) {
(...)
if (!vdev_readable(mc->mc_vd)) {
Where, in vdev_readable, it calls vdev_is_dead() with NULL (based on
the fault pointer we have seen).
My question is, should we expect mc->mc_vd be not NULL? (Apparently
vdev_lookup_top could return NULL). If so, maybe we should add a test
in vdev_is_dead?
Cheers,
- --
Xin LI <***@delphij.net> https://www.delphij.net/
FreeBSD - The Power to Serve! Live free or die