Skip to content

Commit 81f1bb0

Browse files
Luke Beirnecalccrypto
authored andcommitted
Z.I.A. Error Message
Added error message support for assigning an invalid provider to zia_provider. Signed-off-by: Luke Beirne <[email protected]>
1 parent 1f10b17 commit 81f1bb0

File tree

5 files changed

+43
-26
lines changed

5 files changed

+43
-26
lines changed

contrib/pyzfs/libzfs_core/_constants.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ def enum(*sequential, **named):
105105
'ZFS_ERR_RESUME_EXISTS',
106106
'ZFS_ERR_CRYPTO_NOTSUP',
107107
'ZFS_ERR_RAIDZ_EXPAND_IN_PROGRESS',
108+
'ZFS_ERR_ZIA_NONEXISTENT_PROVIDER',
108109
],
109110
{}
110111
)

include/libzfs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ typedef enum zfs_error {
160160
EZFS_SHAREFAILED, /* filesystem share failed */
161161
EZFS_RAIDZ_EXPAND_IN_PROGRESS, /* a raidz is currently expanding */
162162
EZFS_ASHIFT_MISMATCH, /* can't add vdevs with different ashifts */
163+
EZFS_ZIA_NONEXISTENT_PROVIDER, /* given provider does not exist */
163164
EZFS_UNKNOWN
164165
} zfs_error_t;
165166

include/sys/fs/zfs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1683,6 +1683,7 @@ typedef enum {
16831683
ZFS_ERR_RAIDZ_EXPAND_IN_PROGRESS,
16841684
ZFS_ERR_ASHIFT_MISMATCH,
16851685
ZFS_ERR_STREAM_LARGE_MICROZAP,
1686+
ZFS_ERR_ZIA_NONEXISTENT_PROVIDER,
16861687
} zfs_errno_t;
16871688

16881689
/*

lib/libzfs/libzfs_util.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,8 @@ libzfs_error_description(libzfs_handle_t *hdl)
324324
case EZFS_ASHIFT_MISMATCH:
325325
return (dgettext(TEXT_DOMAIN, "adding devices with "
326326
"different physical sector sizes is not allowed"));
327+
case EZFS_ZIA_NONEXISTENT_PROVIDER:
328+
return (dgettext(TEXT_DOMAIN, "given provider does not exist"));
327329
case EZFS_UNKNOWN:
328330
return (dgettext(TEXT_DOMAIN, "unknown error"));
329331
default:
@@ -776,6 +778,9 @@ zpool_standard_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...)
776778
case ZFS_ERR_ASHIFT_MISMATCH:
777779
zfs_verror(hdl, EZFS_ASHIFT_MISMATCH, fmt, ap);
778780
break;
781+
case ZFS_ERR_ZIA_NONEXISTENT_PROVIDER:
782+
zfs_verror(hdl, EZFS_ZIA_NONEXISTENT_PROVIDER, fmt, ap);
783+
break;
779784
default:
780785
zfs_error_aux(hdl, "%s", zfs_strerror(error));
781786
zfs_verror(hdl, EZFS_UNKNOWN, fmt, ap);

module/zfs/spa.c

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -695,6 +695,7 @@ spa_prop_validate(spa_t *spa, nvlist_t *props)
695695
int error = 0, reset_bootfs = 0;
696696
uint64_t objnum = 0;
697697
boolean_t has_feature = B_FALSE;
698+
zia_props_t *zia_props = zia_get_props(spa);
698699

699700
elem = NULL;
700701
while ((elem = nvlist_next_nvpair(props, elem)) != NULL) {
@@ -890,6 +891,40 @@ spa_prop_validate(spa_t *spa, nvlist_t *props)
890891
break;
891892

892893
case ZPOOL_PROP_ZIA_PROVIDER:
894+
strval = fnvpair_value_string(elem);
895+
if (strncmp(strval, "NULL", 5) == 0 ||
896+
strncmp(strval, "off", 4) == 0) {
897+
zia_put_provider(&zia_props->provider,
898+
spa->spa_root_vdev);
899+
break;
900+
}
901+
902+
void *new_provider = zia_get_provider(strval);
903+
if (new_provider == NULL) {
904+
error = SET_ERROR(ZFS_ERR_ZIA_NONEXISTENT_PROVIDER);
905+
break;
906+
}
907+
908+
if (zia_props->provider != NULL)
909+
zia_put_provider(&zia_props->provider,
910+
spa->spa_root_vdev);
911+
912+
zia_props->provider = new_provider;
913+
zia_props->can_offload = !!zia_props->provider;
914+
915+
/*
916+
* It is possible to enable disk_write or file_write
917+
* without passing a provider, or swapping one
918+
* provider with another while these flags are enabled.
919+
* In those cases, vdevs must be opened for the new
920+
* provider upon being passed.
921+
* The vdevs will be closed for the older provider
922+
* in zia_put_provider() first.
923+
*/
924+
ASSERT3P(spa->spa_root_vdev, !=, NULL);
925+
if (zia_props->disk_write || zia_props->file_write)
926+
zia_open_vdevs(spa->spa_root_vdev);
927+
break;
893928
case ZPOOL_PROP_ZIA_COMPRESS:
894929
case ZPOOL_PROP_ZIA_DECOMPRESS:
895930
case ZPOOL_PROP_ZIA_CHECKSUM:
@@ -9812,32 +9847,6 @@ spa_sync_props(void *arg, dmu_tx_t *tx)
98129847
break;
98139848
case ZPOOL_PROP_ZIA_PROVIDER:
98149849
strval = fnvpair_value_string(elem);
9815-
if (strncmp(strval, "NULL", 5) == 0 ||
9816-
strncmp(strval, "off", 4) == 0) {
9817-
zia_put_provider(&zia_props->provider,
9818-
spa->spa_root_vdev);
9819-
break;
9820-
}
9821-
9822-
if (zia_props->provider != NULL)
9823-
zia_put_provider(&zia_props->provider,
9824-
spa->spa_root_vdev);
9825-
zia_props->provider = zia_get_provider(strval);
9826-
zia_props->can_offload = !!zia_props->provider;
9827-
9828-
/*
9829-
* It is possible to enable disk_write or file_write
9830-
* without passing a provider, or swapping one
9831-
* provider with another while these flags are enabled.
9832-
* In those cases, vdevs must be opened for the new
9833-
* provider upon being passed.
9834-
* The vdevs will be closed for the older provider
9835-
* in zia_put_provider() first.
9836-
*/
9837-
ASSERT3P(spa->spa_root_vdev, !=, NULL);
9838-
if (zia_props->disk_write || zia_props->file_write)
9839-
zia_open_vdevs(spa->spa_root_vdev);
9840-
98419850
spa_history_log_internal(spa, "set", tx,
98429851
"%s=%s", nvpair_name(elem), strval);
98439852
break;

0 commit comments

Comments
 (0)