]> granicus.if.org Git - zfs/commitdiff
Use MUTEX_FSTRANS on l2arc_buflist_mtx
authorChunwei Chen <tuxoko@gmail.com>
Tue, 17 Mar 2015 06:54:57 +0000 (23:54 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 18 Mar 2015 16:29:38 +0000 (09:29 -0700)
Use MUTEX_FSTRANS on l2arc_buflist_mtx to prevent the following deadlock
scenario:
1. arc_release() -> hash_lock -> l2arc_buflist_mtx
2. l2arc_write_buffers() -> l2arc_buflist_mtx -> (direct reclaim) ->
   arc_buf_remove_ref() -> hash_lock

Signed-off-by: Chunwei Chen <tuxoko@gmail.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Signed-off-by: Tim Chase <tim@chase2k.com>
Issue #3160

module/zfs/arc.c

index 9a81b4c59944feaa8068b28e6bb15b6554b38ca8..6c625c108ec5ef066ff93a614edf87aceef2eb3f 100644 (file)
@@ -5530,7 +5530,7 @@ l2arc_init(void)
        mutex_init(&l2arc_feed_thr_lock, NULL, MUTEX_DEFAULT, NULL);
        cv_init(&l2arc_feed_thr_cv, NULL, CV_DEFAULT, NULL);
        mutex_init(&l2arc_dev_mtx, NULL, MUTEX_DEFAULT, NULL);
-       mutex_init(&l2arc_buflist_mtx, NULL, MUTEX_DEFAULT, NULL);
+       mutex_init(&l2arc_buflist_mtx, NULL, MUTEX_FSTRANS, NULL);
        mutex_init(&l2arc_free_on_write_mtx, NULL, MUTEX_DEFAULT, NULL);
 
        l2arc_dev_list = &L2ARC_dev_list;