1
0
mirror of https://git.FreeBSD.org/src.git synced 2025-01-12 14:29:28 +00:00

zfsd: replace vdevs with the AUX faulted state

Without this patch, vdevs faulted via AUX state would not be replaced
once the appropriate drive is replaced.  ZFS does not internally use
that state, but a drive can be manually forced into such a state with a
command like zinject.

Submitted by:	Goran Mekić <meka@tilda.center>
Sponsored by:	ConnectWise
MFC after:	2 weeks
Differential Revision: https://reviews.freebsd.org/D46866
This commit is contained in:
Alan Somers 2024-10-03 15:54:28 -06:00
parent e94a1d6a7f
commit 618ae939b7
3 changed files with 18 additions and 12 deletions

View File

@ -288,7 +288,7 @@ CaseFile::ReEvaluate(const string &devPath, const string &physPath, Vdev *vdev)
return (/*consumed*/false);
}
if (VdevState() > VDEV_STATE_CANT_OPEN) {
if (VdevState() > VDEV_STATE_FAULTED) {
/*
* For now, newly discovered devices only help for
* devices that are missing. In the future, we might

View File

@ -52,7 +52,7 @@ function wait_for_pool_dev_state_change
function wait_for_pool_removal
{
typeset -i timeout=$1
wait_for_pool_dev_state_change $timeout $REMOVAL_DISK "REMOVED|UNAVAIL"
wait_for_pool_dev_state_change $timeout $REMOVAL_DISK "REMOVED|UNAVAIL|FAULTED"
}
function wait_until_scrubbed

View File

@ -83,19 +83,25 @@ typeset SPARE_NOP=${DISK4}.nop
typeset OTHER_DISKS="${DISK1} ${DISK2}"
typeset OTHER_NOPS=${OTHER_DISKS//~(E)([[:space:]]+|$)/.nop\1}
set -A MY_KEYWORDS "mirror" "raidz1" "raidz2"
set -A MY_FAILURES "FAULTED" "REMOVED"
ensure_zfsd_running
log_must create_gnops $OTHER_DISKS $SPARE_DISK
for keyword in "${MY_KEYWORDS[@]}" ; do
log_must create_gnop $REMOVAL_DISK $PHYSPATH
log_must create_pool $TESTPOOL $keyword $REMOVAL_NOP $OTHER_NOPS spare $SPARE_NOP
log_must $ZPOOL set autoreplace=on $TESTPOOL
for failure in "${MY_FAILURES[@]}" ; do
for keyword in "${MY_KEYWORDS[@]}" ; do
log_must create_gnop $REMOVAL_DISK $PHYSPATH
log_must create_pool $TESTPOOL $keyword $REMOVAL_NOP $OTHER_NOPS spare $SPARE_NOP
log_must $ZPOOL set autoreplace=on $TESTPOOL
log_must destroy_gnop $REMOVAL_DISK
log_must wait_for_pool_removal 20
log_must create_gnop $NEW_DISK $PHYSPATH
verify_assertion
destroy_pool "$TESTPOOL"
log_must destroy_gnop $NEW_DISK
if [ $failure = "FAULTED" ]; then
log_must zinject -d $REMOVAL_NOP -A fault $TESTPOOL
fi
log_must destroy_gnop $REMOVAL_DISK
log_must wait_for_pool_removal 20
log_must create_gnop $NEW_DISK $PHYSPATH
verify_assertion
destroy_pool "$TESTPOOL"
log_must destroy_gnop $NEW_DISK
done
done
log_pass