summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/libzfs/libzfs_pool.c21
-rw-r--r--module/zfs/zil.c6
2 files changed, 23 insertions, 4 deletions
diff --git a/lib/libzfs/libzfs_pool.c b/lib/libzfs/libzfs_pool.c
index 16b30d177..ef98b25bc 100644
--- a/lib/libzfs/libzfs_pool.c
+++ b/lib/libzfs/libzfs_pool.c
@@ -24,7 +24,7 @@
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2011, 2018 by Delphix. All rights reserved.
* Copyright 2016 Igor Kozhukhov <[email protected]>
- * Copyright (c) 2017 Datto Inc.
+ * Copyright (c) 2018 Datto Inc.
* Copyright (c) 2017 Open-E, Inc. All Rights Reserved.
*/
@@ -3293,11 +3293,26 @@ zpool_vdev_remove(zpool_handle_t *zhp, const char *path)
break;
case EBUSY:
- zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
- "Pool busy; removal may already be in progress"));
+ if (islog) {
+ zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
+ "Mount encrypted datasets to replay logs."));
+ } else {
+ zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
+ "Pool busy; removal may already be in progress"));
+ }
(void) zfs_error(hdl, EZFS_BUSY, msg);
break;
+ case EACCES:
+ if (islog) {
+ zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
+ "Mount encrypted datasets to replay logs."));
+ (void) zfs_error(hdl, EZFS_BUSY, msg);
+ } else {
+ (void) zpool_standard_error(hdl, errno, msg);
+ }
+ break;
+
default:
(void) zpool_standard_error(hdl, errno, msg);
}
diff --git a/module/zfs/zil.c b/module/zfs/zil.c
index da3ee4500..e8adc6d99 100644
--- a/module/zfs/zil.c
+++ b/module/zfs/zil.c
@@ -22,6 +22,7 @@
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2011, 2017 by Delphix. All rights reserved.
* Copyright (c) 2014 Integros [integros.com]
+ * Copyright (c) 2018 Datto Inc.
*/
/* Portions Copyright 2010 Robert Milkowski */
@@ -3159,7 +3160,7 @@ zil_suspend(const char *osname, void **cookiep)
mutex_exit(&zilog->zl_lock);
dsl_dataset_long_rele(dmu_objset_ds(os), suspend_tag);
dsl_dataset_rele(dmu_objset_ds(os), suspend_tag);
- return (SET_ERROR(EBUSY));
+ return (SET_ERROR(EACCES));
}
zilog->zl_suspending = B_TRUE;
@@ -3400,6 +3401,9 @@ zil_reset(const char *osname, void *arg)
int error;
error = zil_suspend(osname, NULL);
+ /* EACCES means crypto key not loaded */
+ if ((error == EACCES) || (error == EBUSY))
+ return (SET_ERROR(error));
if (error != 0)
return (SET_ERROR(EEXIST));
return (0);