diff options
author | Ricardo M. Correia <[email protected]> | 2011-01-21 14:35:41 -0800 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2011-02-16 11:20:06 -0800 |
commit | 54a179e7b80413bd48cd2cd259110fb493d0215e (patch) | |
tree | 8bce4e2af34f745165ee0b225e0616ee823dfc7d /module/zfs/txg.c | |
parent | 8d4e8140ef67fa9c8fa0b1d0f5b1d5d36c747969 (diff) |
Add API to wait for pending commit callbacks
This adds an API to wait for pending commit callbacks of already-synced
transactions to finish processing. This is needed by the DMU-OSD in
Lustre during device finalization when some callbacks may still not be
called, this leads to non-zero reference count errors. See lustre.org
bug 23931.
Diffstat (limited to 'module/zfs/txg.c')
-rw-r--r-- | module/zfs/txg.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/module/zfs/txg.c b/module/zfs/txg.c index 382a2a91c..5afb139dd 100644 --- a/module/zfs/txg.c +++ b/module/zfs/txg.c @@ -350,6 +350,20 @@ txg_dispatch_callbacks(dsl_pool_t *dp, uint64_t txg) } } +/* + * Wait for pending commit callbacks of already-synced transactions to finish + * processing. + * Calling this function from within a commit callback will deadlock. + */ +void +txg_wait_callbacks(dsl_pool_t *dp) +{ + tx_state_t *tx = &dp->dp_tx; + + if (tx->tx_commit_cb_taskq != NULL) + taskq_wait(tx->tx_commit_cb_taskq); +} + static void txg_sync_thread(dsl_pool_t *dp) { @@ -735,6 +749,7 @@ EXPORT_SYMBOL(txg_register_callbacks); EXPORT_SYMBOL(txg_delay); EXPORT_SYMBOL(txg_wait_synced); EXPORT_SYMBOL(txg_wait_open); +EXPORT_SYMBOL(txg_wait_callbacks); EXPORT_SYMBOL(txg_stalled); EXPORT_SYMBOL(txg_sync_waiting); #endif |