From 54a179e7b80413bd48cd2cd259110fb493d0215e Mon Sep 17 00:00:00 2001 From: "Ricardo M. Correia" Date: Fri, 21 Jan 2011 14:35:41 -0800 Subject: 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. --- include/sys/txg.h | 6 ++++++ module/zfs/dmu_objset.c | 1 + module/zfs/txg.c | 15 +++++++++++++++ 3 files changed, 22 insertions(+) diff --git a/include/sys/txg.h b/include/sys/txg.h index e323d5efabb7..263693846d54 100644 --- a/include/sys/txg.h +++ b/include/sys/txg.h @@ -107,6 +107,12 @@ extern boolean_t txg_stalled(struct dsl_pool *dp); /* returns TRUE if someone is waiting for the next txg to sync */ extern boolean_t txg_sync_waiting(struct dsl_pool *dp); +/* + * Wait for pending commit callbacks of already-synced transactions to finish + * processing. + */ +extern void txg_wait_callbacks(struct dsl_pool *dp); + /* * Per-txg object lists. */ diff --git a/module/zfs/dmu_objset.c b/module/zfs/dmu_objset.c index 7da5c1aa08f5..0ff95a64e0bd 100644 --- a/module/zfs/dmu_objset.c +++ b/module/zfs/dmu_objset.c @@ -1813,6 +1813,7 @@ EXPORT_SYMBOL(dmu_objset_destroy); EXPORT_SYMBOL(dmu_objset_snapshot); EXPORT_SYMBOL(dmu_objset_stats); EXPORT_SYMBOL(dmu_objset_fast_stat); +EXPORT_SYMBOL(dmu_objset_spa); EXPORT_SYMBOL(dmu_objset_space); EXPORT_SYMBOL(dmu_objset_fsid_guid); EXPORT_SYMBOL(dmu_objset_find); diff --git a/module/zfs/txg.c b/module/zfs/txg.c index 382a2a91c7b0..5afb139ddfb0 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 -- cgit v1.2.3