aboutsummaryrefslogtreecommitdiffstats
path: root/module/os/linux/zfs
diff options
context:
space:
mode:
authorAlexander Motin <[email protected]>2023-11-18 20:01:03 -0500
committerBrian Behlendorf <[email protected]>2023-11-28 11:17:52 -0800
commit56a2a0981ed770ed316769d078c892b1e8fa67a9 (patch)
tree8c5f790ffe7d4de02800e5bc59595eccaf583dc2 /module/os/linux/zfs
parent9b9b09f452a469458451c221debfbab944e7f081 (diff)
ZIL: Do not encrypt block pointers in lr_clone_range_t
In case of crash cloned blocks need to be claimed on pool import. It is only possible if they (lr_bps) and their count (lr_nbps) are not encrypted but only authenticated, similar to block pointer in lr_write_t. Few other fields can be and are still encrypted. This should fix panic on ZIL claim after crash when block cloning is actively used. Reviewed-by: Richard Yao <[email protected]> Reviewed-by: Tom Caputi <[email protected]> Reviewed-by: Sean Eric Fagan <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Reviewed-by: Edmund Nadolski <[email protected]> Signed-off-by: Alexander Motin <[email protected]> Sponsored by: iXsystems, Inc. Closes #15543 Closes #15513
Diffstat (limited to 'module/os/linux/zfs')
-rw-r--r--module/os/linux/zfs/zio_crypt.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/module/os/linux/zfs/zio_crypt.c b/module/os/linux/zfs/zio_crypt.c
index 55554d09e..775ab8efb 100644
--- a/module/os/linux/zfs/zio_crypt.c
+++ b/module/os/linux/zfs/zio_crypt.c
@@ -1543,6 +1543,21 @@ zio_crypt_init_uios_zil(boolean_t encrypt, uint8_t *plainbuf,
nr_iovecs++;
total_len += crypt_len;
}
+ } else if (txtype == TX_CLONE_RANGE) {
+ const size_t o = offsetof(lr_clone_range_t, lr_nbps);
+ crypt_len = o - sizeof (lr_t);
+ src_iovecs[nr_iovecs].iov_base = slrp + sizeof (lr_t);
+ src_iovecs[nr_iovecs].iov_len = crypt_len;
+ dst_iovecs[nr_iovecs].iov_base = dlrp + sizeof (lr_t);
+ dst_iovecs[nr_iovecs].iov_len = crypt_len;
+
+ /* copy the bps now since they will not be encrypted */
+ memcpy(dlrp + o, slrp + o, lr_len - o);
+ memcpy(aadp, slrp + o, lr_len - o);
+ aadp += lr_len - o;
+ aad_len += lr_len - o;
+ nr_iovecs++;
+ total_len += crypt_len;
} else {
crypt_len = lr_len - sizeof (lr_t);
src_iovecs[nr_iovecs].iov_base = slrp + sizeof (lr_t);