]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Encrypted dnode blocks should be prefetched raw
authorTom Caputi <tcaputi@datto.com>
Sat, 31 Mar 2018 18:11:48 +0000 (14:11 -0400)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Sat, 31 Mar 2018 18:11:48 +0000 (11:11 -0700)
Encrypted dnode blocks are always initially read as raw data and
converted to decrypted data when an encrypted bonus buffer is
needed. This allows the DMU to be used for things like fetching
the DMU master node without requiring keys to be loaded. However,
dbuf_issue_final_prefetch() does not currently read the data as
raw. The end result of this is that prefetched dnode blocks are
read twice from disk: once decrypted and then again as raw data.
This patch corrects the issue by adding the flag when appropriate.

Reviewed by: Matt Ahrens <matt@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Tom Caputi <tcaputi@datto.com>
Closes #7362

module/zfs/dbuf.c

index 7e3f0a71329c9e7297aad48dd09f22c436ce0d20..0ecdbd5833b85e1c343c898a41b03e1b9880665f 100644 (file)
@@ -2660,15 +2660,20 @@ dbuf_issue_final_prefetch(dbuf_prefetch_arg_t *dpa, blkptr_t *bp)
        if (BP_IS_HOLE(bp) || BP_IS_EMBEDDED(bp))
                return;
 
+       int zio_flags = ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE;
        arc_flags_t aflags =
            dpa->dpa_aflags | ARC_FLAG_NOWAIT | ARC_FLAG_PREFETCH;
 
+       /* dnodes are always read as raw and then converted later */
+       if (BP_GET_TYPE(bp) == DMU_OT_DNODE && BP_IS_PROTECTED(bp) &&
+           dpa->dpa_curlevel == 0)
+               zio_flags |= ZIO_FLAG_RAW;
+
        ASSERT3U(dpa->dpa_curlevel, ==, BP_GET_LEVEL(bp));
        ASSERT3U(dpa->dpa_curlevel, ==, dpa->dpa_zb.zb_level);
        ASSERT(dpa->dpa_zio != NULL);
        (void) arc_read(dpa->dpa_zio, dpa->dpa_spa, bp, NULL, NULL,
-           dpa->dpa_prio, ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE,
-           &aflags, &dpa->dpa_zb);
+           dpa->dpa_prio, zio_flags, &aflags, &dpa->dpa_zb);
 }
 
 /*