Skip to content

Commit

Permalink
Add SMART attributes for SSD and NVMe
Browse files Browse the repository at this point in the history
This adds the SMART attributes required to probe Samsung SSD and NVMe
(and possibly others) disks when using the "zpool status -c" command.

Reviewed-by: loli10K <[email protected]>
Reviewed-by: Giuseppe Di Natale <[email protected]>
Reviewed-by: Tony Hutter <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: bunder2015 <[email protected]>
Closes openzfs#7183 
Closes openzfs#7193
  • Loading branch information
bunder2015 authored and tonyhutter committed Mar 8, 2018
1 parent 24031f5 commit 0a33063
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 2 deletions.
2 changes: 2 additions & 0 deletions cmd/zpool/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ dist_zpoolexec_SCRIPTS = \
zpool.d/pend_sec \
zpool.d/off_ucor \
zpool.d/ata_err \
zpool.d/nvme_err \
zpool.d/pwr_cyc \
zpool.d/upath \
zpool.d/vendor
Expand Down Expand Up @@ -98,6 +99,7 @@ zpoolconfdefaults = \
pend_sec \
off_ucor \
ata_err \
nvme_err \
pwr_cyc \
upath \
vendor
Expand Down
1 change: 1 addition & 0 deletions cmd/zpool/zpool.d/nvme_err
23 changes: 21 additions & 2 deletions cmd/zpool/zpool.d/smart
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ off_ucor: Show SMART offline uncorrectable errors (ATA).
ata_err: Show SMART ATA errors (ATA).
pwr_cyc: Show SMART power cycle count (ATA).
serial: Show disk serial number.
nvme_err: Show SMART NVMe errors (NVMe).
"

script=$(basename "$0")
Expand All @@ -37,15 +38,18 @@ smartctl_path=$(which smartctl)
if [ -b "$VDEV_UPATH" ] && [ -x "$smartctl_path" ]; then
raw_out=$(eval "sudo $smartctl_path -a $VDEV_UPATH")

# Are we a SAS or ATA drive? Look for the right line in smartctl:
# What kind of drive are we? Look for the right line in smartctl:
#
# SAS:
# Transport protocol: SAS
#
# SATA:
# ATA Version is: 8
#
type=$(echo "$raw_out" | grep -m 1 -Eo '^ATA|SAS$')
# NVMe:
# SMART/Health Information (NVMe Log 0xnn, NSID 0xnn)
#
type=$(echo "$raw_out" | grep -m 1 -Eo '^ATA|NVMe|SAS$')
out=$(echo "$raw_out" | awk '
# SAS specific
/read:/{print "rrd="$4"\nr_cor="$5"\nr_proc="$7"\nr_ucor="$8}
Expand All @@ -71,10 +75,21 @@ if [ -b "$VDEV_UPATH" ] && [ -x "$smartctl_path" ]; then
# SATA common
/Temperature_Celsius/{print "temp="$10}
/Airflow_Temperature_Cel/{print "temp="$10}
/SMART overall-health self-assessment test result:/{print "health="$6}
/Power_On_Hours/{print "hours_on="$10}
/Serial Number:/{print "serial="$3}
# NVMe common
/Temperature:/{print "temp="$2}
/SMART overall-health self-assessment test result:/{print "health="$6}
/Power On Hours:/{gsub("[^0-9]","",$4); print "hours_on="$4}
/Serial Number:/{print "serial="$3}
/Power Cycles:/{print "pwr_cyc="$3}
# NVMe specific
/Media and Data Integrity Errors:/{print "nvme_err="$6}
END {ORS="\n"; print ""}
');
fi
Expand All @@ -94,6 +109,8 @@ smart)
scripts="temp|health|r_ucor|w_ucor"
elif [ "$type" = "ATA" ] ; then
scripts="temp|health|ata_err|realloc|rep_ucor|cmd_to|pend_sec|off_ucor"
elif [ "$type" = "NVMe" ] ; then
scripts="temp|health|nvme_err"
fi
;;
smartx)
Expand All @@ -102,6 +119,8 @@ smartx)
scripts="hours_on|defect|nonmed|r_proc|w_proc"
elif [ "$type" = "ATA" ] ; then
scripts="hours_on|pwr_cyc"
elif [ "$type" = "NVMe" ] ; then
scripts="hours_on|pwr_cyc"
fi
;;
*)
Expand Down

0 comments on commit 0a33063

Please sign in to comment.