aboutsummaryrefslogtreecommitdiffstats
path: root/module/zfs/dmu.c
diff options
context:
space:
mode:
authorTom Caputi <[email protected]>2018-06-06 13:16:41 -0400
committerBrian Behlendorf <[email protected]>2018-06-06 10:16:41 -0700
commite7504d7a188b666a61a8c2d8c1ffaa9713f6cdfa (patch)
treeac99e6fad89bef6a6768a233c1fb99b827c01552 /module/zfs/dmu.c
parent6969afcefdfb49fb9c0fcf56240e6eb133a2c4a8 (diff)
Raw receive functions must not decrypt data
This patch fixes a small bug found where receive_spill() sometimes attempted to decrypt spill blocks when doing a raw receive. In addition, this patch fixes another small issue in arc_buf_fill()'s error handling where a decryption failure (which could be caused by the first bug) would attempt to set the arc header's IO_ERROR flag without holding the header's lock. Reviewed-by: Matthew Thode <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Reviewed by: Matthew Ahrens <[email protected]> Signed-off-by: Tom Caputi <[email protected]> Closes #7564 Closes #7584 Closes #7592
Diffstat (limited to 'module/zfs/dmu.c')
-rw-r--r--module/zfs/dmu.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/module/zfs/dmu.c b/module/zfs/dmu.c
index 32a8fd319..1cb967641 100644
--- a/module/zfs/dmu.c
+++ b/module/zfs/dmu.c
@@ -459,15 +459,20 @@ dmu_spill_hold_existing(dmu_buf_t *bonus, void *tag, dmu_buf_t **dbp)
}
int
-dmu_spill_hold_by_bonus(dmu_buf_t *bonus, void *tag, dmu_buf_t **dbp)
+dmu_spill_hold_by_bonus(dmu_buf_t *bonus, uint32_t flags, void *tag,
+ dmu_buf_t **dbp)
{
dmu_buf_impl_t *db = (dmu_buf_impl_t *)bonus;
dnode_t *dn;
int err;
+ uint32_t db_flags = DB_RF_CANFAIL;
+
+ if (flags & DMU_READ_NO_DECRYPT)
+ db_flags |= DB_RF_NO_DECRYPT;
DB_DNODE_ENTER(db);
dn = DB_DNODE(db);
- err = dmu_spill_hold_by_dnode(dn, DB_RF_CANFAIL, tag, dbp);
+ err = dmu_spill_hold_by_dnode(dn, db_flags, tag, dbp);
DB_DNODE_EXIT(db);
return (err);