summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/libzfs/libzfs_dataset.c10
-rw-r--r--module/zfs/dsl_crypt.c8
2 files changed, 16 insertions, 2 deletions
diff --git a/lib/libzfs/libzfs_dataset.c b/lib/libzfs/libzfs_dataset.c
index 339132a97..1128275c0 100644
--- a/lib/libzfs/libzfs_dataset.c
+++ b/lib/libzfs/libzfs_dataset.c
@@ -4160,6 +4160,16 @@ zfs_promote(zfs_handle_t *zhp)
if (ret != 0) {
switch (ret) {
+ case EACCES:
+ /*
+ * Promoting encrypted dataset outside its
+ * encryption root.
+ */
+ zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
+ "cannot promote dataset outside its "
+ "encryption root"));
+ return (zfs_error(hdl, EZFS_EXISTS, errbuf));
+
case EEXIST:
/* There is a conflicting snapshot name. */
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
diff --git a/module/zfs/dsl_crypt.c b/module/zfs/dsl_crypt.c
index 0c0ffaadd..568fe7aa3 100644
--- a/module/zfs/dsl_crypt.c
+++ b/module/zfs/dsl_crypt.c
@@ -1676,11 +1676,15 @@ dsl_dataset_promote_crypt_check(dsl_dir_t *target, dsl_dir_t *origin)
* Check that the parent of the target has the same encryption root.
*/
ret = dsl_dir_get_encryption_root_ddobj(origin->dd_parent, &op_rddobj);
- if (ret != 0)
+ if (ret == ENOENT)
+ return (SET_ERROR(EACCES));
+ else if (ret != 0)
return (ret);
ret = dsl_dir_get_encryption_root_ddobj(target->dd_parent, &tp_rddobj);
- if (ret != 0)
+ if (ret == ENOENT)
+ return (SET_ERROR(EACCES));
+ else if (ret != 0)
return (ret);
if (op_rddobj != tp_rddobj)