Changeset View
Changeset View
Standalone View
Standalone View
sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_scan.h
Show First 20 Lines • Show All 101 Lines • ▼ Show 20 Lines | |||||
* a special kind of traversal. Deferred free can exist in either a bptree or | * a special kind of traversal. Deferred free can exist in either a bptree or | ||||
* a bpobj structure. The scn_is_bptree flag will indicate the type of | * a bpobj structure. The scn_is_bptree flag will indicate the type of | ||||
* deferred free that is in progress. If the deferred free is part of an | * deferred free that is in progress. If the deferred free is part of an | ||||
* asynchronous destroy then the scn_async_destroying flag will be set. | * asynchronous destroy then the scn_async_destroying flag will be set. | ||||
*/ | */ | ||||
typedef struct dsl_scan { | typedef struct dsl_scan { | ||||
struct dsl_pool *scn_dp; | struct dsl_pool *scn_dp; | ||||
boolean_t scn_suspending; | |||||
uint64_t scn_restart_txg; | uint64_t scn_restart_txg; | ||||
uint64_t scn_done_txg; | uint64_t scn_done_txg; | ||||
uint64_t scn_sync_start_time; | uint64_t scn_sync_start_time; | ||||
zio_t *scn_zio_root; | uint64_t scn_issued_before_pass; | ||||
/* for freeing blocks */ | /* for freeing blocks */ | ||||
boolean_t scn_is_bptree; | boolean_t scn_is_bptree; | ||||
boolean_t scn_async_destroying; | boolean_t scn_async_destroying; | ||||
boolean_t scn_async_stalled; | boolean_t scn_async_stalled; | ||||
uint64_t scn_async_block_min_time_ms; | uint64_t scn_async_block_min_time_ms; | ||||
/* flags and stats for controlling scan state */ | |||||
boolean_t scn_is_sorted; /* doing sequential scan */ | |||||
boolean_t scn_clearing; /* scan is issuing sequential extents */ | |||||
boolean_t scn_checkpointing; /* scan is issuing all queued extents */ | |||||
boolean_t scn_suspending; /* scan is suspending until next txg */ | |||||
uint64_t scn_last_checkpoint; /* time of last checkpoint */ | |||||
/* for debugging / information */ | /* members for thread synchronization */ | ||||
uint64_t scn_visited_this_txg; | zio_t *scn_zio_root; /* root zio for waiting on IO */ | ||||
taskq_t *scn_taskq; /* task queue for issuing extents */ | |||||
dsl_scan_phys_t scn_phys; | /* for controlling scan prefetch, protected by spa_scrub_lock */ | ||||
boolean_t scn_prefetch_stop; /* prefetch should stop */ | |||||
zbookmark_phys_t scn_prefetch_bookmark; /* prefetch start bookmark */ | |||||
avl_tree_t scn_prefetch_queue; /* priority queue of prefetch IOs */ | |||||
uint64_t scn_maxinflight_bytes; /* max bytes in flight for poool */ | |||||
/* per txg statistics */ | |||||
uint64_t scn_visited_this_txg; /* total bps visited this txg */ | |||||
uint64_t scn_holes_this_txg; | |||||
uint64_t scn_lt_min_this_txg; | |||||
uint64_t scn_gt_max_this_txg; | |||||
uint64_t scn_ddt_contained_this_txg; | |||||
uint64_t scn_objsets_visited_this_txg; | |||||
uint64_t scn_avg_seg_size_this_txg; | |||||
uint64_t scn_segs_this_txg; | |||||
uint64_t scn_avg_zio_size_this_txg; | |||||
uint64_t scn_zios_this_txg; | |||||
/* members needed for syncing scan status to disk */ | |||||
dsl_scan_phys_t scn_phys; /* on disk representation of scan */ | |||||
dsl_scan_phys_t scn_phys_cached; | |||||
avl_tree_t scn_queue; /* queue of datasets to scan */ | |||||
uint64_t scn_bytes_pending; /* outstanding data to issue */ | |||||
} dsl_scan_t; | } dsl_scan_t; | ||||
typedef struct dsl_scan_io_queue dsl_scan_io_queue_t; | |||||
void dsl_scan_global_init(void); | |||||
void scan_init(void); | |||||
void scan_fini(void); | |||||
int dsl_scan_init(struct dsl_pool *dp, uint64_t txg); | int dsl_scan_init(struct dsl_pool *dp, uint64_t txg); | ||||
void dsl_scan_fini(struct dsl_pool *dp); | void dsl_scan_fini(struct dsl_pool *dp); | ||||
void dsl_scan_sync(struct dsl_pool *, dmu_tx_t *); | void dsl_scan_sync(struct dsl_pool *, dmu_tx_t *); | ||||
int dsl_scan_cancel(struct dsl_pool *); | int dsl_scan_cancel(struct dsl_pool *); | ||||
int dsl_scan(struct dsl_pool *, pool_scan_func_t); | int dsl_scan(struct dsl_pool *, pool_scan_func_t); | ||||
boolean_t dsl_scan_scrubbing(const struct dsl_pool *dp); | boolean_t dsl_scan_scrubbing(const struct dsl_pool *dp); | ||||
int dsl_scrub_set_pause_resume(const struct dsl_pool *dp, pool_scrub_cmd_t cmd); | int dsl_scrub_set_pause_resume(const struct dsl_pool *dp, pool_scrub_cmd_t cmd); | ||||
void dsl_resilver_restart(struct dsl_pool *, uint64_t txg); | void dsl_resilver_restart(struct dsl_pool *, uint64_t txg); | ||||
boolean_t dsl_scan_resilvering(struct dsl_pool *dp); | boolean_t dsl_scan_resilvering(struct dsl_pool *dp); | ||||
boolean_t dsl_dataset_unstable(struct dsl_dataset *ds); | boolean_t dsl_dataset_unstable(struct dsl_dataset *ds); | ||||
void dsl_scan_ddt_entry(dsl_scan_t *scn, enum zio_checksum checksum, | void dsl_scan_ddt_entry(dsl_scan_t *scn, enum zio_checksum checksum, | ||||
ddt_entry_t *dde, dmu_tx_t *tx); | ddt_entry_t *dde, dmu_tx_t *tx); | ||||
void dsl_scan_ds_destroyed(struct dsl_dataset *ds, struct dmu_tx *tx); | void dsl_scan_ds_destroyed(struct dsl_dataset *ds, struct dmu_tx *tx); | ||||
void dsl_scan_ds_snapshotted(struct dsl_dataset *ds, struct dmu_tx *tx); | void dsl_scan_ds_snapshotted(struct dsl_dataset *ds, struct dmu_tx *tx); | ||||
void dsl_scan_ds_clone_swapped(struct dsl_dataset *ds1, struct dsl_dataset *ds2, | void dsl_scan_ds_clone_swapped(struct dsl_dataset *ds1, struct dsl_dataset *ds2, | ||||
struct dmu_tx *tx); | struct dmu_tx *tx); | ||||
boolean_t dsl_scan_active(dsl_scan_t *scn); | boolean_t dsl_scan_active(dsl_scan_t *scn); | ||||
boolean_t dsl_scan_is_paused_scrub(const dsl_scan_t *scn); | boolean_t dsl_scan_is_paused_scrub(const dsl_scan_t *scn); | ||||
void dsl_scan_freed(spa_t *spa, const blkptr_t *bp); | |||||
void dsl_scan_io_queue_destroy(dsl_scan_io_queue_t *queue); | |||||
void dsl_scan_io_queue_vdev_xfer(vdev_t *svd, vdev_t *tvd); | |||||
#ifdef __cplusplus | #ifdef __cplusplus | ||||
} | } | ||||
#endif | #endif | ||||
#endif /* _SYS_DSL_SCAN_H */ | #endif /* _SYS_DSL_SCAN_H */ |