]> git.proxmox.com Git - mirror_zfs.git/commit - module/zfs/zio.c
Avoid deadlock when removing L2ARC devices under I/O
authorGeorge Amanakis <gamanakis@gmail.com>
Thu, 17 Jun 2021 00:17:42 +0000 (03:17 +0300)
committerGitHub <noreply@github.com>
Thu, 17 Jun 2021 00:17:42 +0000 (18:17 -0600)
commit9ffcaa370aee6871c92c7c84aa65942fba63a884
tree8bc8dad3a14c17f0a17279867e9edcdfa174757b
parentff3175040572baae1aacf5d9062192c5df849030
Avoid deadlock when removing L2ARC devices under I/O

In case we have I/O and try to remove an L2ARC device a deadlock might
occur. arc_read()->zio_read()->zfs_blkptr_verify() waits for SCL_VDEV
to be dropped while holding the hash_lock. However, spa_l2cache_load()
holds SCL_ALL and waits for the hash_lock in l2arc_evict().

Fix this by moving zfs_blkptr_verify() to the top top arc_read() before
the hash_lock is taken. Verify the block pointer and return a checksum
error if damaged rather than halting the system, by using
BLK_VERIFY_LOG instead of BLK_VERIFY_HALT.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Mark Maybee <mark.maybee@delphix.com>
Signed-off-by: George Amanakis <gamanakis@gmail.com>
Closes #12054
module/zfs/arc.c
module/zfs/zio.c