mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 10:37:35 +03:00
vdev_ashift should only be set once
== Motivation and Context The new vdev ashift optimization prevents the removal of devices when a zfs configuration is comprised of disks which have different logical and physical block sizes. This is caused because we set 'spa_min_ashift' in vdev_open and then later call 'vdev_ashift_optimize'. This would result in an inconsistency between spa's ashift calculations and that of the top-level vdev. In addition, the optimization logical ignores the overridden ashift value that would be provided by '-o ashift=<val>'. == Description This change reworks the vdev ashift optimization so that it's only set the first time the device is configured. It still allows the physical and logical ahsift values to be set every time the device is opened but those values are only consulted on first open. Reviewed-by: Matthew Ahrens <mahrens@delphix.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Cedric Berger <cedric@precidata.com> Signed-off-by: George Wilson <gwilson@delphix.com> External-Issue: DLPX-71831 Closes #10932
This commit is contained in:
committed by
Brian Behlendorf
parent
56e69c1e9c
commit
5899ea5a77
@@ -76,6 +76,7 @@ TRIM_TXG_BATCH trim.txg_batch zfs_trim_txg_batch
|
||||
TXG_HISTORY txg.history zfs_txg_history
|
||||
TXG_TIMEOUT txg.timeout zfs_txg_timeout
|
||||
UNLINK_SUSPEND_PROGRESS UNSUPPORTED zfs_unlink_suspend_progress
|
||||
VDEV_FILE_PHYSICAL_ASHIFT vdev.file.physical_ashift vdev_file_physical_ashift
|
||||
VDEV_MIN_MS_COUNT vdev.min_ms_count zfs_vdev_min_ms_count
|
||||
VDEV_VALIDATE_SKIP vdev.validate_skip vdev_validate_skip
|
||||
VOL_INHIBIT_DEV UNSUPPORTED zvol_inhibit_dev
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
#
|
||||
# Copyright 2017, loli10K. All rights reserved.
|
||||
# Copyright (c) 2020 by Delphix. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/include/libtest.shlib
|
||||
@@ -35,13 +36,15 @@
|
||||
# STRATEGY:
|
||||
# 1. Create a pool with default values.
|
||||
# 2. Verify 'zpool add -o ashift=<n>' works with allowed values (9-16).
|
||||
# 3. Verify 'zpool add -o ashift=<n>' doesn't accept other invalid values.
|
||||
# 3. Verify setting kernel tunable for file vdevs works correctly.
|
||||
# 4. Verify 'zpool add -o ashift=<n>' doesn't accept other invalid values.
|
||||
#
|
||||
|
||||
verify_runnable "global"
|
||||
|
||||
function cleanup
|
||||
{
|
||||
log_must set_tunable64 VDEV_FILE_PHYSICAL_ASHIFT $orig_ashift
|
||||
poolexists $TESTPOOL && destroy_pool $TESTPOOL
|
||||
rm -f $disk1 $disk2
|
||||
}
|
||||
@@ -54,6 +57,8 @@ disk2=$TEST_BASE_DIR/disk2
|
||||
log_must mkfile $SIZE $disk1
|
||||
log_must mkfile $SIZE $disk2
|
||||
|
||||
orig_ashift=$(get_tunable VDEV_FILE_PHYSICAL_ASHIFT)
|
||||
|
||||
typeset ashifts=("9" "10" "11" "12" "13" "14" "15" "16")
|
||||
for ashift in ${ashifts[@]}
|
||||
do
|
||||
@@ -69,6 +74,24 @@ do
|
||||
log_must zpool destroy $TESTPOOL
|
||||
log_must zpool labelclear $disk1
|
||||
log_must zpool labelclear $disk2
|
||||
|
||||
#
|
||||
# Make sure we can also set the ashift using the tunable.
|
||||
#
|
||||
log_must zpool create $TESTPOOL $disk1
|
||||
log_must set_tunable64 VDEV_FILE_PHYSICAL_ASHIFT $ashift
|
||||
log_must zpool add $TESTPOOL $disk2
|
||||
verify_ashift $disk2 $ashift
|
||||
if [[ $? -ne 0 ]]
|
||||
then
|
||||
log_fail "Device was added without setting ashift value to "\
|
||||
"$ashift"
|
||||
fi
|
||||
# clean things for the next run
|
||||
log_must set_tunable64 VDEV_FILE_PHYSICAL_ASHIFT $orig_ashift
|
||||
log_must zpool destroy $TESTPOOL
|
||||
log_must zpool labelclear $disk1
|
||||
log_must zpool labelclear $disk2
|
||||
done
|
||||
|
||||
typeset badvals=("off" "on" "1" "8" "17" "1b" "ff" "-")
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
#
|
||||
# Copyright 2017, loli10K. All rights reserved.
|
||||
# Copyright (c) 2020 by Delphix. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/include/libtest.shlib
|
||||
@@ -43,6 +44,7 @@ verify_runnable "global"
|
||||
|
||||
function cleanup
|
||||
{
|
||||
log_must set_tunable64 VDEV_FILE_PHYSICAL_ASHIFT $orig_ashift
|
||||
poolexists $TESTPOOL && destroy_pool $TESTPOOL
|
||||
log_must rm -f $disk1 $disk2
|
||||
}
|
||||
@@ -55,6 +57,14 @@ disk2=$TEST_BASE_DIR/disk2
|
||||
log_must mkfile $SIZE $disk1
|
||||
log_must mkfile $SIZE $disk2
|
||||
|
||||
orig_ashift=$(get_tunable VDEV_FILE_PHYSICAL_ASHIFT)
|
||||
#
|
||||
# Set the file vdev's ashift to the max. Overriding
|
||||
# the ashift using the -o ashift property should still
|
||||
# be honored.
|
||||
#
|
||||
log_must set_tunable64 VDEV_FILE_PHYSICAL_ASHIFT 16
|
||||
|
||||
typeset ashifts=("9" "10" "11" "12" "13" "14" "15" "16")
|
||||
for ashift in ${ashifts[@]}
|
||||
do
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
#
|
||||
# Copyright 2017, loli10K. All rights reserved.
|
||||
# Copyright (c) 2020 by Delphix. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/include/libtest.shlib
|
||||
@@ -41,6 +42,7 @@ verify_runnable "global"
|
||||
|
||||
function cleanup
|
||||
{
|
||||
log_must set_tunable64 VDEV_FILE_PHYSICAL_ASHIFT $orig_ashift
|
||||
poolexists $TESTPOOL1 && destroy_pool $TESTPOOL1
|
||||
rm -f $disk1 $disk2
|
||||
}
|
||||
@@ -53,6 +55,14 @@ disk2=$TEST_BASE_DIR/disk2
|
||||
log_must truncate -s $SIZE $disk1
|
||||
log_must truncate -s $SIZE $disk2
|
||||
|
||||
orig_ashift=$(get_tunable VDEV_FILE_PHYSICAL_ASHIFT)
|
||||
#
|
||||
# Set the file vdev's ashift to the max. Overriding
|
||||
# the ashift using the -o ashift property should still
|
||||
# be honored.
|
||||
#
|
||||
log_must set_tunable64 VDEV_FILE_PHYSICAL_ASHIFT 16
|
||||
|
||||
typeset ashifts=("9" "10" "11" "12" "13" "14" "15" "16")
|
||||
for ashift in ${ashifts[@]}
|
||||
do
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
#
|
||||
# Copyright 2017, loli10K. All rights reserved.
|
||||
# Copyright (c) 2020 by Delphix. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/include/libtest.shlib
|
||||
@@ -41,6 +42,7 @@ verify_runnable "global"
|
||||
|
||||
function cleanup
|
||||
{
|
||||
log_must set_tunable64 VDEV_FILE_PHYSICAL_ASHIFT $orig_ashift
|
||||
poolexists $TESTPOOL1 && destroy_pool $TESTPOOL1
|
||||
rm -f $disk1 $disk2
|
||||
}
|
||||
@@ -53,6 +55,14 @@ disk2=$TEST_BASE_DIR/disk2
|
||||
log_must truncate -s $SIZE $disk1
|
||||
log_must truncate -s $SIZE $disk2
|
||||
|
||||
orig_ashift=$(get_tunable VDEV_FILE_PHYSICAL_ASHIFT)
|
||||
#
|
||||
# Set the file vdev's ashift to the max. Overriding
|
||||
# the ashift using the -o ashift property should still
|
||||
# be honored.
|
||||
#
|
||||
log_must set_tunable64 VDEV_FILE_PHYSICAL_ASHIFT 16
|
||||
|
||||
typeset ashifts=("9" "10" "11" "12" "13" "14" "15" "16")
|
||||
for ashift in ${ashifts[@]}
|
||||
do
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
#
|
||||
# Copyright 2017, loli10K. All rights reserved.
|
||||
# Copyright (c) 2020 by Delphix. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/include/libtest.shlib
|
||||
@@ -43,6 +44,7 @@ verify_runnable "global"
|
||||
|
||||
function cleanup
|
||||
{
|
||||
log_must set_tunable64 VDEV_FILE_PHYSICAL_ASHIFT $orig_ashift
|
||||
poolexists $TESTPOOL1 && destroy_pool $TESTPOOL1
|
||||
rm -f $disk1 $disk2
|
||||
}
|
||||
@@ -55,6 +57,14 @@ disk2=$TEST_BASE_DIR/disk2
|
||||
log_must truncate -s $SIZE $disk1
|
||||
log_must truncate -s $SIZE $disk2
|
||||
|
||||
orig_ashift=$(get_tunable VDEV_FILE_PHYSICAL_ASHIFT)
|
||||
#
|
||||
# Set the file vdev's ashift to the max. Overriding
|
||||
# the ashift using the -o ashift property should still
|
||||
# be honored.
|
||||
#
|
||||
log_must set_tunable64 VDEV_FILE_PHYSICAL_ASHIFT 16
|
||||
|
||||
typeset ashifts=("9" "10" "11" "12" "13" "14" "15" "16")
|
||||
for ashift in ${ashifts[@]}
|
||||
do
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
#
|
||||
# Copyright 2017, loli10K. All rights reserved.
|
||||
# Copyright (c) 2020 by Delphix. All rights reserved.
|
||||
#
|
||||
|
||||
. $STF_SUITE/include/libtest.shlib
|
||||
@@ -41,6 +42,7 @@ verify_runnable "global"
|
||||
|
||||
function cleanup
|
||||
{
|
||||
log_must set_tunable64 VDEV_FILE_PHYSICAL_ASHIFT $orig_ashift
|
||||
destroy_pool $TESTPOOL1
|
||||
rm -f $disk
|
||||
}
|
||||
@@ -52,6 +54,14 @@ log_onexit cleanup
|
||||
|
||||
log_assert "zpool set can modify 'ashift' property"
|
||||
|
||||
orig_ashift=$(get_tunable VDEV_FILE_PHYSICAL_ASHIFT)
|
||||
#
|
||||
# Set the file vdev's ashift to the max. Overriding
|
||||
# the ashift using the -o ashift property should still
|
||||
# be honored.
|
||||
#
|
||||
log_must set_tunable64 VDEV_FILE_PHYSICAL_ASHIFT 16
|
||||
|
||||
disk=$TEST_BASE_DIR/disk
|
||||
log_must mkfile $SIZE $disk
|
||||
log_must zpool create $TESTPOOL1 $disk
|
||||
|
||||
Reference in New Issue
Block a user