Deleted Added
full compact
dmu_traverse.c (236884) dmu_traverse.c (240133)
1/*
2 * CDDL HEADER START
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

--- 49 unchanged lines hidden (view full) ---

58 int td_flags;
59 prefetch_data_t *td_pfd;
60 blkptr_cb_t *td_func;
61 void *td_arg;
62} traverse_data_t;
63
64static int traverse_dnode(traverse_data_t *td, const dnode_phys_t *dnp,
65 arc_buf_t *buf, uint64_t objset, uint64_t object);
1/*
2 * CDDL HEADER START
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

--- 49 unchanged lines hidden (view full) ---

58 int td_flags;
59 prefetch_data_t *td_pfd;
60 blkptr_cb_t *td_func;
61 void *td_arg;
62} traverse_data_t;
63
64static int traverse_dnode(traverse_data_t *td, const dnode_phys_t *dnp,
65 arc_buf_t *buf, uint64_t objset, uint64_t object);
66static void prefetch_dnode_metadata(traverse_data_t *td, const dnode_phys_t *,
67 arc_buf_t *buf, uint64_t objset, uint64_t object);
66
67static int
68traverse_zil_block(zilog_t *zilog, blkptr_t *bp, void *arg, uint64_t claim_txg)
69{
70 traverse_data_t *td = arg;
71 zbookmark_t zb;
72
73 if (bp->blk_birth == 0)

--- 99 unchanged lines hidden (view full) ---

173static void
174traverse_pause(traverse_data_t *td, const zbookmark_t *zb)
175{
176 ASSERT(td->td_resume != NULL);
177 ASSERT3U(zb->zb_level, ==, 0);
178 bcopy(zb, td->td_resume, sizeof (*td->td_resume));
179}
180
68
69static int
70traverse_zil_block(zilog_t *zilog, blkptr_t *bp, void *arg, uint64_t claim_txg)
71{
72 traverse_data_t *td = arg;
73 zbookmark_t zb;
74
75 if (bp->blk_birth == 0)

--- 99 unchanged lines hidden (view full) ---

175static void
176traverse_pause(traverse_data_t *td, const zbookmark_t *zb)
177{
178 ASSERT(td->td_resume != NULL);
179 ASSERT3U(zb->zb_level, ==, 0);
180 bcopy(zb, td->td_resume, sizeof (*td->td_resume));
181}
182
183static void
184traverse_prefetch_metadata(traverse_data_t *td,
185 arc_buf_t *pbuf, const blkptr_t *bp, const zbookmark_t *zb)
186{
187 uint32_t flags = ARC_NOWAIT | ARC_PREFETCH;
188
189 if (!(td->td_flags & TRAVERSE_PREFETCH_METADATA))
190 return;
191 /*
192 * If we are in the process of resuming, don't prefetch, because
193 * some children will not be needed (and in fact may have already
194 * been freed).
195 */
196 if (td->td_resume != NULL && !ZB_IS_ZERO(td->td_resume))
197 return;
198 if (BP_IS_HOLE(bp) || bp->blk_birth <= td->td_min_txg)
199 return;
200 if (BP_GET_LEVEL(bp) == 0 && BP_GET_TYPE(bp) != DMU_OT_DNODE)
201 return;
202
203 (void) arc_read(NULL, td->td_spa, bp,
204 pbuf, NULL, NULL, ZIO_PRIORITY_ASYNC_READ,
205 ZIO_FLAG_CANFAIL, &flags, zb);
206}
207
181static int
182traverse_visitbp(traverse_data_t *td, const dnode_phys_t *dnp,
208static int
209traverse_visitbp(traverse_data_t *td, const dnode_phys_t *dnp,
183 arc_buf_t *pbuf, blkptr_t *bp, const zbookmark_t *zb)
210 arc_buf_t *pbuf, const blkptr_t *bp, const zbookmark_t *zb)
184{
185 zbookmark_t czb;
186 int err = 0, lasterr = 0;
187 arc_buf_t *buf = NULL;
188 prefetch_data_t *pd = td->td_pfd;
189 boolean_t hard = td->td_flags & TRAVERSE_HARD;
190 boolean_t pause = B_FALSE;
191

--- 46 unchanged lines hidden (view full) ---

238 blkptr_t *cbp;
239 int epb = BP_GET_LSIZE(bp) >> SPA_BLKPTRSHIFT;
240
241 err = dsl_read(NULL, td->td_spa, bp, pbuf,
242 arc_getbuf_func, &buf,
243 ZIO_PRIORITY_ASYNC_READ, ZIO_FLAG_CANFAIL, &flags, zb);
244 if (err)
245 return (err);
211{
212 zbookmark_t czb;
213 int err = 0, lasterr = 0;
214 arc_buf_t *buf = NULL;
215 prefetch_data_t *pd = td->td_pfd;
216 boolean_t hard = td->td_flags & TRAVERSE_HARD;
217 boolean_t pause = B_FALSE;
218

--- 46 unchanged lines hidden (view full) ---

265 blkptr_t *cbp;
266 int epb = BP_GET_LSIZE(bp) >> SPA_BLKPTRSHIFT;
267
268 err = dsl_read(NULL, td->td_spa, bp, pbuf,
269 arc_getbuf_func, &buf,
270 ZIO_PRIORITY_ASYNC_READ, ZIO_FLAG_CANFAIL, &flags, zb);
271 if (err)
272 return (err);
273 cbp = buf->b_data;
246
274
275 for (i = 0; i < epb; i++) {
276 SET_BOOKMARK(&czb, zb->zb_objset, zb->zb_object,
277 zb->zb_level - 1,
278 zb->zb_blkid * epb + i);
279 traverse_prefetch_metadata(td, buf, &cbp[i], &czb);
280 }
281
247 /* recursively visitbp() blocks below this */
282 /* recursively visitbp() blocks below this */
248 cbp = buf->b_data;
249 for (i = 0; i < epb; i++, cbp++) {
283 for (i = 0; i < epb; i++) {
250 SET_BOOKMARK(&czb, zb->zb_objset, zb->zb_object,
251 zb->zb_level - 1,
252 zb->zb_blkid * epb + i);
284 SET_BOOKMARK(&czb, zb->zb_objset, zb->zb_object,
285 zb->zb_level - 1,
286 zb->zb_blkid * epb + i);
253 err = traverse_visitbp(td, dnp, buf, cbp, &czb);
287 err = traverse_visitbp(td, dnp, buf, &cbp[i], &czb);
254 if (err) {
255 if (!hard)
256 break;
257 lasterr = err;
258 }
259 }
260 } else if (BP_GET_TYPE(bp) == DMU_OT_DNODE) {
261 uint32_t flags = ARC_WAIT;
262 int i;
263 int epb = BP_GET_LSIZE(bp) >> DNODE_SHIFT;
264
265 err = dsl_read(NULL, td->td_spa, bp, pbuf,
266 arc_getbuf_func, &buf,
267 ZIO_PRIORITY_ASYNC_READ, ZIO_FLAG_CANFAIL, &flags, zb);
268 if (err)
269 return (err);
288 if (err) {
289 if (!hard)
290 break;
291 lasterr = err;
292 }
293 }
294 } else if (BP_GET_TYPE(bp) == DMU_OT_DNODE) {
295 uint32_t flags = ARC_WAIT;
296 int i;
297 int epb = BP_GET_LSIZE(bp) >> DNODE_SHIFT;
298
299 err = dsl_read(NULL, td->td_spa, bp, pbuf,
300 arc_getbuf_func, &buf,
301 ZIO_PRIORITY_ASYNC_READ, ZIO_FLAG_CANFAIL, &flags, zb);
302 if (err)
303 return (err);
304 dnp = buf->b_data;
270
305
306 for (i = 0; i < epb; i++) {
307 prefetch_dnode_metadata(td, &dnp[i], buf, zb->zb_objset,
308 zb->zb_blkid * epb + i);
309 }
310
271 /* recursively visitbp() blocks below this */
311 /* recursively visitbp() blocks below this */
272 dnp = buf->b_data;
273 for (i = 0; i < epb; i++, dnp++) {
274 err = traverse_dnode(td, dnp, buf, zb->zb_objset,
312 for (i = 0; i < epb; i++) {
313 err = traverse_dnode(td, &dnp[i], buf, zb->zb_objset,
275 zb->zb_blkid * epb + i);
276 if (err) {
277 if (!hard)
278 break;
279 lasterr = err;
280 }
281 }
282 } else if (BP_GET_TYPE(bp) == DMU_OT_OBJSET) {

--- 4 unchanged lines hidden (view full) ---

287 err = dsl_read_nolock(NULL, td->td_spa, bp,
288 arc_getbuf_func, &buf,
289 ZIO_PRIORITY_ASYNC_READ, ZIO_FLAG_CANFAIL, &flags, zb);
290 if (err)
291 return (err);
292
293 osp = buf->b_data;
294 dnp = &osp->os_meta_dnode;
314 zb->zb_blkid * epb + i);
315 if (err) {
316 if (!hard)
317 break;
318 lasterr = err;
319 }
320 }
321 } else if (BP_GET_TYPE(bp) == DMU_OT_OBJSET) {

--- 4 unchanged lines hidden (view full) ---

326 err = dsl_read_nolock(NULL, td->td_spa, bp,
327 arc_getbuf_func, &buf,
328 ZIO_PRIORITY_ASYNC_READ, ZIO_FLAG_CANFAIL, &flags, zb);
329 if (err)
330 return (err);
331
332 osp = buf->b_data;
333 dnp = &osp->os_meta_dnode;
334 prefetch_dnode_metadata(td, dnp, buf, zb->zb_objset,
335 DMU_META_DNODE_OBJECT);
336 if (arc_buf_size(buf) >= sizeof (objset_phys_t)) {
337 prefetch_dnode_metadata(td, &osp->os_userused_dnode,
338 buf, zb->zb_objset, DMU_USERUSED_OBJECT);
339 prefetch_dnode_metadata(td, &osp->os_groupused_dnode,
340 buf, zb->zb_objset, DMU_USERUSED_OBJECT);
341 }
342
295 err = traverse_dnode(td, dnp, buf, zb->zb_objset,
296 DMU_META_DNODE_OBJECT);
297 if (err && hard) {
298 lasterr = err;
299 err = 0;
300 }
301 if (err == 0 && arc_buf_size(buf) >= sizeof (objset_phys_t)) {
302 dnp = &osp->os_userused_dnode;

--- 26 unchanged lines hidden (view full) ---

329 ASSERT3U(err, ==, ERESTART);
330 ASSERT(!hard);
331 traverse_pause(td, zb);
332 }
333
334 return (err != 0 ? err : lasterr);
335}
336
343 err = traverse_dnode(td, dnp, buf, zb->zb_objset,
344 DMU_META_DNODE_OBJECT);
345 if (err && hard) {
346 lasterr = err;
347 err = 0;
348 }
349 if (err == 0 && arc_buf_size(buf) >= sizeof (objset_phys_t)) {
350 dnp = &osp->os_userused_dnode;

--- 26 unchanged lines hidden (view full) ---

377 ASSERT3U(err, ==, ERESTART);
378 ASSERT(!hard);
379 traverse_pause(td, zb);
380 }
381
382 return (err != 0 ? err : lasterr);
383}
384
385static void
386prefetch_dnode_metadata(traverse_data_t *td, const dnode_phys_t *dnp,
387 arc_buf_t *buf, uint64_t objset, uint64_t object)
388{
389 int j;
390 zbookmark_t czb;
391
392 for (j = 0; j < dnp->dn_nblkptr; j++) {
393 SET_BOOKMARK(&czb, objset, object, dnp->dn_nlevels - 1, j);
394 traverse_prefetch_metadata(td, buf, &dnp->dn_blkptr[j], &czb);
395 }
396
397 if (dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR) {
398 SET_BOOKMARK(&czb, objset, object, 0, DMU_SPILL_BLKID);
399 traverse_prefetch_metadata(td, buf, &dnp->dn_spill, &czb);
400 }
401}
402
337static int
338traverse_dnode(traverse_data_t *td, const dnode_phys_t *dnp,
339 arc_buf_t *buf, uint64_t objset, uint64_t object)
340{
341 int j, err = 0, lasterr = 0;
342 zbookmark_t czb;
343 boolean_t hard = (td->td_flags & TRAVERSE_HARD);
344
345 for (j = 0; j < dnp->dn_nblkptr; j++) {
346 SET_BOOKMARK(&czb, objset, object, dnp->dn_nlevels - 1, j);
403static int
404traverse_dnode(traverse_data_t *td, const dnode_phys_t *dnp,
405 arc_buf_t *buf, uint64_t objset, uint64_t object)
406{
407 int j, err = 0, lasterr = 0;
408 zbookmark_t czb;
409 boolean_t hard = (td->td_flags & TRAVERSE_HARD);
410
411 for (j = 0; j < dnp->dn_nblkptr; j++) {
412 SET_BOOKMARK(&czb, objset, object, dnp->dn_nlevels - 1, j);
347 err = traverse_visitbp(td, dnp, buf,
348 (blkptr_t *)&dnp->dn_blkptr[j], &czb);
413 err = traverse_visitbp(td, dnp, buf, &dnp->dn_blkptr[j], &czb);
349 if (err) {
350 if (!hard)
351 break;
352 lasterr = err;
353 }
354 }
355
356 if (dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR) {
414 if (err) {
415 if (!hard)
416 break;
417 lasterr = err;
418 }
419 }
420
421 if (dnp->dn_flags & DNODE_FLAG_SPILL_BLKPTR) {
357 SET_BOOKMARK(&czb, objset,
358 object, 0, DMU_SPILL_BLKID);
359 err = traverse_visitbp(td, dnp, buf,
360 (blkptr_t *)&dnp->dn_spill, &czb);
422 SET_BOOKMARK(&czb, objset, object, 0, DMU_SPILL_BLKID);
423 err = traverse_visitbp(td, dnp, buf, &dnp->dn_spill, &czb);
361 if (err) {
362 if (!hard)
363 return (err);
364 lasterr = err;
365 }
366 }
367 return (err != 0 ? err : lasterr);
368}

--- 64 unchanged lines hidden (view full) ---

433 traverse_data_t td;
434 prefetch_data_t pd = { 0 };
435 zbookmark_t czb;
436 int err;
437
438 ASSERT(ds == NULL || objset == ds->ds_object);
439 ASSERT(!(flags & TRAVERSE_PRE) || !(flags & TRAVERSE_POST));
440
424 if (err) {
425 if (!hard)
426 return (err);
427 lasterr = err;
428 }
429 }
430 return (err != 0 ? err : lasterr);
431}

--- 64 unchanged lines hidden (view full) ---

496 traverse_data_t td;
497 prefetch_data_t pd = { 0 };
498 zbookmark_t czb;
499 int err;
500
501 ASSERT(ds == NULL || objset == ds->ds_object);
502 ASSERT(!(flags & TRAVERSE_PRE) || !(flags & TRAVERSE_POST));
503
504 /*
505 * The data prefetching mechanism (the prefetch thread) is incompatible
506 * with resuming from a bookmark.
507 */
508 ASSERT(resume == NULL || !(flags & TRAVERSE_PREFETCH_DATA));
509
441 td.td_spa = spa;
442 td.td_objset = objset;
443 td.td_rootbp = rootbp;
444 td.td_min_txg = txg_start;
445 td.td_resume = resume;
446 td.td_func = func;
447 td.td_arg = arg;
448 td.td_pfd = &pd;

--- 10 unchanged lines hidden (view full) ---

459
460 err = dmu_objset_from_ds(ds, &os);
461 if (err)
462 return (err);
463
464 traverse_zil(&td, &os->os_zil_header);
465 }
466
510 td.td_spa = spa;
511 td.td_objset = objset;
512 td.td_rootbp = rootbp;
513 td.td_min_txg = txg_start;
514 td.td_resume = resume;
515 td.td_func = func;
516 td.td_arg = arg;
517 td.td_pfd = &pd;

--- 10 unchanged lines hidden (view full) ---

528
529 err = dmu_objset_from_ds(ds, &os);
530 if (err)
531 return (err);
532
533 traverse_zil(&td, &os->os_zil_header);
534 }
535
467 if (!(flags & TRAVERSE_PREFETCH) ||
536 if (!(flags & TRAVERSE_PREFETCH_DATA) ||
468 0 == taskq_dispatch(system_taskq, traverse_prefetch_thread,
469 &td, TQ_NOQUEUE))
470 pd.pd_exited = B_TRUE;
471
472 SET_BOOKMARK(&czb, td.td_objset,
473 ZB_ROOT_OBJECT, ZB_ROOT_LEVEL, ZB_ROOT_BLKID);
474 err = traverse_visitbp(&td, NULL, NULL, rootbp, &czb);
475

--- 94 unchanged lines hidden ---
537 0 == taskq_dispatch(system_taskq, traverse_prefetch_thread,
538 &td, TQ_NOQUEUE))
539 pd.pd_exited = B_TRUE;
540
541 SET_BOOKMARK(&czb, td.td_objset,
542 ZB_ROOT_OBJECT, ZB_ROOT_LEVEL, ZB_ROOT_BLKID);
543 err = traverse_visitbp(&td, NULL, NULL, rootbp, &czb);
544

--- 94 unchanged lines hidden ---