summaryrefslogtreecommitdiffstats
path: root/module/zfs/sa.c
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2012-03-05 15:14:15 -0800
committerBrian Behlendorf <[email protected]>2012-03-07 16:28:00 -0800
commit0ece356db51e225c3d4a26dff7cf67c99b6b9c55 (patch)
tree8f1e2b35b4c94f8a30dedf65feb5061d903f0043 /module/zfs/sa.c
parent2c6d0b1e07b0265f0661ed7851d3aa8d3e75e7a9 (diff)
Add sa_spill_rele() interface
Add a SA interface which allows us to release the spill block from a SA handle without destroying the handle. This is useful because we can then ensure that a copy of the dirty spill block is not made at sync time due to the extra hold. Susequent calls to sa_update() or sa_lookup() with transparently refetch the spill block dbuf from the ARC hash. Signed-off-by: Brian Behlendorf <[email protected]>
Diffstat (limited to 'module/zfs/sa.c')
-rw-r--r--module/zfs/sa.c14
1 files changed, 14 insertions, 0 deletions
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
@@ -1334,6 +1334,19 @@ sa_idx_tab_hold(objset_t *os, sa_idx_tab_t *idx_tab)
}
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)
{
mutex_enter(&hdl->sa_lock);
@@ -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);