nowait synctask must succeed
If a `zfs_space_check_t` other than `ZFS_SPACE_CHECK_NONE` is used with `dsl_sync_task_nowait()`, the sync task may fail due to ENOSPC. However, there is no way to notice or communicate this failure, so it's extremely difficult to use this functionality correctly, and in fact almost all callers use `ZFS_SPACE_CHECK_NONE`. This commit removes the `zfs_space_check_t` argument from `dsl_sync_task_nowait()`, and always uses `ZFS_SPACE_CHECK_NONE`. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Matthew Ahrens <mahrens@delphix.com> Closes #10855
This commit is contained in:
parent
cd80273909
commit
3808032489
|
@ -112,11 +112,11 @@ void dsl_sync_task_sync(dsl_sync_task_t *, dmu_tx_t *);
|
||||||
int dsl_sync_task(const char *, dsl_checkfunc_t *,
|
int dsl_sync_task(const char *, dsl_checkfunc_t *,
|
||||||
dsl_syncfunc_t *, void *, int, zfs_space_check_t);
|
dsl_syncfunc_t *, void *, int, zfs_space_check_t);
|
||||||
void dsl_sync_task_nowait(struct dsl_pool *, dsl_syncfunc_t *,
|
void dsl_sync_task_nowait(struct dsl_pool *, dsl_syncfunc_t *,
|
||||||
void *, int, zfs_space_check_t, dmu_tx_t *);
|
void *, dmu_tx_t *);
|
||||||
int dsl_early_sync_task(const char *, dsl_checkfunc_t *,
|
int dsl_early_sync_task(const char *, dsl_checkfunc_t *,
|
||||||
dsl_syncfunc_t *, void *, int, zfs_space_check_t);
|
dsl_syncfunc_t *, void *, int, zfs_space_check_t);
|
||||||
void dsl_early_sync_task_nowait(struct dsl_pool *, dsl_syncfunc_t *,
|
void dsl_early_sync_task_nowait(struct dsl_pool *, dsl_syncfunc_t *,
|
||||||
void *, int, zfs_space_check_t, dmu_tx_t *);
|
void *, dmu_tx_t *);
|
||||||
int dsl_sync_task_sig(const char *, dsl_checkfunc_t *, dsl_syncfunc_t *,
|
int dsl_sync_task_sig(const char *, dsl_checkfunc_t *, dsl_syncfunc_t *,
|
||||||
dsl_sigfunc_t *, void *, int, zfs_space_check_t);
|
dsl_sigfunc_t *, void *, int, zfs_space_check_t);
|
||||||
|
|
||||||
|
|
|
@ -568,8 +568,7 @@ commit_rl_updates(objset_t *os, struct merge_data *md, uint64_t object,
|
||||||
uint64_t txg = dmu_tx_get_txg(tx);
|
uint64_t txg = dmu_tx_get_txg(tx);
|
||||||
if (!md->md_synctask_txg[txg & TXG_MASK]) {
|
if (!md->md_synctask_txg[txg & TXG_MASK]) {
|
||||||
dsl_sync_task_nowait(dmu_tx_pool(tx),
|
dsl_sync_task_nowait(dmu_tx_pool(tx),
|
||||||
redaction_list_update_sync, md, 5, ZFS_SPACE_CHECK_NONE,
|
redaction_list_update_sync, md, tx);
|
||||||
tx);
|
|
||||||
md->md_synctask_txg[txg & TXG_MASK] = B_TRUE;
|
md->md_synctask_txg[txg & TXG_MASK] = B_TRUE;
|
||||||
md->md_latest_synctask_txg = txg;
|
md->md_latest_synctask_txg = txg;
|
||||||
}
|
}
|
||||||
|
|
|
@ -170,15 +170,13 @@ dsl_sync_task_sig(const char *pool, dsl_checkfunc_t *checkfunc,
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dsl_sync_task_nowait_common(dsl_pool_t *dp, dsl_syncfunc_t *syncfunc, void *arg,
|
dsl_sync_task_nowait_common(dsl_pool_t *dp, dsl_syncfunc_t *syncfunc, void *arg,
|
||||||
int blocks_modified, zfs_space_check_t space_check, dmu_tx_t *tx,
|
dmu_tx_t *tx, boolean_t early)
|
||||||
boolean_t early)
|
|
||||||
{
|
{
|
||||||
dsl_sync_task_t *dst = kmem_zalloc(sizeof (*dst), KM_SLEEP);
|
dsl_sync_task_t *dst = kmem_zalloc(sizeof (*dst), KM_SLEEP);
|
||||||
|
|
||||||
dst->dst_pool = dp;
|
dst->dst_pool = dp;
|
||||||
dst->dst_txg = dmu_tx_get_txg(tx);
|
dst->dst_txg = dmu_tx_get_txg(tx);
|
||||||
dst->dst_space = blocks_modified << DST_AVG_BLKSHIFT;
|
dst->dst_space_check = ZFS_SPACE_CHECK_NONE;
|
||||||
dst->dst_space_check = space_check;
|
|
||||||
dst->dst_checkfunc = dsl_null_checkfunc;
|
dst->dst_checkfunc = dsl_null_checkfunc;
|
||||||
dst->dst_syncfunc = syncfunc;
|
dst->dst_syncfunc = syncfunc;
|
||||||
dst->dst_arg = arg;
|
dst->dst_arg = arg;
|
||||||
|
@ -192,18 +190,16 @@ dsl_sync_task_nowait_common(dsl_pool_t *dp, dsl_syncfunc_t *syncfunc, void *arg,
|
||||||
|
|
||||||
void
|
void
|
||||||
dsl_sync_task_nowait(dsl_pool_t *dp, dsl_syncfunc_t *syncfunc, void *arg,
|
dsl_sync_task_nowait(dsl_pool_t *dp, dsl_syncfunc_t *syncfunc, void *arg,
|
||||||
int blocks_modified, zfs_space_check_t space_check, dmu_tx_t *tx)
|
dmu_tx_t *tx)
|
||||||
{
|
{
|
||||||
dsl_sync_task_nowait_common(dp, syncfunc, arg,
|
dsl_sync_task_nowait_common(dp, syncfunc, arg, tx, B_FALSE);
|
||||||
blocks_modified, space_check, tx, B_FALSE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
dsl_early_sync_task_nowait(dsl_pool_t *dp, dsl_syncfunc_t *syncfunc, void *arg,
|
dsl_early_sync_task_nowait(dsl_pool_t *dp, dsl_syncfunc_t *syncfunc, void *arg,
|
||||||
int blocks_modified, zfs_space_check_t space_check, dmu_tx_t *tx)
|
dmu_tx_t *tx)
|
||||||
{
|
{
|
||||||
dsl_sync_task_nowait_common(dp, syncfunc, arg,
|
dsl_sync_task_nowait_common(dp, syncfunc, arg, tx, B_TRUE);
|
||||||
blocks_modified, space_check, tx, B_TRUE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -2688,8 +2688,7 @@ spa_livelist_condense_cb(void *arg, zthr_t *t)
|
||||||
lca->first_size = first_size;
|
lca->first_size = first_size;
|
||||||
lca->next_size = next_size;
|
lca->next_size = next_size;
|
||||||
dsl_sync_task_nowait(spa_get_dsl(spa),
|
dsl_sync_task_nowait(spa_get_dsl(spa),
|
||||||
spa_livelist_condense_sync, lca, 0,
|
spa_livelist_condense_sync, lca, tx);
|
||||||
ZFS_SPACE_CHECK_NONE, tx);
|
|
||||||
dmu_tx_commit(tx);
|
dmu_tx_commit(tx);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -397,8 +397,7 @@ spa_history_log_nvl(spa_t *spa, nvlist_t *nvl)
|
||||||
fnvlist_add_uint64(nvarg, ZPOOL_HIST_WHO, crgetruid(CRED()));
|
fnvlist_add_uint64(nvarg, ZPOOL_HIST_WHO, crgetruid(CRED()));
|
||||||
|
|
||||||
/* Kick this off asynchronously; errors are ignored. */
|
/* Kick this off asynchronously; errors are ignored. */
|
||||||
dsl_sync_task_nowait(spa_get_dsl(spa), spa_history_log_sync,
|
dsl_sync_task_nowait(spa_get_dsl(spa), spa_history_log_sync, nvarg, tx);
|
||||||
nvarg, 0, ZFS_SPACE_CHECK_NONE, tx);
|
|
||||||
dmu_tx_commit(tx);
|
dmu_tx_commit(tx);
|
||||||
|
|
||||||
/* spa_history_log_sync will free nvl */
|
/* spa_history_log_sync will free nvl */
|
||||||
|
@ -532,7 +531,7 @@ log_internal(nvlist_t *nvl, const char *operation, spa_t *spa,
|
||||||
spa_history_log_sync(nvl, tx);
|
spa_history_log_sync(nvl, tx);
|
||||||
} else {
|
} else {
|
||||||
dsl_sync_task_nowait(spa_get_dsl(spa),
|
dsl_sync_task_nowait(spa_get_dsl(spa),
|
||||||
spa_history_log_sync, nvl, 0, ZFS_SPACE_CHECK_NONE, tx);
|
spa_history_log_sync, nvl, tx);
|
||||||
}
|
}
|
||||||
/* spa_history_log_sync() will free nvl */
|
/* spa_history_log_sync() will free nvl */
|
||||||
}
|
}
|
||||||
|
|
|
@ -576,8 +576,7 @@ spa_condense_indirect_commit_entry(spa_t *spa,
|
||||||
*/
|
*/
|
||||||
if (list_is_empty(&sci->sci_new_mapping_entries[txgoff])) {
|
if (list_is_empty(&sci->sci_new_mapping_entries[txgoff])) {
|
||||||
dsl_sync_task_nowait(dmu_tx_pool(tx),
|
dsl_sync_task_nowait(dmu_tx_pool(tx),
|
||||||
spa_condense_indirect_commit_sync, sci,
|
spa_condense_indirect_commit_sync, sci, tx);
|
||||||
0, ZFS_SPACE_CHECK_NONE, tx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vdev_indirect_mapping_entry_t *vime =
|
vdev_indirect_mapping_entry_t *vime =
|
||||||
|
|
|
@ -126,7 +126,7 @@ vdev_initialize_change_state(vdev_t *vd, vdev_initializing_state_t new_state)
|
||||||
dmu_tx_t *tx = dmu_tx_create_dd(spa_get_dsl(spa)->dp_mos_dir);
|
dmu_tx_t *tx = dmu_tx_create_dd(spa_get_dsl(spa)->dp_mos_dir);
|
||||||
VERIFY0(dmu_tx_assign(tx, TXG_WAIT));
|
VERIFY0(dmu_tx_assign(tx, TXG_WAIT));
|
||||||
dsl_sync_task_nowait(spa_get_dsl(spa), vdev_initialize_zap_update_sync,
|
dsl_sync_task_nowait(spa_get_dsl(spa), vdev_initialize_zap_update_sync,
|
||||||
guid, 2, ZFS_SPACE_CHECK_NONE, tx);
|
guid, tx);
|
||||||
|
|
||||||
switch (new_state) {
|
switch (new_state) {
|
||||||
case VDEV_INITIALIZE_ACTIVE:
|
case VDEV_INITIALIZE_ACTIVE:
|
||||||
|
@ -216,8 +216,7 @@ vdev_initialize_write(vdev_t *vd, uint64_t start, uint64_t size, abd_t *data)
|
||||||
|
|
||||||
/* This is the first write of this txg. */
|
/* This is the first write of this txg. */
|
||||||
dsl_sync_task_nowait(spa_get_dsl(spa),
|
dsl_sync_task_nowait(spa_get_dsl(spa),
|
||||||
vdev_initialize_zap_update_sync, guid, 2,
|
vdev_initialize_zap_update_sync, guid, tx);
|
||||||
ZFS_SPACE_CHECK_RESERVED, tx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -267,7 +267,7 @@ vdev_rebuild_initiate(vdev_t *vd)
|
||||||
vd->vdev_rebuilding = B_TRUE;
|
vd->vdev_rebuilding = B_TRUE;
|
||||||
|
|
||||||
dsl_sync_task_nowait(spa_get_dsl(spa), vdev_rebuild_initiate_sync,
|
dsl_sync_task_nowait(spa_get_dsl(spa), vdev_rebuild_initiate_sync,
|
||||||
(void *)(uintptr_t)vd->vdev_id, 0, ZFS_SPACE_CHECK_NONE, tx);
|
(void *)(uintptr_t)vd->vdev_id, tx);
|
||||||
dmu_tx_commit(tx);
|
dmu_tx_commit(tx);
|
||||||
|
|
||||||
vdev_rebuild_log_notify(spa, vd, ESC_ZFS_RESILVER_START);
|
vdev_rebuild_log_notify(spa, vd, ESC_ZFS_RESILVER_START);
|
||||||
|
@ -553,8 +553,7 @@ vdev_rebuild_range(vdev_rebuild_t *vr, uint64_t start, uint64_t size)
|
||||||
vr->vr_scan_offset[txg & TXG_MASK] = start;
|
vr->vr_scan_offset[txg & TXG_MASK] = start;
|
||||||
dsl_sync_task_nowait(spa_get_dsl(spa),
|
dsl_sync_task_nowait(spa_get_dsl(spa),
|
||||||
vdev_rebuild_update_sync,
|
vdev_rebuild_update_sync,
|
||||||
(void *)(uintptr_t)vd->vdev_id, 2,
|
(void *)(uintptr_t)vd->vdev_id, tx);
|
||||||
ZFS_SPACE_CHECK_RESERVED, tx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* When exiting write out our progress. */
|
/* When exiting write out our progress. */
|
||||||
|
@ -875,16 +874,14 @@ vdev_rebuild_thread(void *arg)
|
||||||
* by a pool checkpoint. See the dsl_scan_done() comments.
|
* by a pool checkpoint. See the dsl_scan_done() comments.
|
||||||
*/
|
*/
|
||||||
dsl_sync_task_nowait(dp, vdev_rebuild_complete_sync,
|
dsl_sync_task_nowait(dp, vdev_rebuild_complete_sync,
|
||||||
(void *)(uintptr_t)vd->vdev_id, 0,
|
(void *)(uintptr_t)vd->vdev_id, tx);
|
||||||
ZFS_SPACE_CHECK_NONE, tx);
|
|
||||||
} else if (vd->vdev_rebuild_cancel_wanted) {
|
} else if (vd->vdev_rebuild_cancel_wanted) {
|
||||||
/*
|
/*
|
||||||
* The rebuild operation was canceled. This will occur when
|
* The rebuild operation was canceled. This will occur when
|
||||||
* a device participating in the rebuild is detached.
|
* a device participating in the rebuild is detached.
|
||||||
*/
|
*/
|
||||||
dsl_sync_task_nowait(dp, vdev_rebuild_cancel_sync,
|
dsl_sync_task_nowait(dp, vdev_rebuild_cancel_sync,
|
||||||
(void *)(uintptr_t)vd->vdev_id, 0,
|
(void *)(uintptr_t)vd->vdev_id, tx);
|
||||||
ZFS_SPACE_CHECK_NONE, tx);
|
|
||||||
} else if (vd->vdev_rebuild_reset_wanted) {
|
} else if (vd->vdev_rebuild_reset_wanted) {
|
||||||
/*
|
/*
|
||||||
* Reset the running rebuild without canceling and restarting
|
* Reset the running rebuild without canceling and restarting
|
||||||
|
@ -892,8 +889,7 @@ vdev_rebuild_thread(void *arg)
|
||||||
* participate in the rebuild.
|
* participate in the rebuild.
|
||||||
*/
|
*/
|
||||||
dsl_sync_task_nowait(dp, vdev_rebuild_reset_sync,
|
dsl_sync_task_nowait(dp, vdev_rebuild_reset_sync,
|
||||||
(void *)(uintptr_t)vd->vdev_id, 0,
|
(void *)(uintptr_t)vd->vdev_id, tx);
|
||||||
ZFS_SPACE_CHECK_NONE, tx);
|
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* The rebuild operation should be suspended. This may occur
|
* The rebuild operation should be suspended. This may occur
|
||||||
|
|
|
@ -1167,8 +1167,8 @@ vdev_remove_replace_with_indirect(vdev_t *vd, uint64_t txg)
|
||||||
|
|
||||||
/* After this, we can not use svr. */
|
/* After this, we can not use svr. */
|
||||||
tx = dmu_tx_create_assigned(spa->spa_dsl_pool, txg);
|
tx = dmu_tx_create_assigned(spa->spa_dsl_pool, txg);
|
||||||
dsl_sync_task_nowait(spa->spa_dsl_pool, vdev_remove_complete_sync, svr,
|
dsl_sync_task_nowait(spa->spa_dsl_pool,
|
||||||
0, ZFS_SPACE_CHECK_NONE, tx);
|
vdev_remove_complete_sync, svr, tx);
|
||||||
dmu_tx_commit(tx);
|
dmu_tx_commit(tx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1317,7 +1317,7 @@ spa_vdev_copy_impl(vdev_t *vd, spa_vdev_removal_t *svr, vdev_copy_arg_t *vca,
|
||||||
|
|
||||||
if (svr->svr_max_offset_to_sync[txg & TXG_MASK] == 0) {
|
if (svr->svr_max_offset_to_sync[txg & TXG_MASK] == 0) {
|
||||||
dsl_sync_task_nowait(dmu_tx_pool(tx), vdev_mapping_sync,
|
dsl_sync_task_nowait(dmu_tx_pool(tx), vdev_mapping_sync,
|
||||||
svr, 0, ZFS_SPACE_CHECK_NONE, tx);
|
svr, tx);
|
||||||
}
|
}
|
||||||
|
|
||||||
svr->svr_max_offset_to_sync[txg & TXG_MASK] = range_tree_max(segs);
|
svr->svr_max_offset_to_sync[txg & TXG_MASK] = range_tree_max(segs);
|
||||||
|
@ -2143,8 +2143,7 @@ spa_vdev_remove_top(vdev_t *vd, uint64_t *txg)
|
||||||
vdev_config_dirty(vd);
|
vdev_config_dirty(vd);
|
||||||
dmu_tx_t *tx = dmu_tx_create_assigned(spa->spa_dsl_pool, *txg);
|
dmu_tx_t *tx = dmu_tx_create_assigned(spa->spa_dsl_pool, *txg);
|
||||||
dsl_sync_task_nowait(spa->spa_dsl_pool,
|
dsl_sync_task_nowait(spa->spa_dsl_pool,
|
||||||
vdev_remove_initiate_sync,
|
vdev_remove_initiate_sync, (void *)(uintptr_t)vd->vdev_id, tx);
|
||||||
(void *)(uintptr_t)vd->vdev_id, 0, ZFS_SPACE_CHECK_NONE, tx);
|
|
||||||
dmu_tx_commit(tx);
|
dmu_tx_commit(tx);
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
|
|
|
@ -317,7 +317,7 @@ vdev_trim_change_state(vdev_t *vd, vdev_trim_state_t new_state,
|
||||||
dmu_tx_t *tx = dmu_tx_create_dd(spa_get_dsl(spa)->dp_mos_dir);
|
dmu_tx_t *tx = dmu_tx_create_dd(spa_get_dsl(spa)->dp_mos_dir);
|
||||||
VERIFY0(dmu_tx_assign(tx, TXG_WAIT));
|
VERIFY0(dmu_tx_assign(tx, TXG_WAIT));
|
||||||
dsl_sync_task_nowait(spa_get_dsl(spa), vdev_trim_zap_update_sync,
|
dsl_sync_task_nowait(spa_get_dsl(spa), vdev_trim_zap_update_sync,
|
||||||
guid, 2, ZFS_SPACE_CHECK_NONE, tx);
|
guid, tx);
|
||||||
|
|
||||||
switch (new_state) {
|
switch (new_state) {
|
||||||
case VDEV_TRIM_ACTIVE:
|
case VDEV_TRIM_ACTIVE:
|
||||||
|
@ -510,8 +510,7 @@ vdev_trim_range(trim_args_t *ta, uint64_t start, uint64_t size)
|
||||||
|
|
||||||
/* This is the first write of this txg. */
|
/* This is the first write of this txg. */
|
||||||
dsl_sync_task_nowait(spa_get_dsl(spa),
|
dsl_sync_task_nowait(spa_get_dsl(spa),
|
||||||
vdev_trim_zap_update_sync, guid, 2,
|
vdev_trim_zap_update_sync, guid, tx);
|
||||||
ZFS_SPACE_CHECK_RESERVED, tx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue