Refine special_small_blocks property validation
When the special_small_blocks property is being set during a pool create it enforces a limit of 128KiB even if the pool's record size is larger. If the recordsize property is being set during a pool create, then use that value instead of the default SPA_OLD_MAXBLOCKSIZE value. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Don Brady <dev.fs.zfs@gmail.com> Closes #13815 Closes #14811
This commit is contained in:
parent
c094b9a928
commit
30dcddaec7
|
@ -1017,6 +1017,7 @@ zfs_valid_proplist(libzfs_handle_t *hdl, zfs_type_t type, nvlist_t *nvl,
|
||||||
nvlist_t *ret;
|
nvlist_t *ret;
|
||||||
int chosen_normal = -1;
|
int chosen_normal = -1;
|
||||||
int chosen_utf = -1;
|
int chosen_utf = -1;
|
||||||
|
int set_maxbs = 0;
|
||||||
|
|
||||||
if (nvlist_alloc(&ret, NV_UNIQUE_NAME, 0) != 0) {
|
if (nvlist_alloc(&ret, NV_UNIQUE_NAME, 0) != 0) {
|
||||||
(void) no_memory(hdl);
|
(void) no_memory(hdl);
|
||||||
|
@ -1234,12 +1235,17 @@ zfs_valid_proplist(libzfs_handle_t *hdl, zfs_type_t type, nvlist_t *nvl,
|
||||||
(void) zfs_error(hdl, EZFS_BADPROP, errbuf);
|
(void) zfs_error(hdl, EZFS_BADPROP, errbuf);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
/* save the ZFS_PROP_RECORDSIZE during create op */
|
||||||
|
if (zpool_hdl == NULL && prop == ZFS_PROP_RECORDSIZE) {
|
||||||
|
set_maxbs = intval;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case ZFS_PROP_SPECIAL_SMALL_BLOCKS:
|
case ZFS_PROP_SPECIAL_SMALL_BLOCKS:
|
||||||
{
|
{
|
||||||
int maxbs = SPA_OLD_MAXBLOCKSIZE;
|
int maxbs =
|
||||||
|
set_maxbs == 0 ? SPA_OLD_MAXBLOCKSIZE : set_maxbs;
|
||||||
char buf[64];
|
char buf[64];
|
||||||
|
|
||||||
if (zpool_hdl != NULL) {
|
if (zpool_hdl != NULL) {
|
||||||
|
|
|
@ -37,7 +37,7 @@ tests = ['alloc_class_001_pos', 'alloc_class_002_neg', 'alloc_class_003_pos',
|
||||||
'alloc_class_004_pos', 'alloc_class_005_pos', 'alloc_class_006_pos',
|
'alloc_class_004_pos', 'alloc_class_005_pos', 'alloc_class_006_pos',
|
||||||
'alloc_class_007_pos', 'alloc_class_008_pos', 'alloc_class_009_pos',
|
'alloc_class_007_pos', 'alloc_class_008_pos', 'alloc_class_009_pos',
|
||||||
'alloc_class_010_pos', 'alloc_class_011_neg', 'alloc_class_012_pos',
|
'alloc_class_010_pos', 'alloc_class_011_neg', 'alloc_class_012_pos',
|
||||||
'alloc_class_013_pos']
|
'alloc_class_013_pos', 'alloc_class_014_neg', 'alloc_class_015_pos']
|
||||||
tags = ['functional', 'alloc_class']
|
tags = ['functional', 'alloc_class']
|
||||||
|
|
||||||
[tests/functional/arc]
|
[tests/functional/arc]
|
||||||
|
|
|
@ -14,7 +14,9 @@ dist_pkgdata_SCRIPTS = \
|
||||||
alloc_class_010_pos.ksh \
|
alloc_class_010_pos.ksh \
|
||||||
alloc_class_011_neg.ksh \
|
alloc_class_011_neg.ksh \
|
||||||
alloc_class_012_pos.ksh \
|
alloc_class_012_pos.ksh \
|
||||||
alloc_class_013_pos.ksh
|
alloc_class_013_pos.ksh \
|
||||||
|
alloc_class_014_neg.ksh \
|
||||||
|
alloc_class_015_pos.ksh
|
||||||
|
|
||||||
dist_pkgdata_DATA = \
|
dist_pkgdata_DATA = \
|
||||||
alloc_class.cfg \
|
alloc_class.cfg \
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
#!/bin/ksh -p
|
||||||
|
|
||||||
|
#
|
||||||
|
# This file and its contents are supplied under the terms of the
|
||||||
|
# Common Development and Distribution License ("CDDL"), version 1.0.
|
||||||
|
# You may only use this file in accordance with the terms of version
|
||||||
|
# 1.0 of the CDDL.
|
||||||
|
#
|
||||||
|
# A full copy of the text of the CDDL should have accompanied this
|
||||||
|
# source. A copy of the CDDL is also available via the Internet at
|
||||||
|
# http://www.illumos.org/license/CDDL.
|
||||||
|
#
|
||||||
|
|
||||||
|
. $STF_SUITE/tests/functional/alloc_class/alloc_class.kshlib
|
||||||
|
|
||||||
|
#
|
||||||
|
# DESCRIPTION:
|
||||||
|
# Setting the special_small_blocks property greater than recordsize fails.
|
||||||
|
#
|
||||||
|
|
||||||
|
verify_runnable "global"
|
||||||
|
|
||||||
|
claim="Setting the special_small_blocks property greater than recordsize fails"
|
||||||
|
|
||||||
|
log_assert $claim
|
||||||
|
log_onexit cleanup
|
||||||
|
log_must disk_setup
|
||||||
|
|
||||||
|
for size in 512 4096 32768 131072 524288 1048576
|
||||||
|
do
|
||||||
|
let bigger=$size*2
|
||||||
|
log_mustnot zpool create -O recordsize=$size \
|
||||||
|
-O special_small_blocks=$bigger \
|
||||||
|
$TESTPOOL raidz $ZPOOL_DISKS special mirror \
|
||||||
|
$CLASS_DISK0 $CLASS_DISK1
|
||||||
|
done
|
||||||
|
|
||||||
|
log_pass $claim
|
|
@ -0,0 +1,45 @@
|
||||||
|
#!/bin/ksh -p
|
||||||
|
|
||||||
|
#
|
||||||
|
# This file and its contents are supplied under the terms of the
|
||||||
|
# Common Development and Distribution License ("CDDL"), version 1.0.
|
||||||
|
# You may only use this file in accordance with the terms of version
|
||||||
|
# 1.0 of the CDDL.
|
||||||
|
#
|
||||||
|
# A full copy of the text of the CDDL should have accompanied this
|
||||||
|
# source. A copy of the CDDL is also available via the Internet at
|
||||||
|
# http://www.illumos.org/license/CDDL.
|
||||||
|
#
|
||||||
|
|
||||||
|
. $STF_SUITE/tests/functional/alloc_class/alloc_class.kshlib
|
||||||
|
|
||||||
|
#
|
||||||
|
# DESCRIPTION:
|
||||||
|
# Can set special_small_blocks property less than or equal to recordsize.
|
||||||
|
#
|
||||||
|
|
||||||
|
verify_runnable "global"
|
||||||
|
|
||||||
|
claim="Can set special_small_blocks property less than or equal to recordsize"
|
||||||
|
|
||||||
|
log_assert $claim
|
||||||
|
log_onexit cleanup
|
||||||
|
log_must disk_setup
|
||||||
|
|
||||||
|
for size in 8192 32768 131072 524288 1048576
|
||||||
|
do
|
||||||
|
let smaller=$size/2
|
||||||
|
log_must zpool create -O recordsize=$size \
|
||||||
|
-O special_small_blocks=$smaller \
|
||||||
|
$TESTPOOL raidz $ZPOOL_DISKS special mirror \
|
||||||
|
$CLASS_DISK0 $CLASS_DISK1
|
||||||
|
log_must zpool destroy -f "$TESTPOOL"
|
||||||
|
|
||||||
|
log_must zpool create -O recordsize=$size \
|
||||||
|
-O special_small_blocks=$size \
|
||||||
|
$TESTPOOL raidz $ZPOOL_DISKS special mirror \
|
||||||
|
$CLASS_DISK0 $CLASS_DISK1
|
||||||
|
log_must zpool destroy -f "$TESTPOOL"
|
||||||
|
done
|
||||||
|
|
||||||
|
log_pass $claim
|
Loading…
Reference in New Issue