Fix error message on promoting encrypted dataset

This patch corrects the error message reported when attempting
to promote a dataset outside of its encryption root.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Tom Caputi <tcaputi@datto.com>
Closes #8905
Closes #8935
This commit is contained in:
Tom Caputi 2019-06-24 19:42:52 -04:00 committed by Tony Hutter
parent cc7fe8a599
commit bfe5f029cf
2 changed files with 16 additions and 2 deletions

View File

@ -4117,6 +4117,16 @@ zfs_promote(zfs_handle_t *zhp)
if (ret != 0) { if (ret != 0) {
switch (ret) { 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: case EEXIST:
/* There is a conflicting snapshot name. */ /* There is a conflicting snapshot name. */
zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,

View File

@ -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. * Check that the parent of the target has the same encryption root.
*/ */
ret = dsl_dir_get_encryption_root_ddobj(origin->dd_parent, &op_rddobj); 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); return (ret);
ret = dsl_dir_get_encryption_root_ddobj(target->dd_parent, &tp_rddobj); 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); return (ret);
if (op_rddobj != tp_rddobj) if (op_rddobj != tp_rddobj)