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 /include/sys | |
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 'include/sys')
-rw-r--r-- | include/sys/fs/zfs.h | 3 | ||||
-rw-r--r-- | include/sys/spa.h | 11 |
2 files changed, 13 insertions, 1 deletions
diff --git a/include/sys/fs/zfs.h b/include/sys/fs/zfs.h index 962698c2f..ba6487612 100644 --- a/include/sys/fs/zfs.h +++ b/include/sys/fs/zfs.h @@ -732,7 +732,8 @@ typedef enum vdev_aux { VDEV_AUX_IO_FAILURE, /* experienced I/O failure */ VDEV_AUX_BAD_LOG, /* cannot read log chain(s) */ VDEV_AUX_EXTERNAL, /* external diagnosis */ - VDEV_AUX_SPLIT_POOL /* vdev was split off into another pool */ + VDEV_AUX_SPLIT_POOL, /* vdev was split off into another pool */ + VDEV_AUX_BAD_ASHIFT /* vdev ashift is invalid */ } vdev_aux_t; /* diff --git a/include/sys/spa.h b/include/sys/spa.h index 0f05d04ad..b6e124faa 100644 --- a/include/sys/spa.h +++ b/include/sys/spa.h @@ -122,6 +122,17 @@ _NOTE(CONSTCOND) } while (0) #define SPA_MAXBLOCKSIZE (1ULL << SPA_MAXBLOCKSHIFT) /* + * Alignment Shift (ashift) is an immutable, internal top-level vdev property + * which can only be set at vdev creation time. Physical writes are always done + * according to it, which makes 2^ashift the smallest possible IO on a vdev. + * + * We currently allow values ranging from 512 bytes (2^9 = 512) to 8 KiB + * (2^13 = 8,192). + */ +#define ASHIFT_MIN 9 +#define ASHIFT_MAX 13 + +/* * Size of block to hold the configuration data (a packed nvlist) */ #define SPA_CONFIG_BLOCKSIZE (1ULL << 14) |