aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Matuska <mm@FreeBSD.org>2023-10-31 20:49:41 +0000
committerMartin Matuska <mm@FreeBSD.org>2023-11-02 06:50:52 +0000
commit96831a3ef1dea365fb4104d29daad565ee5f71e5 (patch)
tree4b5404f58c85a5390a0503a3142f5667c4e089b7
parentd9e6e99a8525fdd5a3c53b3e8281a4dc3b0e378b (diff)
downloadsrc-96831a3ef1dea365fb4104d29daad565ee5f71e5.tar.gz
src-96831a3ef1dea365fb4104d29daad565ee5f71e5.zip
zfs: cherry-pick change from master
#15465 763ca47f Fix block cloning between unencrypted and encrypted datasets Fixes a kernel panic when block cloning is enabled and system is trying to read data from a file copied using copy_file_range(2), e.g. with cp(1) from an unencrypted dataset into an encrypted dataset on the same ZFS pool. As the file has not been encrypted, to fix the filesystem inconsistency and to avoid future panics it must be deleted (metadata is readable). Approved by: re (gjb) Obtained from: OpenZFS OpenZFS commit: 763ca47fa81808be62ab5e02357e896233f24abc (cherry picked from commit c5eb93ef57f4905f7aea9566ab45be1a75ada150)
-rw-r--r--sys/contrib/openzfs/module/zfs/zfs_vnops.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/sys/contrib/openzfs/module/zfs/zfs_vnops.c b/sys/contrib/openzfs/module/zfs/zfs_vnops.c
index 40d6c87a754e..84e6b10ef37c 100644
--- a/sys/contrib/openzfs/module/zfs/zfs_vnops.c
+++ b/sys/contrib/openzfs/module/zfs/zfs_vnops.c
@@ -1094,6 +1094,15 @@ zfs_clone_range(znode_t *inzp, uint64_t *inoffp, znode_t *outzp,
ASSERT(!outzfsvfs->z_replay);
+ /*
+ * Block cloning from an unencrypted dataset into an encrypted
+ * dataset and vice versa is not supported.
+ */
+ if (inos->os_encrypted != outos->os_encrypted) {
+ zfs_exit_two(inzfsvfs, outzfsvfs, FTAG);
+ return (SET_ERROR(EXDEV));
+ }
+
error = zfs_verify_zp(inzp);
if (error == 0)
error = zfs_verify_zp(outzp);