Hi.
I discovered the following deadlock which can occur on adding cache
device. When we call this command:
# zpool add <pool> cache <disk>
It hangs here:
mutex_enter(&l2arc_dev_mtx)
l2arc_add_vdev()
spa_load_l2cache()
spa_vdev_add()
zfs_ioc_vdev_add()
zfsdev_ioctl()
ioctl()
syscall()
It cannot acquire the l2arc_dev_mtx mutex, because it is already held by
the l2arc_feed_thread thread. The l2arc_feed_thread cannot release it
because it hangs here:
cv_wait(&scl->scl_cv, &scl->scl_lock)
spa_config_enter()
zio_create()
zio_write_phys()
l2arc_feed_thread()
It will wait here forever, because the previous process hangs, and
spa_config_exit() is called at the end of spa_vdev_add() (via
spa_vdev_exit()) and spa_config_exit() calls cv_broadcast() for this
condvar.
--
Pawel Jakub Dawidek http://www.wheel.pl
pjd at FreeBSD.org http://www.FreeBSD.org
FreeBSD committer Am I Evil? Yes, I Am!
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
URL:
<http://mail.opensolaris.org/pipermail/zfs-code/attachments/20080523/749a09cf/attachment.bin>