SMART Power_On_Hours rewind on WD Greens (WD30EZRX)

Just sharing a SMART Power_On_Hours rewind observation on some older WD Greens in a mirror I use as a periodic backup target.

System:

  • TrueNAS 25.10.0.1 on Intel AHCI (Gigabyte H67 / i5-2400)
  • Drives: 2× WDC WD30EZRX-00SPEB0 (fw 80.00A80), direct SATA (no USB/HBA)

I log SMART daily. Both WD drives’ power on hours increase normally until 2026-04-05.

On 2026-04-06, both dropped backward by exactly 1169 hours, then continued increasing normally from the lower value.

This lined up with a warm system reboot (drives did not power cycle) on Apr 6th. Other warm and full system reboots have not exhibited this for as long as I’ve been tracking.

Example:

  • WDC Green 1: 29148 → 27979
  • WDC Green 2: 25186 → 24017

Both drives did this at the same time, same amount.
Other SMART stats I track on the WD Greens did not rewind.
Power was maintained across the OS reboot (none of the drives incremented power cycle counts).
Current smartctl output matches the lower values (not an observation script bug).
Other drives in the system (Micron SSDs, Kingston SSD) did not do this.
Overall SMART looks normal (no reallocs/pending/uncorrectable, no errors).

Not really an issue for my use case, just something I wanted to share with the community.

Are you certain this didn’t happen on April 1st :slight_smile:

But that is a very odd problem to have. What did you use to collect the power on hours values?

Just a cronjob bash script. It just stitches together smart values from json once a night for each drive and appends it to a file copied off-machine. Here are the key parts as snippets, everything else is just handling edge cases:

SMARTCTL="${SMARTCTL:-/usr/sbin/smartctl}"
JQ="${JQ:-/usr/bin/jq}"
TIMEOUT_BIN="${TIMEOUT_BIN:-/usr/bin/timeout}"
TIMEOUT_SECS="${TIMEOUT_SECS:-20}"

# Get SMART as json
smart_json() {
  [[ -L "${DEVICE}" || -b "${DEVICE}" ]] || die "Not a block device or symlink: ${DEVICE}"
  "$TIMEOUT_BIN" "${TIMEOUT_SECS}s" "$SMARTCTL" -j -a "$DEVICE"
}

# Pull an ATA SMART attribute raw value by ID (e.g. 9, 194, 199).
jq_attr_raw='
  def attr_raw($id):
    (.ata_smart_attributes.table[]? | select(.id==$id) | .raw.value) // null;

'

# Example of pulling the power-on-hours attribute for ata and nvme (which have different fields)
def poh:
  (.power_on_time.hours? // null)
  // attr_raw(9)
  // (.nvme_smart_health_information_log.power_on_hours? // null);