mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 02:27:36 +03:00
Fix 'zpool add' handling of nested interior VDEVs
When replacing a faulted device which was previously handled by a spare
multiple levels of nested interior VDEVs will be present in the pool
configuration; the following example illustrates one of the possible
situations:
NAME STATE READ WRITE CKSUM
testpool DEGRADED 0 0 0
raidz1-0 DEGRADED 0 0 0
spare-0 DEGRADED 0 0 0
replacing-0 DEGRADED 0 0 0
/var/tmp/fault-dev UNAVAIL 0 0 0 cannot open
/var/tmp/replace-dev ONLINE 0 0 0
/var/tmp/spare-dev1 ONLINE 0 0 0
/var/tmp/safe-dev ONLINE 0 0 0
spares
/var/tmp/spare-dev1 INUSE currently in use
This is safe and allowed, but get_replication() needs to handle this
situation gracefully to let zpool add new devices to the pool.
Reviewed-by: George Melikov <mail@gmelikov.ru>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: loli10K <ezomori.nozomu@gmail.com>
Closes #6678
Closes #6996
This commit is contained in:
@@ -1988,6 +1988,31 @@ function check_hotspare_state # pool disk state{inuse,avail}
|
||||
return 0
|
||||
}
|
||||
|
||||
#
|
||||
# Wait until a hotspare transitions to a given state or times out.
|
||||
#
|
||||
# Return 0 when pool/disk matches expected state, 1 on timeout.
|
||||
#
|
||||
function wait_hotspare_state # pool disk state timeout
|
||||
{
|
||||
typeset pool=$1
|
||||
typeset disk=${2#$/DEV_DSKDIR/}
|
||||
typeset state=$3
|
||||
typeset timeout=${4:-60}
|
||||
typeset -i i=0
|
||||
|
||||
while [[ $i -lt $timeout ]]; do
|
||||
if check_hotspare_state $pool $disk $state; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
i=$((i+1))
|
||||
sleep 1
|
||||
done
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
#
|
||||
# Verify a given slog disk is inuse or avail
|
||||
#
|
||||
@@ -2026,6 +2051,31 @@ function check_vdev_state # pool disk state{online,offline,unavail}
|
||||
return 0
|
||||
}
|
||||
|
||||
#
|
||||
# Wait until a vdev transitions to a given state or times out.
|
||||
#
|
||||
# Return 0 when pool/disk matches expected state, 1 on timeout.
|
||||
#
|
||||
function wait_vdev_state # pool disk state timeout
|
||||
{
|
||||
typeset pool=$1
|
||||
typeset disk=${2#$/DEV_DSKDIR/}
|
||||
typeset state=$3
|
||||
typeset timeout=${4:-60}
|
||||
typeset -i i=0
|
||||
|
||||
while [[ $i -lt $timeout ]]; do
|
||||
if check_vdev_state $pool $disk $state; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
i=$((i+1))
|
||||
sleep 1
|
||||
done
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
#
|
||||
# Check the output of 'zpool status -v <pool>',
|
||||
# and to see if the content of <token> contain the <keyword> specified.
|
||||
@@ -3394,13 +3444,25 @@ function zed_stop
|
||||
if [[ -f ${ZEDLET_DIR}/zed.pid ]]; then
|
||||
zedpid=$(cat ${ZEDLET_DIR}/zed.pid)
|
||||
kill $zedpid
|
||||
wait $zedpid
|
||||
while ps -p $zedpid > /dev/null; do
|
||||
sleep 1
|
||||
done
|
||||
rm -f ${ZEDLET_DIR}/zed.pid
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
#
|
||||
# Drain all zevents
|
||||
#
|
||||
function zed_events_drain
|
||||
{
|
||||
while [ $(zpool events -H | wc -l) -ne 0 ]; do
|
||||
sleep 1
|
||||
zpool events -c >/dev/null
|
||||
done
|
||||
}
|
||||
|
||||
#
|
||||
# Check is provided device is being active used as a swap device.
|
||||
#
|
||||
|
||||
Reference in New Issue
Block a user