3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
23 * Copyright (c) 2012, 2017 by Delphix. All rights reserved.
24 * Copyright (c) 2017 Datto Inc.
25 */
26
27 #ifndef _SYS_DSL_SCAN_H
28 #define _SYS_DSL_SCAN_H
29
30 #include <sys/zfs_context.h>
31 #include <sys/zio.h>
32 #include <sys/ddt.h>
33 #include <sys/bplist.h>
34
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38
39 struct objset;
40 struct dsl_dir;
41 struct dsl_dataset;
42 struct dsl_pool;
43 struct dmu_tx;
100 *
101 * This structure also maintains information about deferred frees which are
102 * a special kind of traversal. Deferred free can exist in either a bptree or
103 * a bpobj structure. The scn_is_bptree flag will indicate the type of
104 * deferred free that is in progress. If the deferred free is part of an
105 * asynchronous destroy then the scn_async_destroying flag will be set.
106 */
107 typedef struct dsl_scan {
108 struct dsl_pool *scn_dp;
109
110 boolean_t scn_suspending;
111 uint64_t scn_restart_txg;
112 uint64_t scn_done_txg;
113 uint64_t scn_sync_start_time;
114 zio_t *scn_zio_root;
115
116 /* for freeing blocks */
117 boolean_t scn_is_bptree;
118 boolean_t scn_async_destroying;
119 boolean_t scn_async_stalled;
120 uint64_t scn_async_block_min_time_ms;
121
122 /* for debugging / information */
123 uint64_t scn_visited_this_txg;
124
125 dsl_scan_phys_t scn_phys;
126 } dsl_scan_t;
127
128 int dsl_scan_init(struct dsl_pool *dp, uint64_t txg);
129 void dsl_scan_fini(struct dsl_pool *dp);
130 void dsl_scan_sync(struct dsl_pool *, dmu_tx_t *);
131 int dsl_scan_cancel(struct dsl_pool *);
132 int dsl_scan(struct dsl_pool *, pool_scan_func_t);
133 boolean_t dsl_scan_scrubbing(const struct dsl_pool *dp);
134 int dsl_scrub_set_pause_resume(const struct dsl_pool *dp, pool_scrub_cmd_t cmd);
135 void dsl_resilver_restart(struct dsl_pool *, uint64_t txg);
136 boolean_t dsl_scan_resilvering(struct dsl_pool *dp);
137 boolean_t dsl_dataset_unstable(struct dsl_dataset *ds);
138 void dsl_scan_ddt_entry(dsl_scan_t *scn, enum zio_checksum checksum,
139 ddt_entry_t *dde, dmu_tx_t *tx);
140 void dsl_scan_ds_destroyed(struct dsl_dataset *ds, struct dmu_tx *tx);
141 void dsl_scan_ds_snapshotted(struct dsl_dataset *ds, struct dmu_tx *tx);
142 void dsl_scan_ds_clone_swapped(struct dsl_dataset *ds1, struct dsl_dataset *ds2,
143 struct dmu_tx *tx);
144 boolean_t dsl_scan_active(dsl_scan_t *scn);
145 boolean_t dsl_scan_is_paused_scrub(const dsl_scan_t *scn);
146
147 #ifdef __cplusplus
148 }
149 #endif
150
151 #endif /* _SYS_DSL_SCAN_H */
|
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
23 * Copyright (c) 2012, 2014 by Delphix. All rights reserved.
24 * Copyright (c) 2017 Datto Inc.
25 */
26
27 #ifndef _SYS_DSL_SCAN_H
28 #define _SYS_DSL_SCAN_H
29
30 #include <sys/zfs_context.h>
31 #include <sys/zio.h>
32 #include <sys/ddt.h>
33 #include <sys/bplist.h>
34
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38
39 struct objset;
40 struct dsl_dir;
41 struct dsl_dataset;
42 struct dsl_pool;
43 struct dmu_tx;
100 *
101 * This structure also maintains information about deferred frees which are
102 * a special kind of traversal. Deferred free can exist in either a bptree or
103 * a bpobj structure. The scn_is_bptree flag will indicate the type of
104 * deferred free that is in progress. If the deferred free is part of an
105 * asynchronous destroy then the scn_async_destroying flag will be set.
106 */
107 typedef struct dsl_scan {
108 struct dsl_pool *scn_dp;
109
110 boolean_t scn_suspending;
111 uint64_t scn_restart_txg;
112 uint64_t scn_done_txg;
113 uint64_t scn_sync_start_time;
114 zio_t *scn_zio_root;
115
116 /* for freeing blocks */
117 boolean_t scn_is_bptree;
118 boolean_t scn_async_destroying;
119 boolean_t scn_async_stalled;
120 uint64_t scn_visited_this_txg;
121
122 dsl_scan_phys_t scn_phys;
123 dsl_scan_phys_t scn_phys_cached;
124
125 /*
126 * With multi-threaded sync, we need to make sure scn_queue access
127 * is kept nicely serialized.
128 */
129 kmutex_t scn_queue_lock;
130 avl_tree_t scn_queue;
131
132 /*
133 * These signal how much work is pending from the scanner to the
134 * reader. Whenever the queue of zios grows, scn_bytes_pending grows
135 * the corresponding amount. Once a read for a block has been issued
136 * (whether in-order or out-of-order later on), scn_bytes_issued is
137 * incremented by the amount of data consumed from scn_bytes_pending.
138 * After a scan has completed, scn_bytes_pending will be 0 and
139 * scn_bytes_issued will have the total amount of data read.
140 *
141 * Lock ordering:
142 * scn_status_lock may only be held on its own or AFTER grabbing
143 * a vdev_scan_queue_lock, never BEFORE vdev_scan_queue_lock.
144 */
145 kmutex_t scn_status_lock;
146 uint64_t scn_bytes_pending;
147 uint64_t scn_bytes_issued;
148
149 boolean_t scn_clearing;
150 boolean_t scn_checkpointing;
151 uint64_t scn_last_checkpoint;
152 taskq_t *scn_taskq;
153
154 uint64_t scn_last_queue_run_time;
155 uint64_t scn_last_dequeue_limit;
156
157 /* protects scn_is_sorted and scn_done_ds */
158 kmutex_t scn_sorted_lock;
159 /*
160 * Flag denoting if we're running an out-of-order sorting scan or an
161 * old non-sorting inline scan. This changes our checking behavior.
162 */
163 boolean_t scn_is_sorted;
164 } dsl_scan_t;
165
166 typedef struct dsl_scan_io_queue dsl_scan_io_queue_t;
167
168 void dsl_scan_global_init(void);
169 void dsl_scan_global_fini(void);
170
171 int dsl_scan_init(struct dsl_pool *dp, uint64_t txg);
172 void dsl_scan_fini(struct dsl_pool *dp);
173 void dsl_scan_sync(struct dsl_pool *, dmu_tx_t *);
174 int dsl_scan_cancel(struct dsl_pool *);
175 int dsl_scan(struct dsl_pool *, pool_scan_func_t);
176 boolean_t dsl_scan_scrubbing(const struct dsl_pool *dp);
177 int dsl_scrub_set_pause_resume(const struct dsl_pool *dp, pool_scrub_cmd_t cmd);
178 void dsl_resilver_restart(struct dsl_pool *, uint64_t txg);
179 boolean_t dsl_scan_resilvering(struct dsl_pool *dp);
180 boolean_t dsl_dataset_unstable(struct dsl_dataset *ds);
181 void dsl_scan_ddt_entry(dsl_scan_t *scn, enum zio_checksum checksum,
182 ddt_entry_t *dde, dmu_tx_t *tx);
183 void dsl_scan_ds_destroyed(struct dsl_dataset *ds, struct dmu_tx *tx);
184 void dsl_scan_ds_snapshotted(struct dsl_dataset *ds, struct dmu_tx *tx);
185 void dsl_scan_ds_clone_swapped(struct dsl_dataset *ds1, struct dsl_dataset *ds2,
186 struct dmu_tx *tx);
187 boolean_t dsl_scan_active(dsl_scan_t *scn);
188 void dsl_scan_freed(spa_t *spa, const blkptr_t *bp);
189 void dsl_scan_io_queue_destroy(dsl_scan_io_queue_t *queue);
190 void dsl_scan_io_queue_vdev_xfer(vdev_t *svd, vdev_t *tvd);
191 boolean_t dsl_scan_is_paused_scrub(const dsl_scan_t *scn);
192
193 #ifdef __cplusplus
194 }
195 #endif
196
197 #endif /* _SYS_DSL_SCAN_H */
|