diff options
author | LOLi <[email protected]> | 2017-03-29 02:21:11 +0200 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2017-03-28 17:21:11 -0700 |
commit | ff61d1a4959065aa99d52489438f6737765987c6 (patch) | |
tree | fd69cf41719b077ee6408b19cba70ae15c6491db /cmd/zpool/zpool_vdev.c | |
parent | 12aec7dcd9b1f4c86eb71d5b9dc737433ee93167 (diff) |
Check ashift validity in 'zpool add'
df83110 added the ability to specify a custom "ashift" value from the command
line in 'zpool add' and 'zpool attach'. This commit adds additional checks to
the provided ashift to prevent invalid values from being used, which could
result in disastrous consequences for the whole pool.
Additionally provide ASHIFT_MAX and ASHIFT_MIN definitions in spa.h.
Reviewed-by: Giuseppe Di Natale <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: loli10K <[email protected]>
Closes #5878
Diffstat (limited to 'cmd/zpool/zpool_vdev.c')
-rw-r--r-- | cmd/zpool/zpool_vdev.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/cmd/zpool/zpool_vdev.c b/cmd/zpool/zpool_vdev.c index c0d3076d2..ed607ec85 100644 --- a/cmd/zpool/zpool_vdev.c +++ b/cmd/zpool/zpool_vdev.c @@ -70,6 +70,7 @@ #include <libintl.h> #include <libnvpair.h> #include <limits.h> +#include <sys/spa.h> #include <scsi/scsi.h> #include <scsi/sg.h> #include <stdio.h> @@ -721,8 +722,18 @@ make_leaf_vdev(nvlist_t *props, const char *arg, uint64_t is_log) char *value = NULL; if (nvlist_lookup_string(props, - zpool_prop_to_name(ZPOOL_PROP_ASHIFT), &value) == 0) + zpool_prop_to_name(ZPOOL_PROP_ASHIFT), &value) == 0) { zfs_nicestrtonum(NULL, value, &ashift); + if (ashift != 0 && + (ashift < ASHIFT_MIN || ashift > ASHIFT_MAX)) { + (void) fprintf(stderr, + gettext("invalid 'ashift=%" PRIu64 "' " + "property: only values between %" PRId32 " " + "and %" PRId32 " are allowed.\n"), + ashift, ASHIFT_MIN, ASHIFT_MAX); + return (NULL); + } + } } /* |