* Actually issue the prefetch read for the block given. */
| 3093 | * Actually issue the prefetch read for the block given. |
| 3094 | */ |
| 3095 | static void |
| 3096 | dbuf_issue_final_prefetch(dbuf_prefetch_arg_t *dpa, blkptr_t *bp) |
| 3097 | { |
| 3098 | ASSERT(!BP_IS_REDACTED(bp) || |
| 3099 | dsl_dataset_feature_is_active( |
| 3100 | dpa->dpa_dnode->dn_objset->os_dsl_dataset, |
| 3101 | SPA_FEATURE_REDACTED_DATASETS)); |
| 3102 | |
| 3103 | if (BP_IS_HOLE(bp) || BP_IS_EMBEDDED(bp) || BP_IS_REDACTED(bp)) |
| 3104 | return (dbuf_prefetch_fini(dpa, B_FALSE)); |
| 3105 | |
| 3106 | int zio_flags = ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE; |
| 3107 | arc_flags_t aflags = |
| 3108 | dpa->dpa_aflags | ARC_FLAG_NOWAIT | ARC_FLAG_PREFETCH | |
| 3109 | ARC_FLAG_NO_BUF; |
| 3110 | |
| 3111 | /* dnodes are always read as raw and then converted later */ |
| 3112 | if (BP_GET_TYPE(bp) == DMU_OT_DNODE && BP_IS_PROTECTED(bp) && |
| 3113 | dpa->dpa_curlevel == 0) |
| 3114 | zio_flags |= ZIO_FLAG_RAW; |
| 3115 | |
| 3116 | ASSERT3U(dpa->dpa_curlevel, ==, BP_GET_LEVEL(bp)); |
| 3117 | ASSERT3U(dpa->dpa_curlevel, ==, dpa->dpa_zb.zb_level); |
| 3118 | ASSERT(dpa->dpa_zio != NULL); |
| 3119 | (void) arc_read(dpa->dpa_zio, dpa->dpa_spa, bp, |
| 3120 | dbuf_issue_final_prefetch_done, dpa, |
| 3121 | dpa->dpa_prio, zio_flags, &aflags, &dpa->dpa_zb); |
| 3122 | } |
| 3123 | |
| 3124 | /* |
| 3125 | * Called when an indirect block above our prefetch target is read in. This |
no test coverage detected