mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04: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 Differential Revision: https://reviews.freebsd.org/D46866 (cherry picked from commit 618ae939b7f95a197a0518cbb390a572bb90c6d0)
This commit is contained in:
parent
efcaa63aca
commit
d3459fe7f7
3 changed files with 18 additions and 12 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue