diff --git a/include/sys/sa.h b/include/sys/sa.h index 718cbfbd5..b8db0c130 100644 --- a/include/sys/sa.h +++ b/include/sys/sa.h @@ -139,6 +139,7 @@ void sa_set_userp(sa_handle_t *, void *); dmu_buf_t *sa_get_db(sa_handle_t *); uint64_t sa_handle_object(sa_handle_t *); boolean_t sa_attr_would_spill(sa_handle_t *, sa_attr_type_t, int size); +void sa_spill_rele(sa_handle_t *); void sa_register_update_callback(objset_t *, sa_update_cb_t *); int sa_setup(objset_t *, uint64_t, sa_attr_reg_t *, int, sa_attr_type_t **); void sa_tear_down(objset_t *); diff --git a/module/zfs/sa.c b/module/zfs/sa.c index bcef7d1fb..32b4c5b08 100644 --- a/module/zfs/sa.c +++ b/module/zfs/sa.c @@ -1333,6 +1333,19 @@ sa_idx_tab_hold(objset_t *os, sa_idx_tab_t *idx_tab) (void) refcount_add(&idx_tab->sa_refcount, NULL); } +void +sa_spill_rele(sa_handle_t *hdl) +{ + mutex_enter(&hdl->sa_lock); + if (hdl->sa_spill) { + sa_idx_tab_rele(hdl->sa_os, hdl->sa_spill_tab); + dmu_buf_rele(hdl->sa_spill, NULL); + hdl->sa_spill = NULL; + hdl->sa_spill_tab = NULL; + } + mutex_exit(&hdl->sa_lock); +} + void sa_handle_destroy(sa_handle_t *hdl) { @@ -1994,6 +2007,7 @@ EXPORT_SYMBOL(sa_handle_get_from_db); EXPORT_SYMBOL(sa_handle_destroy); EXPORT_SYMBOL(sa_buf_hold); EXPORT_SYMBOL(sa_buf_rele); +EXPORT_SYMBOL(sa_spill_rele); EXPORT_SYMBOL(sa_lookup); EXPORT_SYMBOL(sa_update); EXPORT_SYMBOL(sa_remove);