]> git.proxmox.com Git - mirror_zfs.git/blobdiff - include/sys/dsl_scan.h
Sequential scrub and resilvers
[mirror_zfs.git] / include / sys / dsl_scan.h
index 5303d9a699bbcc3c898956daaff18cb6d91c409e..7a29d9788067b301523cd322c0b0b510fbc54b25 100644 (file)
@@ -108,22 +108,56 @@ typedef enum dsl_scan_flags {
  */
 typedef struct dsl_scan {
        struct dsl_pool *scn_dp;
-
-       boolean_t scn_suspending;
        uint64_t scn_restart_txg;
        uint64_t scn_done_txg;
        uint64_t scn_sync_start_time;
-       zio_t *scn_zio_root;
+       uint64_t scn_issued_before_pass;
 
        /* for freeing blocks */
        boolean_t scn_is_bptree;
        boolean_t scn_async_destroying;
        boolean_t scn_async_stalled;
-       uint64_t scn_visited_this_txg;
 
-       dsl_scan_phys_t scn_phys;
+       /* 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 */
+
+       /* members for thread synchronization */
+       zio_t *scn_zio_root;            /* root zio for waiting on IO */
+       taskq_t *scn_taskq;             /* task queue for issuing extents */
+
+       /* 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 pool */
+
+       /* 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;
 
+typedef struct dsl_scan_io_queue dsl_scan_io_queue_t;
+
+void scan_init(void);
+void scan_fini(void);
 int dsl_scan_init(struct dsl_pool *dp, uint64_t txg);
 void dsl_scan_fini(struct dsl_pool *dp);
 void dsl_scan_sync(struct dsl_pool *, dmu_tx_t *);
@@ -142,6 +176,9 @@ void dsl_scan_ds_clone_swapped(struct dsl_dataset *ds1, struct dsl_dataset *ds2,
     struct dmu_tx *tx);
 boolean_t dsl_scan_active(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
 }