zvol_probe should return NULL when the device isn't found.
[zfs.git] / module / zfs / txg.c
index 1cb3cb6..e14bff2 100644 (file)
@@ -349,7 +349,7 @@ txg_dispatch_callbacks(dsl_pool_t *dp, uint64_t txg)
                            TASKQ_THREADS_CPU_PCT | TASKQ_PREPOPULATE);
                }
 
-               cb_list = kmem_alloc(sizeof (list_t), KM_SLEEP);
+               cb_list = kmem_alloc(sizeof (list_t), KM_PUSHPAGE);
                list_create(cb_list, sizeof (dmu_tx_callback_t),
                    offsetof(dmu_tx_callback_t, dcb_node));
 
@@ -384,15 +384,11 @@ txg_sync_thread(dsl_pool_t *dp)
 
 #ifdef _KERNEL
        /*
-        * Disable the normal reclaim path for the txg_sync thread.  This
-        * ensures the thread will never enter dmu_tx_assign() which can
-        * otherwise occur due to direct reclaim.  If this is allowed to
-        * happen the system can deadlock.  Direct reclaim call path:
-        *
-        *   ->shrink_icache_memory->prune_icache->dispose_list->
-        *   clear_inode->zpl_clear_inode->zfs_inactive->dmu_tx_assign
+        * Annotate this process with a flag that indicates that it is
+        * unsafe to use KM_SLEEP during memory allocations due to the
+        * potential for a deadlock.  KM_PUSHPAGE should be used instead.
         */
-       current->flags |= PF_MEMALLOC;
+       current->flags |= PF_NOFS;
 #endif /* _KERNEL */
 
        txg_thread_enter(tx, &cpr);