Print this page
4045 zfs write throttle & i/o scheduler performance work
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Adam Leventhal <ahl@delphix.com>
Reviewed by: Christopher Siden <christopher.siden@delphix.com>
Split |
Close |
Expand all |
Collapse all |
--- old/usr/src/uts/common/fs/zfs/sys/zio.h
+++ new/usr/src/uts/common/fs/zfs/sys/zio.h
1 1 /*
2 2 * CDDL HEADER START
3 3 *
4 4 * The contents of this file are subject to the terms of the
5 5 * Common Development and Distribution License (the "License").
6 6 * You may not use this file except in compliance with the License.
7 7 *
8 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 9 * or http://www.opensolaris.org/os/licensing.
10 10 * See the License for the specific language governing permissions
11 11 * and limitations under the License.
12 12 *
13 13 * When distributing Covered Code, include this CDDL HEADER in each
14 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
↓ open down ↓ |
14 lines elided |
↑ open up ↑ |
15 15 * If applicable, add the following below this CDDL HEADER, with the
16 16 * fields enclosed by brackets "[]" replaced with your own identifying
17 17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 18 *
19 19 * CDDL HEADER END
20 20 */
21 21
22 22 /*
23 23 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
24 24 * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
25 - * Copyright (c) 2012 by Delphix. All rights reserved.
25 + * Copyright (c) 2013 by Delphix. All rights reserved.
26 26 * Copyright (c) 2013 by Saso Kiselkov. All rights reserved.
27 27 */
28 28
29 29 #ifndef _ZIO_H
30 30 #define _ZIO_H
31 31
32 32 #include <sys/zfs_context.h>
33 33 #include <sys/spa.h>
34 34 #include <sys/txg.h>
35 35 #include <sys/avl.h>
36 36 #include <sys/fs/zfs.h>
37 37 #include <sys/zio_impl.h>
38 38
39 39 #ifdef __cplusplus
40 40 extern "C" {
41 41 #endif
42 42
43 43 /*
44 44 * Embedded checksum
45 45 */
46 46 #define ZEC_MAGIC 0x210da7ab10c7a11ULL
47 47
48 48 typedef struct zio_eck {
49 49 uint64_t zec_magic; /* for validation, endianness */
50 50 zio_cksum_t zec_cksum; /* 256-bit checksum */
51 51 } zio_eck_t;
52 52
53 53 /*
54 54 * Gang block headers are self-checksumming and contain an array
55 55 * of block pointers.
56 56 */
57 57 #define SPA_GANGBLOCKSIZE SPA_MINBLOCKSIZE
58 58 #define SPA_GBH_NBLKPTRS ((SPA_GANGBLOCKSIZE - \
59 59 sizeof (zio_eck_t)) / sizeof (blkptr_t))
60 60 #define SPA_GBH_FILLER ((SPA_GANGBLOCKSIZE - \
61 61 sizeof (zio_eck_t) - \
62 62 (SPA_GBH_NBLKPTRS * sizeof (blkptr_t))) /\
63 63 sizeof (uint64_t))
64 64
65 65 typedef struct zio_gbh {
66 66 blkptr_t zg_blkptr[SPA_GBH_NBLKPTRS];
67 67 uint64_t zg_filler[SPA_GBH_FILLER];
68 68 zio_eck_t zg_tail;
69 69 } zio_gbh_phys_t;
70 70
71 71 enum zio_checksum {
72 72 ZIO_CHECKSUM_INHERIT = 0,
73 73 ZIO_CHECKSUM_ON,
74 74 ZIO_CHECKSUM_OFF,
75 75 ZIO_CHECKSUM_LABEL,
76 76 ZIO_CHECKSUM_GANG_HEADER,
77 77 ZIO_CHECKSUM_ZILOG,
78 78 ZIO_CHECKSUM_FLETCHER_2,
79 79 ZIO_CHECKSUM_FLETCHER_4,
80 80 ZIO_CHECKSUM_SHA256,
81 81 ZIO_CHECKSUM_ZILOG2,
82 82 ZIO_CHECKSUM_FUNCTIONS
83 83 };
84 84
85 85 #define ZIO_CHECKSUM_ON_VALUE ZIO_CHECKSUM_FLETCHER_4
86 86 #define ZIO_CHECKSUM_DEFAULT ZIO_CHECKSUM_ON
87 87
88 88 #define ZIO_CHECKSUM_MASK 0xffULL
89 89 #define ZIO_CHECKSUM_VERIFY (1 << 8)
90 90
91 91 #define ZIO_DEDUPCHECKSUM ZIO_CHECKSUM_SHA256
92 92 #define ZIO_DEDUPDITTO_MIN 100
93 93
94 94 enum zio_compress {
95 95 ZIO_COMPRESS_INHERIT = 0,
96 96 ZIO_COMPRESS_ON,
97 97 ZIO_COMPRESS_OFF,
98 98 ZIO_COMPRESS_LZJB,
99 99 ZIO_COMPRESS_EMPTY,
100 100 ZIO_COMPRESS_GZIP_1,
101 101 ZIO_COMPRESS_GZIP_2,
102 102 ZIO_COMPRESS_GZIP_3,
103 103 ZIO_COMPRESS_GZIP_4,
104 104 ZIO_COMPRESS_GZIP_5,
105 105 ZIO_COMPRESS_GZIP_6,
106 106 ZIO_COMPRESS_GZIP_7,
107 107 ZIO_COMPRESS_GZIP_8,
108 108 ZIO_COMPRESS_GZIP_9,
109 109 ZIO_COMPRESS_ZLE,
110 110 ZIO_COMPRESS_LZ4,
111 111 ZIO_COMPRESS_FUNCTIONS
112 112 };
113 113
114 114 /* N.B. when altering this value, also change BOOTFS_COMPRESS_VALID below */
115 115 #define ZIO_COMPRESS_ON_VALUE ZIO_COMPRESS_LZJB
116 116 #define ZIO_COMPRESS_DEFAULT ZIO_COMPRESS_OFF
117 117
118 118 #define BOOTFS_COMPRESS_VALID(compress) \
↓ open down ↓ |
83 lines elided |
↑ open up ↑ |
119 119 ((compress) == ZIO_COMPRESS_LZJB || \
120 120 (compress) == ZIO_COMPRESS_LZ4 || \
121 121 ((compress) == ZIO_COMPRESS_ON && \
122 122 ZIO_COMPRESS_ON_VALUE == ZIO_COMPRESS_LZJB) || \
123 123 (compress) == ZIO_COMPRESS_OFF)
124 124
125 125 #define ZIO_FAILURE_MODE_WAIT 0
126 126 #define ZIO_FAILURE_MODE_CONTINUE 1
127 127 #define ZIO_FAILURE_MODE_PANIC 2
128 128
129 -#define ZIO_PRIORITY_NOW (zio_priority_table[0])
130 -#define ZIO_PRIORITY_SYNC_READ (zio_priority_table[1])
131 -#define ZIO_PRIORITY_SYNC_WRITE (zio_priority_table[2])
132 -#define ZIO_PRIORITY_LOG_WRITE (zio_priority_table[3])
133 -#define ZIO_PRIORITY_CACHE_FILL (zio_priority_table[4])
134 -#define ZIO_PRIORITY_AGG (zio_priority_table[5])
135 -#define ZIO_PRIORITY_FREE (zio_priority_table[6])
136 -#define ZIO_PRIORITY_ASYNC_WRITE (zio_priority_table[7])
137 -#define ZIO_PRIORITY_ASYNC_READ (zio_priority_table[8])
138 -#define ZIO_PRIORITY_RESILVER (zio_priority_table[9])
139 -#define ZIO_PRIORITY_SCRUB (zio_priority_table[10])
140 -#define ZIO_PRIORITY_DDT_PREFETCH (zio_priority_table[11])
141 -#define ZIO_PRIORITY_TABLE_SIZE 12
129 +typedef enum zio_priority {
130 + ZIO_PRIORITY_SYNC_READ,
131 + ZIO_PRIORITY_SYNC_WRITE, /* ZIL */
132 + ZIO_PRIORITY_ASYNC_READ, /* prefetch */
133 + ZIO_PRIORITY_ASYNC_WRITE, /* spa_sync() */
134 + ZIO_PRIORITY_SCRUB, /* asynchronous scrub/resilver reads */
135 + ZIO_PRIORITY_NUM_QUEUEABLE,
142 136
137 + ZIO_PRIORITY_NOW /* non-queued i/os (e.g. free) */
138 +} zio_priority_t;
139 +
143 140 #define ZIO_PIPELINE_CONTINUE 0x100
144 141 #define ZIO_PIPELINE_STOP 0x101
145 142
146 143 enum zio_flag {
147 144 /*
148 145 * Flags inherited by gang, ddt, and vdev children,
149 146 * and that must be equal for two zios to aggregate
150 147 */
151 148 ZIO_FLAG_DONT_AGGREGATE = 1 << 0,
152 149 ZIO_FLAG_IO_REPAIR = 1 << 1,
153 150 ZIO_FLAG_SELF_HEAL = 1 << 2,
154 151 ZIO_FLAG_RESILVER = 1 << 3,
155 152 ZIO_FLAG_SCRUB = 1 << 4,
156 153 ZIO_FLAG_SCAN_THREAD = 1 << 5,
157 154
158 155 #define ZIO_FLAG_AGG_INHERIT (ZIO_FLAG_CANFAIL - 1)
159 156
160 157 /*
161 158 * Flags inherited by ddt, gang, and vdev children.
162 159 */
163 160 ZIO_FLAG_CANFAIL = 1 << 6, /* must be first for INHERIT */
164 161 ZIO_FLAG_SPECULATIVE = 1 << 7,
165 162 ZIO_FLAG_CONFIG_WRITER = 1 << 8,
166 163 ZIO_FLAG_DONT_RETRY = 1 << 9,
167 164 ZIO_FLAG_DONT_CACHE = 1 << 10,
168 165 ZIO_FLAG_NODATA = 1 << 11,
169 166 ZIO_FLAG_INDUCE_DAMAGE = 1 << 12,
170 167
171 168 #define ZIO_FLAG_DDT_INHERIT (ZIO_FLAG_IO_RETRY - 1)
172 169 #define ZIO_FLAG_GANG_INHERIT (ZIO_FLAG_IO_RETRY - 1)
173 170
174 171 /*
175 172 * Flags inherited by vdev children.
176 173 */
177 174 ZIO_FLAG_IO_RETRY = 1 << 13, /* must be first for INHERIT */
178 175 ZIO_FLAG_PROBE = 1 << 14,
179 176 ZIO_FLAG_TRYHARD = 1 << 15,
180 177 ZIO_FLAG_OPTIONAL = 1 << 16,
181 178
182 179 #define ZIO_FLAG_VDEV_INHERIT (ZIO_FLAG_DONT_QUEUE - 1)
183 180
184 181 /*
185 182 * Flags not inherited by any children.
186 183 */
↓ open down ↓ |
34 lines elided |
↑ open up ↑ |
187 184 ZIO_FLAG_DONT_QUEUE = 1 << 17, /* must be first for INHERIT */
188 185 ZIO_FLAG_DONT_PROPAGATE = 1 << 18,
189 186 ZIO_FLAG_IO_BYPASS = 1 << 19,
190 187 ZIO_FLAG_IO_REWRITE = 1 << 20,
191 188 ZIO_FLAG_RAW = 1 << 21,
192 189 ZIO_FLAG_GANG_CHILD = 1 << 22,
193 190 ZIO_FLAG_DDT_CHILD = 1 << 23,
194 191 ZIO_FLAG_GODFATHER = 1 << 24,
195 192 ZIO_FLAG_NOPWRITE = 1 << 25,
196 193 ZIO_FLAG_REEXECUTED = 1 << 26,
194 + ZIO_FLAG_DELEGATED = 1 << 27,
197 195 };
198 196
199 197 #define ZIO_FLAG_MUSTSUCCEED 0
200 198
201 199 #define ZIO_DDT_CHILD_FLAGS(zio) \
202 200 (((zio)->io_flags & ZIO_FLAG_DDT_INHERIT) | \
203 201 ZIO_FLAG_DDT_CHILD | ZIO_FLAG_CANFAIL)
204 202
205 203 #define ZIO_GANG_CHILD_FLAGS(zio) \
206 204 (((zio)->io_flags & ZIO_FLAG_GANG_INHERIT) | \
207 205 ZIO_FLAG_GANG_CHILD | ZIO_FLAG_CANFAIL)
208 206
209 207 #define ZIO_VDEV_CHILD_FLAGS(zio) \
210 208 (((zio)->io_flags & ZIO_FLAG_VDEV_INHERIT) | \
211 209 ZIO_FLAG_CANFAIL)
212 210
213 211 enum zio_child {
214 212 ZIO_CHILD_VDEV = 0,
215 213 ZIO_CHILD_GANG,
216 214 ZIO_CHILD_DDT,
217 215 ZIO_CHILD_LOGICAL,
218 216 ZIO_CHILD_TYPES
219 217 };
220 218
221 219 enum zio_wait_type {
222 220 ZIO_WAIT_READY = 0,
223 221 ZIO_WAIT_DONE,
224 222 ZIO_WAIT_TYPES
225 223 };
↓ open down ↓ |
19 lines elided |
↑ open up ↑ |
226 224
227 225 /*
228 226 * We'll take the unused errnos, 'EBADE' and 'EBADR' (from the Convergent
229 227 * graveyard) to indicate checksum errors and fragmentation.
230 228 */
231 229 #define ECKSUM EBADE
232 230 #define EFRAGS EBADR
233 231
234 232 typedef void zio_done_func_t(zio_t *zio);
235 233
236 -extern uint8_t zio_priority_table[ZIO_PRIORITY_TABLE_SIZE];
237 -extern char *zio_type_name[ZIO_TYPES];
234 +extern const char *zio_type_name[ZIO_TYPES];
238 235
239 236 /*
240 237 * A bookmark is a four-tuple <objset, object, level, blkid> that uniquely
241 238 * identifies any block in the pool. By convention, the meta-objset (MOS)
242 239 * is objset 0, and the meta-dnode is object 0. This covers all blocks
243 240 * except root blocks and ZIL blocks, which are defined as follows:
244 241 *
245 242 * Root blocks (objset_phys_t) are object 0, level -1: <objset, 0, -1, 0>.
246 243 * ZIL blocks are bookmarked <objset, 0, -2, blkid == ZIL sequence number>.
247 244 * dmu_sync()ed ZIL data blocks are bookmarked <objset, object, -2, blkid>.
248 245 *
249 246 * Note: this structure is called a bookmark because its original purpose
250 247 * was to remember where to resume a pool-wide traverse.
251 248 *
252 249 * Note: this structure is passed between userland and the kernel.
253 250 * Therefore it must not change size or alignment between 32/64 bit
254 251 * compilation options.
255 252 */
256 253 typedef struct zbookmark {
257 254 uint64_t zb_objset;
258 255 uint64_t zb_object;
259 256 int64_t zb_level;
260 257 uint64_t zb_blkid;
261 258 } zbookmark_t;
262 259
263 260 #define SET_BOOKMARK(zb, objset, object, level, blkid) \
264 261 { \
265 262 (zb)->zb_objset = objset; \
266 263 (zb)->zb_object = object; \
267 264 (zb)->zb_level = level; \
268 265 (zb)->zb_blkid = blkid; \
269 266 }
270 267
271 268 #define ZB_DESTROYED_OBJSET (-1ULL)
272 269
273 270 #define ZB_ROOT_OBJECT (0ULL)
274 271 #define ZB_ROOT_LEVEL (-1LL)
275 272 #define ZB_ROOT_BLKID (0ULL)
276 273
277 274 #define ZB_ZIL_OBJECT (0ULL)
278 275 #define ZB_ZIL_LEVEL (-2LL)
279 276
280 277 #define ZB_IS_ZERO(zb) \
281 278 ((zb)->zb_objset == 0 && (zb)->zb_object == 0 && \
282 279 (zb)->zb_level == 0 && (zb)->zb_blkid == 0)
283 280 #define ZB_IS_ROOT(zb) \
284 281 ((zb)->zb_object == ZB_ROOT_OBJECT && \
285 282 (zb)->zb_level == ZB_ROOT_LEVEL && \
286 283 (zb)->zb_blkid == ZB_ROOT_BLKID)
287 284
288 285 typedef struct zio_prop {
289 286 enum zio_checksum zp_checksum;
290 287 enum zio_compress zp_compress;
291 288 dmu_object_type_t zp_type;
292 289 uint8_t zp_level;
293 290 uint8_t zp_copies;
294 291 boolean_t zp_dedup;
295 292 boolean_t zp_dedup_verify;
296 293 boolean_t zp_nopwrite;
297 294 } zio_prop_t;
298 295
299 296 typedef struct zio_cksum_report zio_cksum_report_t;
300 297
301 298 typedef void zio_cksum_finish_f(zio_cksum_report_t *rep,
302 299 const void *good_data);
303 300 typedef void zio_cksum_free_f(void *cbdata, size_t size);
304 301
305 302 struct zio_bad_cksum; /* defined in zio_checksum.h */
306 303 struct dnode_phys;
307 304
308 305 struct zio_cksum_report {
309 306 struct zio_cksum_report *zcr_next;
310 307 nvlist_t *zcr_ereport;
311 308 nvlist_t *zcr_detector;
312 309 void *zcr_cbdata;
313 310 size_t zcr_cbinfo; /* passed to zcr_free() */
314 311 uint64_t zcr_align;
315 312 uint64_t zcr_length;
316 313 zio_cksum_finish_f *zcr_finish;
317 314 zio_cksum_free_f *zcr_free;
318 315
319 316 /* internal use only */
320 317 struct zio_bad_cksum *zcr_ckinfo; /* information from failure */
321 318 };
322 319
323 320 typedef void zio_vsd_cksum_report_f(zio_t *zio, zio_cksum_report_t *zcr,
324 321 void *arg);
325 322
326 323 zio_vsd_cksum_report_f zio_vsd_default_cksum_report;
327 324
328 325 typedef struct zio_vsd_ops {
329 326 zio_done_func_t *vsd_free;
330 327 zio_vsd_cksum_report_f *vsd_cksum_report;
331 328 } zio_vsd_ops_t;
332 329
333 330 typedef struct zio_gang_node {
334 331 zio_gbh_phys_t *gn_gbh;
335 332 struct zio_gang_node *gn_child[SPA_GBH_NBLKPTRS];
336 333 } zio_gang_node_t;
337 334
338 335 typedef zio_t *zio_gang_issue_func_t(zio_t *zio, blkptr_t *bp,
339 336 zio_gang_node_t *gn, void *data);
340 337
341 338 typedef void zio_transform_func_t(zio_t *zio, void *data, uint64_t size);
342 339
343 340 typedef struct zio_transform {
344 341 void *zt_orig_data;
345 342 uint64_t zt_orig_size;
346 343 uint64_t zt_bufsize;
347 344 zio_transform_func_t *zt_transform;
348 345 struct zio_transform *zt_next;
349 346 } zio_transform_t;
350 347
351 348 typedef int zio_pipe_stage_t(zio_t *zio);
352 349
353 350 /*
354 351 * The io_reexecute flags are distinct from io_flags because the child must
355 352 * be able to propagate them to the parent. The normal io_flags are local
356 353 * to the zio, not protected by any lock, and not modifiable by children;
357 354 * the reexecute flags are protected by io_lock, modifiable by children,
358 355 * and always propagated -- even when ZIO_FLAG_DONT_PROPAGATE is set.
359 356 */
360 357 #define ZIO_REEXECUTE_NOW 0x01
361 358 #define ZIO_REEXECUTE_SUSPEND 0x02
362 359
363 360 typedef struct zio_link {
364 361 zio_t *zl_parent;
365 362 zio_t *zl_child;
366 363 list_node_t zl_parent_node;
↓ open down ↓ |
119 lines elided |
↑ open up ↑ |
367 364 list_node_t zl_child_node;
368 365 } zio_link_t;
369 366
370 367 struct zio {
371 368 /* Core information about this I/O */
372 369 zbookmark_t io_bookmark;
373 370 zio_prop_t io_prop;
374 371 zio_type_t io_type;
375 372 enum zio_child io_child_type;
376 373 int io_cmd;
377 - uint8_t io_priority;
374 + zio_priority_t io_priority;
378 375 uint8_t io_reexecute;
379 376 uint8_t io_state[ZIO_WAIT_TYPES];
380 377 uint64_t io_txg;
381 378 spa_t *io_spa;
382 379 blkptr_t *io_bp;
383 380 blkptr_t *io_bp_override;
384 381 blkptr_t io_bp_copy;
385 382 list_t io_parent_list;
386 383 list_t io_child_list;
387 384 zio_link_t *io_walk_link;
388 385 zio_t *io_logical;
389 386 zio_transform_t *io_transform_stack;
390 387
391 388 /* Callback info */
392 389 zio_done_func_t *io_ready;
390 + zio_done_func_t *io_physdone;
393 391 zio_done_func_t *io_done;
394 392 void *io_private;
395 393 int64_t io_prev_space_delta; /* DMU private */
396 394 blkptr_t io_bp_orig;
397 395
398 396 /* Data represented by this I/O */
399 397 void *io_data;
400 398 void *io_orig_data;
401 399 uint64_t io_size;
402 400 uint64_t io_orig_size;
403 401
404 402 /* Stuff for the vdev stack */
405 403 vdev_t *io_vd;
406 404 void *io_vsd;
407 405 const zio_vsd_ops_t *io_vsd_ops;
408 406
409 407 uint64_t io_offset;
410 - uint64_t io_deadline;
411 408 hrtime_t io_timestamp;
412 - avl_node_t io_offset_node;
413 - avl_node_t io_deadline_node;
414 - avl_tree_t *io_vdev_tree;
409 + avl_node_t io_queue_node;
415 410
416 411 /* Internal pipeline state */
417 412 enum zio_flag io_flags;
418 413 enum zio_stage io_stage;
419 414 enum zio_stage io_pipeline;
420 415 enum zio_flag io_orig_flags;
421 416 enum zio_stage io_orig_stage;
422 417 enum zio_stage io_orig_pipeline;
423 418 int io_error;
424 419 int io_child_error[ZIO_CHILD_TYPES];
425 420 uint64_t io_children[ZIO_CHILD_TYPES][ZIO_WAIT_TYPES];
426 421 uint64_t io_child_count;
422 + uint64_t io_phys_children;
427 423 uint64_t io_parent_count;
428 424 uint64_t *io_stall;
429 425 zio_t *io_gang_leader;
430 426 zio_gang_node_t *io_gang_tree;
431 427 void *io_executor;
432 428 void *io_waiter;
433 429 kmutex_t io_lock;
434 430 kcondvar_t io_cv;
435 431
436 432 /* FMA state */
437 433 zio_cksum_report_t *io_cksum_report;
438 434 uint64_t io_ena;
439 435
440 436 /* Taskq dispatching state */
441 437 taskq_ent_t io_tqent;
↓ open down ↓ |
5 lines elided |
↑ open up ↑ |
442 438 };
443 439
444 440 extern zio_t *zio_null(zio_t *pio, spa_t *spa, vdev_t *vd,
445 441 zio_done_func_t *done, void *private, enum zio_flag flags);
446 442
447 443 extern zio_t *zio_root(spa_t *spa,
448 444 zio_done_func_t *done, void *private, enum zio_flag flags);
449 445
450 446 extern zio_t *zio_read(zio_t *pio, spa_t *spa, const blkptr_t *bp, void *data,
451 447 uint64_t size, zio_done_func_t *done, void *private,
452 - int priority, enum zio_flag flags, const zbookmark_t *zb);
448 + zio_priority_t priority, enum zio_flag flags, const zbookmark_t *zb);
453 449
454 450 extern zio_t *zio_write(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp,
455 451 void *data, uint64_t size, const zio_prop_t *zp,
456 - zio_done_func_t *ready, zio_done_func_t *done, void *private,
457 - int priority, enum zio_flag flags, const zbookmark_t *zb);
452 + zio_done_func_t *ready, zio_done_func_t *physdone, zio_done_func_t *done,
453 + void *private,
454 + zio_priority_t priority, enum zio_flag flags, const zbookmark_t *zb);
458 455
459 456 extern zio_t *zio_rewrite(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp,
460 457 void *data, uint64_t size, zio_done_func_t *done, void *private,
461 - int priority, enum zio_flag flags, zbookmark_t *zb);
458 + zio_priority_t priority, enum zio_flag flags, zbookmark_t *zb);
462 459
463 460 extern void zio_write_override(zio_t *zio, blkptr_t *bp, int copies,
464 461 boolean_t nopwrite);
465 462
466 463 extern void zio_free(spa_t *spa, uint64_t txg, const blkptr_t *bp);
467 464
468 465 extern zio_t *zio_claim(zio_t *pio, spa_t *spa, uint64_t txg,
469 466 const blkptr_t *bp,
470 467 zio_done_func_t *done, void *private, enum zio_flag flags);
471 468
472 469 extern zio_t *zio_ioctl(zio_t *pio, spa_t *spa, vdev_t *vd, int cmd,
473 - zio_done_func_t *done, void *private, int priority, enum zio_flag flags);
470 + zio_done_func_t *done, void *private, enum zio_flag flags);
474 471
475 472 extern zio_t *zio_read_phys(zio_t *pio, vdev_t *vd, uint64_t offset,
476 473 uint64_t size, void *data, int checksum,
477 - zio_done_func_t *done, void *private, int priority, enum zio_flag flags,
478 - boolean_t labels);
474 + zio_done_func_t *done, void *private, zio_priority_t priority,
475 + enum zio_flag flags, boolean_t labels);
479 476
480 477 extern zio_t *zio_write_phys(zio_t *pio, vdev_t *vd, uint64_t offset,
481 478 uint64_t size, void *data, int checksum,
482 - zio_done_func_t *done, void *private, int priority, enum zio_flag flags,
483 - boolean_t labels);
479 + zio_done_func_t *done, void *private, zio_priority_t priority,
480 + enum zio_flag flags, boolean_t labels);
484 481
485 482 extern zio_t *zio_free_sync(zio_t *pio, spa_t *spa, uint64_t txg,
486 483 const blkptr_t *bp, enum zio_flag flags);
487 484
488 485 extern int zio_alloc_zil(spa_t *spa, uint64_t txg, blkptr_t *new_bp,
489 486 blkptr_t *old_bp, uint64_t size, boolean_t use_slog);
490 487 extern void zio_free_zil(spa_t *spa, uint64_t txg, blkptr_t *bp);
491 488 extern void zio_flush(zio_t *zio, vdev_t *vd);
492 489 extern void zio_shrink(zio_t *zio, uint64_t size);
493 490
494 491 extern int zio_wait(zio_t *zio);
495 492 extern void zio_nowait(zio_t *zio);
496 493 extern void zio_execute(zio_t *zio);
497 494 extern void zio_interrupt(zio_t *zio);
498 495
499 496 extern zio_t *zio_walk_parents(zio_t *cio);
500 497 extern zio_t *zio_walk_children(zio_t *pio);
501 498 extern zio_t *zio_unique_parent(zio_t *cio);
↓ open down ↓ |
8 lines elided |
↑ open up ↑ |
502 499 extern void zio_add_child(zio_t *pio, zio_t *cio);
503 500
504 501 extern void *zio_buf_alloc(size_t size);
505 502 extern void zio_buf_free(void *buf, size_t size);
506 503 extern void *zio_data_buf_alloc(size_t size);
507 504 extern void zio_data_buf_free(void *buf, size_t size);
508 505
509 506 extern void zio_resubmit_stage_async(void *);
510 507
511 508 extern zio_t *zio_vdev_child_io(zio_t *zio, blkptr_t *bp, vdev_t *vd,
512 - uint64_t offset, void *data, uint64_t size, int type, int priority,
513 - enum zio_flag flags, zio_done_func_t *done, void *private);
509 + uint64_t offset, void *data, uint64_t size, int type,
510 + zio_priority_t priority, enum zio_flag flags,
511 + zio_done_func_t *done, void *private);
514 512
515 513 extern zio_t *zio_vdev_delegated_io(vdev_t *vd, uint64_t offset,
516 - void *data, uint64_t size, int type, int priority,
514 + void *data, uint64_t size, int type, zio_priority_t priority,
517 515 enum zio_flag flags, zio_done_func_t *done, void *private);
518 516
519 517 extern void zio_vdev_io_bypass(zio_t *zio);
520 518 extern void zio_vdev_io_reissue(zio_t *zio);
521 519 extern void zio_vdev_io_redone(zio_t *zio);
522 520
523 521 extern void zio_checksum_verified(zio_t *zio);
524 522 extern int zio_worst_error(int e1, int e2);
525 523
526 524 extern enum zio_checksum zio_checksum_select(enum zio_checksum child,
527 525 enum zio_checksum parent);
528 526 extern enum zio_checksum zio_checksum_dedup_select(spa_t *spa,
529 527 enum zio_checksum child, enum zio_checksum parent);
530 528 extern enum zio_compress zio_compress_select(enum zio_compress child,
531 529 enum zio_compress parent);
532 530
533 531 extern void zio_suspend(spa_t *spa, zio_t *zio);
534 532 extern int zio_resume(spa_t *spa);
535 533 extern void zio_resume_wait(spa_t *spa);
536 534
537 535 /*
538 536 * Initial setup and teardown.
539 537 */
540 538 extern void zio_init(void);
541 539 extern void zio_fini(void);
542 540
543 541 /*
544 542 * Fault injection
545 543 */
546 544 struct zinject_record;
547 545 extern uint32_t zio_injection_enabled;
548 546 extern int zio_inject_fault(char *name, int flags, int *id,
549 547 struct zinject_record *record);
550 548 extern int zio_inject_list_next(int *id, char *name, size_t buflen,
551 549 struct zinject_record *record);
552 550 extern int zio_clear_fault(int id);
553 551 extern void zio_handle_panic_injection(spa_t *spa, char *tag, uint64_t type);
554 552 extern int zio_handle_fault_injection(zio_t *zio, int error);
555 553 extern int zio_handle_device_injection(vdev_t *vd, zio_t *zio, int error);
556 554 extern int zio_handle_label_injection(zio_t *zio, int error);
557 555 extern void zio_handle_ignored_writes(zio_t *zio);
558 556 extern uint64_t zio_handle_io_delay(zio_t *zio);
559 557
560 558 /*
561 559 * Checksum ereport functions
562 560 */
563 561 extern void zfs_ereport_start_checksum(spa_t *spa, vdev_t *vd, struct zio *zio,
564 562 uint64_t offset, uint64_t length, void *arg, struct zio_bad_cksum *info);
565 563 extern void zfs_ereport_finish_checksum(zio_cksum_report_t *report,
566 564 const void *good_data, const void *bad_data, boolean_t drop_if_identical);
567 565
568 566 extern void zfs_ereport_send_interim_checksum(zio_cksum_report_t *report);
569 567 extern void zfs_ereport_free_checksum(zio_cksum_report_t *report);
570 568
571 569 /* If we have the good data in hand, this function can be used */
572 570 extern void zfs_ereport_post_checksum(spa_t *spa, vdev_t *vd,
573 571 struct zio *zio, uint64_t offset, uint64_t length,
574 572 const void *good_data, const void *bad_data, struct zio_bad_cksum *info);
575 573
576 574 /* Called from spa_sync(), but primarily an injection handler */
577 575 extern void spa_handle_ignored_writes(spa_t *spa);
578 576
579 577 /* zbookmark functions */
580 578 boolean_t zbookmark_is_before(const struct dnode_phys *dnp,
581 579 const zbookmark_t *zb1, const zbookmark_t *zb2);
582 580
583 581 #ifdef __cplusplus
584 582 }
585 583 #endif
586 584
587 585 #endif /* _ZIO_H */
↓ open down ↓ |
61 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX