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.
This commit is contained in:
parent
8d4e8140ef
commit
54a179e7b8
|
@ -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 */
|
/* returns TRUE if someone is waiting for the next txg to sync */
|
||||||
extern boolean_t txg_sync_waiting(struct dsl_pool *dp);
|
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.
|
* Per-txg object lists.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1813,6 +1813,7 @@ EXPORT_SYMBOL(dmu_objset_destroy);
|
||||||
EXPORT_SYMBOL(dmu_objset_snapshot);
|
EXPORT_SYMBOL(dmu_objset_snapshot);
|
||||||
EXPORT_SYMBOL(dmu_objset_stats);
|
EXPORT_SYMBOL(dmu_objset_stats);
|
||||||
EXPORT_SYMBOL(dmu_objset_fast_stat);
|
EXPORT_SYMBOL(dmu_objset_fast_stat);
|
||||||
|
EXPORT_SYMBOL(dmu_objset_spa);
|
||||||
EXPORT_SYMBOL(dmu_objset_space);
|
EXPORT_SYMBOL(dmu_objset_space);
|
||||||
EXPORT_SYMBOL(dmu_objset_fsid_guid);
|
EXPORT_SYMBOL(dmu_objset_fsid_guid);
|
||||||
EXPORT_SYMBOL(dmu_objset_find);
|
EXPORT_SYMBOL(dmu_objset_find);
|
||||||
|
|
|
@ -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
|
static void
|
||||||
txg_sync_thread(dsl_pool_t *dp)
|
txg_sync_thread(dsl_pool_t *dp)
|
||||||
{
|
{
|
||||||
|
@ -735,6 +749,7 @@ EXPORT_SYMBOL(txg_register_callbacks);
|
||||||
EXPORT_SYMBOL(txg_delay);
|
EXPORT_SYMBOL(txg_delay);
|
||||||
EXPORT_SYMBOL(txg_wait_synced);
|
EXPORT_SYMBOL(txg_wait_synced);
|
||||||
EXPORT_SYMBOL(txg_wait_open);
|
EXPORT_SYMBOL(txg_wait_open);
|
||||||
|
EXPORT_SYMBOL(txg_wait_callbacks);
|
||||||
EXPORT_SYMBOL(txg_stalled);
|
EXPORT_SYMBOL(txg_stalled);
|
||||||
EXPORT_SYMBOL(txg_sync_waiting);
|
EXPORT_SYMBOL(txg_sync_waiting);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue