]> git.proxmox.com Git - mirror_zfs.git/blobdiff - module/zfs/dsl_deadlist.c
OpenZFS 7614, 9064 - zfs device evacuation/removal
[mirror_zfs.git] / module / zfs / dsl_deadlist.c
index 0be0d74209409e1777f470e2838a874cc64f29ba..10846a3249db9457aa5c7f769a00edee573f81c1 100644 (file)
@@ -93,6 +93,8 @@ dsl_deadlist_open(dsl_deadlist_t *dl, objset_t *os, uint64_t object)
 {
        dmu_object_info_t doi;
 
+       ASSERT(!dsl_deadlist_is_open(dl));
+
        mutex_init(&dl->dl_lock, NULL, MUTEX_DEFAULT, NULL);
        dl->dl_os = os;
        dl->dl_object = object;
@@ -111,18 +113,26 @@ dsl_deadlist_open(dsl_deadlist_t *dl, objset_t *os, uint64_t object)
        dl->dl_havetree = B_FALSE;
 }
 
+boolean_t
+dsl_deadlist_is_open(dsl_deadlist_t *dl)
+{
+       return (dl->dl_os != NULL);
+}
+
 void
 dsl_deadlist_close(dsl_deadlist_t *dl)
 {
        void *cookie = NULL;
        dsl_deadlist_entry_t *dle;
 
-       dl->dl_os = NULL;
+       ASSERT(dsl_deadlist_is_open(dl));
        mutex_destroy(&dl->dl_lock);
 
        if (dl->dl_oldfmt) {
                dl->dl_oldfmt = B_FALSE;
                bpobj_close(&dl->dl_bpobj);
+               dl->dl_os = NULL;
+               dl->dl_object = 0;
                return;
        }
 
@@ -137,6 +147,8 @@ dsl_deadlist_close(dsl_deadlist_t *dl)
        dmu_buf_rele(dl->dl_dbuf, dl);
        dl->dl_dbuf = NULL;
        dl->dl_phys = NULL;
+       dl->dl_os = NULL;
+       dl->dl_object = 0;
 }
 
 uint64_t
@@ -311,7 +323,7 @@ static void
 dsl_deadlist_regenerate(objset_t *os, uint64_t dlobj,
     uint64_t mrs_obj, dmu_tx_t *tx)
 {
-       dsl_deadlist_t dl;
+       dsl_deadlist_t dl = { 0 };
        dsl_pool_t *dp = dmu_objset_pool(os);
 
        dsl_deadlist_open(&dl, os, dlobj);
@@ -367,6 +379,7 @@ void
 dsl_deadlist_space(dsl_deadlist_t *dl,
     uint64_t *usedp, uint64_t *compp, uint64_t *uncompp)
 {
+       ASSERT(dsl_deadlist_is_open(dl));
        if (dl->dl_oldfmt) {
                VERIFY3U(0, ==, bpobj_space(&dl->dl_bpobj,
                    usedp, compp, uncompp));