]> granicus.if.org Git - zfs/commitdiff
Fix ASSERTION(!dsl_pool_sync_context(tx->tx_pool))
authorBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 31 Mar 2011 17:05:58 +0000 (10:05 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 7 Apr 2011 16:52:16 +0000 (09:52 -0700)
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

module/zfs/txg.c

index 00c1c7d26abe64dbf96d27ececd1be5d8f542817..340c42ae84a395333d314507616ec4eb6deba848 100644 (file)
@@ -372,6 +372,19 @@ txg_sync_thread(dsl_pool_t *dp)
        callb_cpr_t cpr;
        uint64_t start, delta;
 
+#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
+        */
+       current->flags |= PF_MEMALLOC;
+#endif /* _KERNEL */
+
        txg_thread_enter(tx, &cpr);
 
        start = delta = 0;