Lines Matching refs:scn

103 #define	DSL_SCAN_IS_SCRUB_RESILVER(scn) \
104 ((scn)->scn_phys.scn_func == POOL_SCAN_SCRUB || \
105 (scn)->scn_phys.scn_func == POOL_SCAN_RESILVER)
120 dsl_scan_t *scn;
124 scn = dp->dp_scan = kmem_zalloc(sizeof (dsl_scan_t), KM_SLEEP);
125 scn->scn_dp = dp;
132 ASSERT(!scn->scn_async_destroying);
133 scn->scn_async_destroying = spa_feature_is_active(dp->dp_spa,
143 scn->scn_restart_txg = txg;
146 scn->scn_restart_txg);
154 &scn->scn_phys.scn_queue_obj);
158 &scn->scn_phys);
164 if (scn->scn_phys.scn_state == DSS_SCANNING &&
173 scn->scn_restart_txg = txg;
176 scn->scn_restart_txg);
197 dsl_scan_t *scn = dmu_tx_pool(tx)->dp_scan;
199 if (scn->scn_phys.scn_state == DSS_SCANNING)
208 dsl_scan_t *scn = dmu_tx_pool(tx)->dp_scan;
211 dsl_pool_t *dp = scn->scn_dp;
214 ASSERT(scn->scn_phys.scn_state != DSS_SCANNING);
216 bzero(&scn->scn_phys, sizeof (scn->scn_phys));
217 scn->scn_phys.scn_func = *funcp;
218 scn->scn_phys.scn_state = DSS_SCANNING;
219 scn->scn_phys.scn_min_txg = 0;
220 scn->scn_phys.scn_max_txg = tx->tx_txg;
221 scn->scn_phys.scn_ddt_class_max = DDT_CLASSES - 1; /* the entire DDT */
222 scn->scn_phys.scn_start_time = gethrestime_sec();
223 scn->scn_phys.scn_errors = 0;
224 scn->scn_phys.scn_to_examine = spa->spa_root_vdev->vdev_stat.vs_alloc;
225 scn->scn_restart_txg = 0;
226 scn->scn_done_txg = 0;
229 if (DSL_SCAN_IS_SCRUB_RESILVER(scn)) {
230 scn->scn_phys.scn_ddt_class_max = zfs_scrub_ddt_class_max;
236 &scn->scn_phys.scn_min_txg, &scn->scn_phys.scn_max_txg)) {
248 if (scn->scn_phys.scn_min_txg > TXG_INITIAL)
249 scn->scn_phys.scn_ddt_class_max = DDT_CLASS_DITTO;
264 scn->scn_phys.scn_queue_obj = zap_create(dp->dp_meta_objset,
267 dsl_scan_sync_state(scn, tx);
271 *funcp, scn->scn_phys.scn_min_txg, scn->scn_phys.scn_max_txg);
276 dsl_scan_done(dsl_scan_t *scn, boolean_t complete, dmu_tx_t *tx)
290 dsl_pool_t *dp = scn->scn_dp;
300 if (scn->scn_phys.scn_queue_obj != 0) {
302 scn->scn_phys.scn_queue_obj, tx));
303 scn->scn_phys.scn_queue_obj = 0;
310 if (scn->scn_phys.scn_state != DSS_SCANNING)
314 scn->scn_phys.scn_state = DSS_FINISHED;
316 scn->scn_phys.scn_state = DSS_CANCELED;
321 if (DSL_SCAN_IS_SCRUB_RESILVER(scn)) {
337 complete ? scn->scn_phys.scn_max_txg : 0, B_TRUE);
339 spa_event_notify(spa, NULL, scn->scn_phys.scn_min_txg ?
351 scn->scn_phys.scn_end_time = gethrestime_sec();
358 dsl_scan_t *scn = dmu_tx_pool(tx)->dp_scan;
360 if (scn->scn_phys.scn_state != DSS_SCANNING)
369 dsl_scan_t *scn = dmu_tx_pool(tx)->dp_scan;
371 dsl_scan_done(scn, B_FALSE, tx);
372 dsl_scan_sync_state(scn, tx);
384 dsl_dataset_t *ds, dsl_scan_t *scn, dmu_objset_type_t ostype,
414 dsl_scan_sync_state(dsl_scan_t *scn, dmu_tx_t *tx)
416 VERIFY0(zap_update(scn->scn_dp->dp_meta_objset,
419 &scn->scn_phys, tx));
423 dsl_scan_check_pause(dsl_scan_t *scn, const zbookmark_phys_t *zb)
432 if (scn->scn_pausing)
435 if (!ZB_IS_ZERO(&scn->scn_phys.scn_bookmark))
442 mintime = (scn->scn_phys.scn_func == POOL_SCAN_RESILVER) ?
444 elapsed_nanosecs = gethrtime() - scn->scn_sync_start_time;
447 txg_sync_waiting(scn->scn_dp)) ||
448 spa_shutting_down(scn->scn_dp->dp_spa)) {
455 scn->scn_phys.scn_bookmark = *zb;
458 (longlong_t)scn->scn_phys.scn_ddt_bookmark.ddb_class,
459 (longlong_t)scn->scn_phys.scn_ddt_bookmark.ddb_type,
460 (longlong_t)scn->scn_phys.scn_ddt_bookmark.ddb_checksum,
461 (longlong_t)scn->scn_phys.scn_ddt_bookmark.ddb_cursor);
462 scn->scn_pausing = B_TRUE;
479 dsl_scan_t *scn = dp->dp_scan;
483 if (BP_IS_HOLE(bp) || bp->blk_birth <= scn->scn_phys.scn_cur_min_txg)
498 VERIFY(0 == scan_funcs[scn->scn_phys.scn_func](dp, bp, &zb));
509 dsl_scan_t *scn = dp->dp_scan;
516 bp->blk_birth <= scn->scn_phys.scn_cur_min_txg)
531 VERIFY(0 == scan_funcs[scn->scn_phys.scn_func](dp, bp, &zb));
560 dsl_scan_prefetch(dsl_scan_t *scn, arc_buf_t *buf, blkptr_t *bp,
569 if (BP_IS_HOLE(bp) || bp->blk_birth <= scn->scn_phys.scn_min_txg ||
575 (void) arc_read(scn->scn_zio_root, scn->scn_dp->dp_spa, bp,
581 dsl_scan_check_resume(dsl_scan_t *scn, const dnode_phys_t *dnp,
587 if (!ZB_IS_ZERO(&scn->scn_phys.scn_bookmark) &&
593 if (zbookmark_is_before(dnp, zb, &scn->scn_phys.scn_bookmark))
602 if (bcmp(zb, &scn->scn_phys.scn_bookmark, sizeof (*zb)) == 0 ||
603 zb->zb_object > scn->scn_phys.scn_bookmark.zb_object) {
609 bzero(&scn->scn_phys.scn_bookmark, sizeof (*zb));
620 dsl_scan_recurse(dsl_scan_t *scn, dsl_dataset_t *ds, dmu_objset_type_t ostype,
624 dsl_pool_t *dp = scn->scn_dp;
637 scn->scn_phys.scn_errors++;
641 dsl_scan_prefetch(scn, *bufp, cbp, zb->zb_objset,
651 *bufp, ds, scn, ostype, tx);
659 scn->scn_phys.scn_errors++;
671 scn->scn_phys.scn_errors++;
677 dsl_scan_prefetch(scn, *bufp, cbp,
682 dsl_scan_visitdnode(scn, ds, ostype,
693 scn->scn_phys.scn_errors++;
699 dsl_scan_visitdnode(scn, ds, osp->os_type,
709 dsl_scan_visitdnode(scn, ds, osp->os_type,
712 dsl_scan_visitdnode(scn, ds, osp->os_type,
722 dsl_scan_visitdnode(dsl_scan_t *scn, dsl_dataset_t *ds,
734 &czb, dnp, buf, ds, scn, ostype, tx);
742 &czb, dnp, buf, ds, scn, ostype, tx);
753 dsl_dataset_t *ds, dsl_scan_t *scn, dmu_objset_type_t ostype,
756 dsl_pool_t *dp = scn->scn_dp;
762 if (dsl_scan_check_pause(scn, zb))
765 if (dsl_scan_check_resume(scn, dnp, zb))
771 scn->scn_visited_this_txg++;
779 if (bp->blk_birth <= scn->scn_phys.scn_cur_min_txg)
782 if (dsl_scan_recurse(scn, ds, ostype, dnp, &bp_toread, zb, tx,
792 scn->scn_phys.scn_ddt_class_max, bp)) {
804 if (BP_PHYSICAL_BIRTH(bp) <= scn->scn_phys.scn_cur_max_txg) {
805 scan_funcs[scn->scn_phys.scn_func](dp, bp, zb);
812 dsl_scan_visit_rootbp(dsl_scan_t *scn, dsl_dataset_t *ds, blkptr_t *bp,
820 ds, scn, DMU_OST_NONE, tx);
829 dsl_scan_t *scn = dp->dp_scan;
832 if (scn->scn_phys.scn_state != DSS_SCANNING)
835 if (scn->scn_phys.scn_bookmark.zb_objset == ds->ds_object) {
838 scn->scn_phys.scn_bookmark.zb_objset =
844 scn->scn_phys.scn_flags |= DSF_VISIT_DS_AGAIN;
846 SET_BOOKMARK(&scn->scn_phys.scn_bookmark,
853 scn->scn_phys.scn_queue_obj, ds->ds_object, &mintxg) == 0) {
856 scn->scn_phys.scn_queue_obj, ds->ds_object, tx));
864 scn->scn_phys.scn_queue_obj,
883 dsl_scan_sync_state(scn, tx);
890 dsl_scan_t *scn = dp->dp_scan;
893 if (scn->scn_phys.scn_state != DSS_SCANNING)
898 if (scn->scn_phys.scn_bookmark.zb_objset == ds->ds_object) {
899 scn->scn_phys.scn_bookmark.zb_objset =
906 scn->scn_phys.scn_queue_obj, ds->ds_object, &mintxg) == 0) {
908 scn->scn_phys.scn_queue_obj, ds->ds_object, tx));
910 scn->scn_phys.scn_queue_obj,
917 dsl_scan_sync_state(scn, tx);
924 dsl_scan_t *scn = dp->dp_scan;
927 if (scn->scn_phys.scn_state != DSS_SCANNING)
930 if (scn->scn_phys.scn_bookmark.zb_objset == ds1->ds_object) {
931 scn->scn_phys.scn_bookmark.zb_objset = ds2->ds_object;
936 } else if (scn->scn_phys.scn_bookmark.zb_objset == ds2->ds_object) {
937 scn->scn_phys.scn_bookmark.zb_objset = ds1->ds_object;
944 if (zap_lookup_int_key(dp->dp_meta_objset, scn->scn_phys.scn_queue_obj,
951 scn->scn_phys.scn_queue_obj, ds1->ds_object, tx));
953 scn->scn_phys.scn_queue_obj, ds2->ds_object, mintxg, tx);
958 scn->scn_phys.scn_queue_obj,
966 scn->scn_phys.scn_queue_obj, ds2->ds_object, &mintxg) == 0) {
970 scn->scn_phys.scn_queue_obj, ds2->ds_object, tx));
972 scn->scn_phys.scn_queue_obj, ds1->ds_object, mintxg, tx));
979 dsl_scan_sync_state(scn, tx);
994 dsl_scan_t *scn = dp->dp_scan;
1014 scn->scn_phys.scn_queue_obj, ds->ds_object,
1021 dsl_scan_visitds(dsl_scan_t *scn, uint64_t dsobj, dmu_tx_t *tx)
1023 dsl_pool_t *dp = scn->scn_dp;
1039 if (DSL_SCAN_IS_SCRUB_RESILVER(scn) && !dsl_dataset_is_snapshot(ds))
1046 dsl_scan_visit_rootbp(scn, ds, &ds->ds_phys->ds_bp, tx);
1053 (longlong_t)scn->scn_phys.scn_cur_min_txg,
1054 (longlong_t)scn->scn_phys.scn_cur_max_txg,
1055 (int)scn->scn_pausing);
1058 if (scn->scn_pausing)
1068 if (scn->scn_phys.scn_flags & DSF_VISIT_DS_AGAIN) {
1070 scn->scn_phys.scn_flags &= ~DSF_VISIT_DS_AGAIN;
1072 scn->scn_phys.scn_queue_obj, ds->ds_object,
1073 scn->scn_phys.scn_cur_max_txg, tx) == 0);
1082 scn->scn_phys.scn_queue_obj, ds->ds_phys->ds_next_snap_obj,
1106 scn->scn_phys.scn_queue_obj,
1129 dsl_scan_t *scn = dp->dp_scan;
1156 VERIFY(zap_add_int_key(dp->dp_meta_objset, scn->scn_phys.scn_queue_obj,
1196 dsl_scan_ddt(dsl_scan_t *scn, dmu_tx_t *tx)
1198 ddt_bookmark_t *ddb = &scn->scn_phys.scn_ddt_bookmark;
1203 while ((error = ddt_walk(scn->scn_dp->dp_spa, ddb, &dde)) == 0) {
1206 if (ddb->ddb_class > scn->scn_phys.scn_ddt_class_max)
1215 ddt = scn->scn_dp->dp_spa->spa_ddt[ddb->ddb_checksum];
1218 dsl_scan_ddt_entry(scn, ddb->ddb_checksum, &dde, tx);
1221 if (dsl_scan_check_pause(scn, NULL))
1226 (longlong_t)n, (int)scn->scn_phys.scn_ddt_class_max,
1227 (int)scn->scn_pausing);
1231 ddb->ddb_class > scn->scn_phys.scn_ddt_class_max);
1236 dsl_scan_ddt_entry(dsl_scan_t *scn, enum zio_checksum checksum,
1244 if (scn->scn_phys.scn_state != DSS_SCANNING)
1249 ddp->ddp_phys_birth > scn->scn_phys.scn_max_txg)
1253 scn->scn_visited_this_txg++;
1254 scan_funcs[scn->scn_phys.scn_func](scn->scn_dp, &bp, &zb);
1259 dsl_scan_visit(dsl_scan_t *scn, dmu_tx_t *tx)
1261 dsl_pool_t *dp = scn->scn_dp;
1265 if (scn->scn_phys.scn_ddt_bookmark.ddb_class <=
1266 scn->scn_phys.scn_ddt_class_max) {
1267 scn->scn_phys.scn_cur_min_txg = scn->scn_phys.scn_min_txg;
1268 scn->scn_phys.scn_cur_max_txg = scn->scn_phys.scn_max_txg;
1269 dsl_scan_ddt(scn, tx);
1270 if (scn->scn_pausing)
1274 if (scn->scn_phys.scn_bookmark.zb_objset == DMU_META_OBJSET) {
1277 scn->scn_phys.scn_cur_min_txg = scn->scn_phys.scn_min_txg;
1278 scn->scn_phys.scn_cur_max_txg = scn->scn_phys.scn_max_txg;
1279 dsl_scan_visit_rootbp(scn, NULL,
1282 if (scn->scn_pausing)
1289 dsl_scan_visitds(scn,
1292 ASSERT(!scn->scn_pausing);
1293 } else if (scn->scn_phys.scn_bookmark.zb_objset !=
1301 dsl_scan_visitds(scn, scn->scn_phys.scn_bookmark.zb_objset, tx);
1302 if (scn->scn_pausing)
1310 bzero(&scn->scn_phys.scn_bookmark, sizeof (zbookmark_phys_t));
1314 scn->scn_phys.scn_queue_obj),
1321 scn->scn_phys.scn_queue_obj, dsobj, tx));
1326 scn->scn_phys.scn_cur_min_txg =
1327 MAX(scn->scn_phys.scn_min_txg,
1330 scn->scn_phys.scn_cur_min_txg =
1331 MAX(scn->scn_phys.scn_min_txg,
1334 scn->scn_phys.scn_cur_max_txg = dsl_scan_ds_maxtxg(ds);
1337 dsl_scan_visitds(scn, dsobj, tx);
1339 if (scn->scn_pausing)
1346 dsl_scan_free_should_pause(dsl_scan_t *scn)
1353 elapsed_nanosecs = gethrtime() - scn->scn_sync_start_time;
1356 txg_sync_waiting(scn->scn_dp)) ||
1357 spa_shutting_down(scn->scn_dp->dp_spa));
1363 dsl_scan_t *scn = arg;
1365 if (!scn->scn_is_bptree ||
1367 if (dsl_scan_free_should_pause(scn))
1371 zio_nowait(zio_free_sync(scn->scn_zio_root, scn->scn_dp->dp_spa,
1374 -bp_get_dsize_sync(scn->scn_dp->dp_spa, bp),
1376 scn->scn_visited_this_txg++;
1381 dsl_scan_active(dsl_scan_t *scn)
1383 spa_t *spa = scn->scn_dp->dp_spa;
1390 if (scn->scn_phys.scn_state == DSS_SCANNING ||
1391 (scn->scn_async_destroying && !scn->scn_async_stalled))
1394 if (spa_version(scn->scn_dp->dp_spa) >= SPA_VERSION_DEADLISTS) {
1395 (void) bpobj_space(&scn->scn_dp->dp_free_bpobj,
1404 dsl_scan_t *scn = dp->dp_scan;
1413 if (scn->scn_restart_txg != 0 &&
1414 scn->scn_restart_txg <= tx->tx_txg) {
1416 dsl_scan_done(scn, B_FALSE, tx);
1427 if ((!scn->scn_async_stalled && !dsl_scan_active(scn)) ||
1431 scn->scn_visited_this_txg = 0;
1432 scn->scn_pausing = B_FALSE;
1433 scn->scn_sync_start_time = gethrtime();
1444 scn->scn_is_bptree = B_FALSE;
1445 scn->scn_zio_root = zio_root(dp->dp_spa, NULL,
1448 dsl_scan_free_block_cb, scn, tx);
1449 VERIFY3U(0, ==, zio_wait(scn->scn_zio_root));
1456 ASSERT(scn->scn_async_destroying);
1457 scn->scn_is_bptree = B_TRUE;
1458 scn->scn_zio_root = zio_root(dp->dp_spa, NULL,
1461 dp->dp_bptree_obj, B_TRUE, dsl_scan_free_block_cb, scn, tx);
1462 VERIFY0(zio_wait(scn->scn_zio_root));
1482 scn->scn_async_destroying = B_FALSE;
1489 scn->scn_async_stalled =
1490 (scn->scn_visited_this_txg == 0);
1493 if (scn->scn_visited_this_txg) {
1496 (longlong_t)scn->scn_visited_this_txg,
1498 NSEC2MSEC(gethrtime() - scn->scn_sync_start_time),
1500 scn->scn_visited_this_txg = 0;
1511 if (!scn->scn_async_destroying && zfs_free_leak_on_eio &&
1537 if (!scn->scn_async_destroying) {
1544 if (scn->scn_phys.scn_state != DSS_SCANNING)
1547 if (scn->scn_done_txg == tx->tx_txg) {
1548 ASSERT(!scn->scn_pausing);
1551 dsl_scan_done(scn, B_TRUE, tx);
1553 dsl_scan_sync_state(scn, tx);
1557 if (scn->scn_phys.scn_ddt_bookmark.ddb_class <=
1558 scn->scn_phys.scn_ddt_class_max) {
1562 (longlong_t)scn->scn_phys.scn_ddt_bookmark.ddb_class,
1563 (longlong_t)scn->scn_phys.scn_ddt_bookmark.ddb_type,
1564 (longlong_t)scn->scn_phys.scn_ddt_bookmark.ddb_checksum,
1565 (longlong_t)scn->scn_phys.scn_ddt_bookmark.ddb_cursor);
1566 ASSERT(scn->scn_phys.scn_bookmark.zb_objset == 0);
1567 ASSERT(scn->scn_phys.scn_bookmark.zb_object == 0);
1568 ASSERT(scn->scn_phys.scn_bookmark.zb_level == 0);
1569 ASSERT(scn->scn_phys.scn_bookmark.zb_blkid == 0);
1573 (longlong_t)scn->scn_phys.scn_bookmark.zb_objset,
1574 (longlong_t)scn->scn_phys.scn_bookmark.zb_object,
1575 (longlong_t)scn->scn_phys.scn_bookmark.zb_level,
1576 (longlong_t)scn->scn_phys.scn_bookmark.zb_blkid);
1579 scn->scn_zio_root = zio_root(dp->dp_spa, NULL,
1582 dsl_scan_visit(scn, tx);
1584 (void) zio_wait(scn->scn_zio_root);
1585 scn->scn_zio_root = NULL;
1588 (longlong_t)scn->scn_visited_this_txg,
1589 (longlong_t)NSEC2MSEC(gethrtime() - scn->scn_sync_start_time));
1591 if (!scn->scn_pausing) {
1592 scn->scn_done_txg = tx->tx_txg + 1;
1594 tx->tx_txg, scn->scn_done_txg);
1597 if (DSL_SCAN_IS_SCRUB_RESILVER(scn)) {
1606 dsl_scan_sync_state(scn, tx);
1710 dsl_scan_t *scn = dp->dp_scan;
1718 if (phys_birth <= scn->scn_phys.scn_min_txg ||
1719 phys_birth >= scn->scn_phys.scn_max_txg)
1727 ASSERT(DSL_SCAN_IS_SCRUB_RESILVER(scn));
1728 if (scn->scn_phys.scn_func == POOL_SCAN_SCRUB) {
1733 ASSERT3U(scn->scn_phys.scn_func, ==, POOL_SCAN_RESILVER);
1751 scn->scn_phys.scn_examined += DVA_GET_ASIZE(&bp->blk_dva[d]);