From d53bd7f5244a1cd0009d2f90d3ec9df22352fbb3 Mon Sep 17 00:00:00 2001 From: Tom Caputi Date: Mon, 4 Dec 2017 14:10:31 -0500 Subject: [PATCH] Fix recovery import (-F) with encrypted pool When performing zil_claim() at pool import time, it is important that encrypted datasets set os_next_write_raw before writing to the zil_header_t. This prevents the code from attempting to re-authenticate the objset_phys_t when it writes it out, which is unnecessary because the zil_header_t is not protected by either objset MAC and impossible since the keys aren't loaded yet. Unfortunately, one of the code paths did not set this flag, which causes failed ASSERTs during 'zpool import -F'. This patch corrects this issue. Reviewed-by: Jorgen Lundman Reviewed-by: Brian Behlendorf Reviewed by: Matthew Ahrens Signed-off-by: Tom Caputi Closes #6864 Closes #6916 --- module/zfs/zil.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/module/zfs/zil.c b/module/zfs/zil.c index 73744ffcf81c..234ce956aeda 100644 --- a/module/zfs/zil.c +++ b/module/zfs/zil.c @@ -819,6 +819,8 @@ zil_claim(dsl_pool_t *dp, dsl_dataset_t *ds, void *txarg) if (zilog->zl_parse_lr_count || zilog->zl_parse_blk_count > 1) zh->zh_flags |= ZIL_REPLAY_NEEDED; zh->zh_flags |= ZIL_CLAIM_LR_SEQ_VALID; + if (os->os_encrypted) + os->os_next_write_raw = B_TRUE; dsl_dataset_dirty(dmu_objset_ds(os), tx); }