mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-25 02:49:32 +03:00
Fix statechange-led.sh & unnecessary libdevmapper warning
- Fix autoreplace behaviour on statechange-led.sh script. ZED sends the following events on an auto-replace: 1. statechange: Disk goes UNAVAIL->ONLINE 2. statechange: Disk goes ONLINE->UNAVAIL 3. vdev_attach: Disk goes ONLINE Events 1-2 happen when ZED first attempts to do an auto-online. When that fails, ZED then tries an auto-replace, generating the vdev_attach event in #3. In the previous code, statechange-led was only looking at the UNAVAIL->ONLINE transition to turn off the LED. It ignored the #2 ONLINE->UNAVAIL transition, assuming it was just the "old" VDEV going offline. This is problematic, as a drive can go from ONLINE->UNAVAIL when it's malfunctioning, and we don't want to ignore that. This new patch correctly turns on the fault LED every time a drive becomes UNAVAIL. It also monitors vdev_attach events to trigger turning off the LED when an auto-replaced disk comes online. - Remove unnecessary libdevmapper warning with --with-config=kernel This fixes an unnecessary libdevmapper warning when building --with-config=kernel. Kernel code does not use libdevmapper, so the warning is not needed. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Tony Hutter <hutter2@llnl.gov> Closes #2375 Closes #5312 Closes #5331
This commit is contained in:
parent
402c7c27b0
commit
6568379eea
@ -71,29 +71,12 @@ function led
|
|||||||
function process {
|
function process {
|
||||||
path="$1"
|
path="$1"
|
||||||
fault=$2
|
fault=$2
|
||||||
prev=$3
|
if [ "$fault" == "FAULTED" ] || [ "$fault" == "DEGRADED" ] || \
|
||||||
if [ "$fault" == "FAULTED" ] || [ "$fault" == "DEGRADED" ] ; then
|
[ "$fault" == "UNAVAIL" ] ; then
|
||||||
led "$path" 1
|
|
||||||
elif [ "$fault" == "UNAVAIL" ] && [ "$prev" != "ONLINE" ] ; then
|
|
||||||
# For the most part, UNAVAIL should turn on the LED. However,
|
|
||||||
# during an autoreplace, we see our new drive go online,
|
|
||||||
# followed by our "old" drive going ONLINE->UNAVAIL. Since the
|
|
||||||
# "old" drive has the same slot information, we want to ignore
|
|
||||||
# the ONLINE->UNAVAIL event.
|
|
||||||
#
|
|
||||||
# NAME STATE READ WRITE CKSUM
|
|
||||||
# mypool3 DEGRADED 0 0 0
|
|
||||||
# mirror-0 DEGRADED 0 0 0
|
|
||||||
# A1 ONLINE 0 0 0
|
|
||||||
# A2 ONLINE 0 880 0
|
|
||||||
# replacing-3 UNAVAIL 0 0 0
|
|
||||||
# old UNAVAIL 0 2.93K 0 corrupted data
|
|
||||||
# A3 ONLINE 0 0 156 (resilvering)
|
|
||||||
led "$path" 1
|
led "$path" 1
|
||||||
elif [ "$fault" == "ONLINE" ] ; then
|
elif [ "$fault" == "ONLINE" ] ; then
|
||||||
led "$path" 0
|
led "$path" 0
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
process "$ZEVENT_VDEV_ENC_SYSFS_PATH" "$ZEVENT_VDEV_STATE_STR" \
|
process "$ZEVENT_VDEV_ENC_SYSFS_PATH" "$ZEVENT_VDEV_STATE_STR"
|
||||||
"$ZEVENT_VDEV_LASTSTATE_STR"
|
|
||||||
|
1
cmd/zed/zed.d/vdev_attach-led.sh
Symbolic link
1
cmd/zed/zed.d/vdev_attach-led.sh
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
statechange-led.sh
|
@ -304,6 +304,7 @@ AC_CONFIG_FILES([
|
|||||||
|
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|
||||||
AS_IF([test "x$user_libdevmapper" != xyes ], [
|
AS_IF([test "x$user_libdevmapper" != xyes && test "$ZFS_CONFIG" != kernel ], [
|
||||||
AC_MSG_WARN([Building without libdevmapper. Auto-replace, auto-online, and statechange-led.sh may not work correctly with device mapper vdevs.])
|
AC_MSG_WARN([Building without libdevmapper. Auto-replace, auto-online, \
|
||||||
|
and statechange-led.sh may not work correctly with device mapper vdevs.])
|
||||||
])
|
])
|
||||||
|
@ -307,6 +307,10 @@ zfs_ereport_start(nvlist_t **ereport_out, nvlist_t **detector_out,
|
|||||||
fm_payload_set(ereport,
|
fm_payload_set(ereport,
|
||||||
FM_EREPORT_PAYLOAD_ZFS_VDEV_FRU,
|
FM_EREPORT_PAYLOAD_ZFS_VDEV_FRU,
|
||||||
DATA_TYPE_STRING, vd->vdev_fru, NULL);
|
DATA_TYPE_STRING, vd->vdev_fru, NULL);
|
||||||
|
if (vd->vdev_enc_sysfs_path != NULL)
|
||||||
|
fm_payload_set(ereport,
|
||||||
|
FM_EREPORT_PAYLOAD_ZFS_VDEV_ENC_SYSFS_PATH,
|
||||||
|
DATA_TYPE_STRING, vd->vdev_enc_sysfs_path, NULL);
|
||||||
if (vd->vdev_ashift)
|
if (vd->vdev_ashift)
|
||||||
fm_payload_set(ereport,
|
fm_payload_set(ereport,
|
||||||
FM_EREPORT_PAYLOAD_ZFS_VDEV_ASHIFT,
|
FM_EREPORT_PAYLOAD_ZFS_VDEV_ASHIFT,
|
||||||
@ -928,6 +932,10 @@ zfs_post_common(spa_t *spa, vdev_t *vd, const char *type, const char *name,
|
|||||||
if (vd->vdev_fru != NULL)
|
if (vd->vdev_fru != NULL)
|
||||||
VERIFY0(nvlist_add_string(resource,
|
VERIFY0(nvlist_add_string(resource,
|
||||||
FM_EREPORT_PAYLOAD_ZFS_VDEV_FRU, vd->vdev_fru));
|
FM_EREPORT_PAYLOAD_ZFS_VDEV_FRU, vd->vdev_fru));
|
||||||
|
if (vd->vdev_enc_sysfs_path != NULL)
|
||||||
|
VERIFY0(nvlist_add_string(resource,
|
||||||
|
FM_EREPORT_PAYLOAD_ZFS_VDEV_ENC_SYSFS_PATH,
|
||||||
|
vd->vdev_enc_sysfs_path));
|
||||||
/* also copy any optional payload data */
|
/* also copy any optional payload data */
|
||||||
if (aux) {
|
if (aux) {
|
||||||
nvpair_t *elem = NULL;
|
nvpair_t *elem = NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user