Illumos #3552, #3564
[zfs.git] / module / zfs / vdev.c
index afff4d4..d6b55ee 100644 (file)
@@ -61,9 +61,6 @@ static vdev_ops_t *vdev_ops_table[] = {
        NULL
 };
 
-/* maximum scrub/resilver I/O queue per leaf vdev */
-int zfs_scrub_limit = 10;
-
 /*
  * Given a vdev type, return the appropriate ops vector.
  */
@@ -601,9 +598,9 @@ vdev_free(vdev_t *vd)
                metaslab_group_destroy(vd->vdev_mg);
        }
 
-       ASSERT3U(vd->vdev_stat.vs_space, ==, 0);
-       ASSERT3U(vd->vdev_stat.vs_dspace, ==, 0);
-       ASSERT3U(vd->vdev_stat.vs_alloc, ==, 0);
+       ASSERT0(vd->vdev_stat.vs_space);
+       ASSERT0(vd->vdev_stat.vs_dspace);
+       ASSERT0(vd->vdev_stat.vs_alloc);
 
        /*
         * Remove this vdev from its parent's child list.
@@ -1828,7 +1825,7 @@ vdev_dtl_sync(vdev_t *vd, uint64_t txg)
 
        if (vd->vdev_detached) {
                if (smo->smo_object != 0) {
-                       VERIFY(0 == dmu_object_free(mos, smo->smo_object, tx));
+                       VERIFY0(dmu_object_free(mos, smo->smo_object, tx));
                        smo->smo_object = 0;
                }
                dmu_tx_commit(tx);
@@ -1858,6 +1855,7 @@ vdev_dtl_sync(vdev_t *vd, uint64_t txg)
 
        space_map_truncate(smo, mos, tx);
        space_map_sync(&smsync, SM_ALLOC, smo, mos, tx);
+       space_map_vacate(&smsync, NULL, NULL);
 
        space_map_destroy(&smsync);
 
@@ -2032,7 +2030,7 @@ vdev_remove(vdev_t *vd, uint64_t txg)
        tx = dmu_tx_create_assigned(spa_get_dsl(spa), txg);
 
        if (vd->vdev_dtl_smo.smo_object) {
-               ASSERT3U(vd->vdev_dtl_smo.smo_alloc, ==, 0);
+               ASSERT0(vd->vdev_dtl_smo.smo_alloc);
                (void) dmu_object_free(mos, vd->vdev_dtl_smo.smo_object, tx);
                vd->vdev_dtl_smo.smo_object = 0;
        }
@@ -2044,7 +2042,7 @@ vdev_remove(vdev_t *vd, uint64_t txg)
                        if (msp == NULL || msp->ms_smo.smo_object == 0)
                                continue;
 
-                       ASSERT3U(msp->ms_smo.smo_alloc, ==, 0);
+                       ASSERT0(msp->ms_smo.smo_alloc);
                        (void) dmu_object_free(mos, msp->ms_smo.smo_object, tx);
                        msp->ms_smo.smo_object = 0;
                }
@@ -2322,7 +2320,7 @@ top:
                                (void) spa_vdev_state_exit(spa, vd, 0);
                                goto top;
                        }
-                       ASSERT3U(tvd->vdev_stat.vs_alloc, ==, 0);
+                       ASSERT0(tvd->vdev_stat.vs_alloc);
                }
 
                /*
@@ -3195,13 +3193,50 @@ vdev_split(vdev_t *vd)
        vdev_propagate_state(cvd);
 }
 
+void
+vdev_deadman(vdev_t *vd)
+{
+       int c;
+
+       for (c = 0; c < vd->vdev_children; c++) {
+               vdev_t *cvd = vd->vdev_child[c];
+
+               vdev_deadman(cvd);
+       }
+
+       if (vd->vdev_ops->vdev_op_leaf) {
+               vdev_queue_t *vq = &vd->vdev_queue;
+
+               mutex_enter(&vq->vq_lock);
+               if (avl_numnodes(&vq->vq_pending_tree) > 0) {
+                       spa_t *spa = vd->vdev_spa;
+                       zio_t *fio;
+                       uint64_t delta;
+
+                       /*
+                        * Look at the head of all the pending queues,
+                        * if any I/O has been outstanding for longer than
+                        * the spa_deadman_synctime we log a zevent.
+                        */
+                       fio = avl_first(&vq->vq_pending_tree);
+                       delta = ddi_get_lbolt64() - fio->io_timestamp;
+                       if (delta > NSEC_TO_TICK(spa_deadman_synctime(spa))) {
+                               zfs_dbgmsg("SLOW IO: zio timestamp %llu, "
+                                   "delta %llu, last io %llu",
+                                   fio->io_timestamp, delta,
+                                   vq->vq_io_complete_ts);
+                               zfs_ereport_post(FM_EREPORT_ZFS_DELAY,
+                                   spa, vd, fio, 0, 0);
+                       }
+               }
+               mutex_exit(&vq->vq_lock);
+       }
+}
+
 #if defined(_KERNEL) && defined(HAVE_SPL)
 EXPORT_SYMBOL(vdev_fault);
 EXPORT_SYMBOL(vdev_degrade);
 EXPORT_SYMBOL(vdev_online);
 EXPORT_SYMBOL(vdev_offline);
 EXPORT_SYMBOL(vdev_clear);
-
-module_param(zfs_scrub_limit, int, 0644);
-MODULE_PARM_DESC(zfs_scrub_limit, "Max scrub/resilver I/O per leaf vdev");
 #endif