From efcdfb9118cd4d3db5c5a49d2cc8b5f8b4033096 Mon Sep 17 00:00:00 2001 From: Andrea Mazzoleni Date: Sun, 21 Dec 2025 15:55:52 +0100 Subject: [PATCH] When logging device attributes, also provide the split information --- cmdline/device.c | 14 +++++++--- cmdline/mingw.c | 12 ++++----- cmdline/portable.h | 4 ++- cmdline/thermal.c | 4 +-- cmdline/unix.c | 12 ++++----- doc/snapraid_log.1 | 62 ++++++++++++++++++++++---------------------- doc/snapraid_log.d | 56 ++++++++++++++++++++------------------- doc/snapraid_log.txt | 56 ++++++++++++++++++++------------------- 8 files changed, 119 insertions(+), 101 deletions(-) diff --git a/cmdline/device.c b/cmdline/device.c index 70d46dfc..76ff1baa 100644 --- a/cmdline/device.c +++ b/cmdline/device.c @@ -21,6 +21,14 @@ #include "state.h" #include "raid/raid.h" +void device_name_set(devinfo_t* dev, const char* name, int index) +{ + if (index == 0) + pathcpy(dev->name, sizeof(dev->name), name); + else + pathprint(dev->name, sizeof(dev->name), "%s/%d", name, index); +} + /** * The following are Failure Rate tables computed from the data that * BackBlaze made available at: @@ -881,7 +889,7 @@ int devtest(tommy_list* high, tommy_list* low, int operation) pathprint(entry->serial, sizeof(entry->serial), "FAKE_%s", devinfo->serial); pathprint(entry->vendor, sizeof(entry->vendor), "FAKE_%s", devinfo->vendor); pathprint(entry->model, sizeof(entry->model), "FAKE_%s", devinfo->model); - pathprint(entry->file, sizeof(entry->name), "FAKE_%s", devinfo->file); + pathprint(entry->file, sizeof(entry->file), "FAKE_%s", devinfo->file); pathcpy(entry->name, sizeof(entry->name), devinfo->name); entry->info[INFO_SIZE] = count * TERA; entry->info[INFO_ROTATION_RATE] = 7200; @@ -934,7 +942,7 @@ void state_device(struct snapraid_state* state, int operation, tommy_list* filte entry = calloc_nofail(1, sizeof(devinfo_t)); entry->device = disk->device; - pathcpy(entry->name, sizeof(entry->name), disk->name); + device_name_set(entry, disk->name, 0); pathcpy(entry->mount, sizeof(entry->mount), disk->dir); pathcpy(entry->smartctl, sizeof(entry->smartctl), disk->smartctl); memcpy(entry->smartignore, disk->smartignore, sizeof(entry->smartignore)); @@ -954,7 +962,7 @@ void state_device(struct snapraid_state* state, int operation, tommy_list* filte entry = calloc_nofail(1, sizeof(devinfo_t)); entry->device = state->parity[j].split_map[s].device; - pathcpy(entry->name, sizeof(entry->name), lev_config_name(j)); + device_name_set(entry, lev_config_name(j), s); pathcpy(entry->mount, sizeof(entry->mount), state->parity[j].split_map[s].path); pathcpy(entry->smartctl, sizeof(entry->smartctl), state->parity[j].smartctl); memcpy(entry->smartignore, state->parity[j].smartignore, sizeof(entry->smartignore)); diff --git a/cmdline/mingw.c b/cmdline/mingw.c index 6eddf561..f4b69295 100644 --- a/cmdline/mingw.c +++ b/cmdline/mingw.c @@ -2312,7 +2312,7 @@ static int devresolve(const char* mount, char* file, size_t file_size, char* wfi /** * Read a device tree filling the specified list of disk_t entries. */ -static int devtree(const char* name, const char* smartctl, const int* smartignore, const char* wfile, devinfo_t* parent, tommy_list* list) +static int devtree(devinfo_t* parent, tommy_list* list) { wchar_t conv_buf[CONV_MAX]; HANDLE h; @@ -2325,7 +2325,7 @@ static int devtree(const char* name, const char* smartctl, const int* smartignor DWORD i; /* open the volume */ - h = CreateFileW(convert(conv_buf, wfile), 0, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0); + h = CreateFileW(convert(conv_buf, parent->wfile), 0, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0); if (h == INVALID_HANDLE_VALUE) { windows_errno(GetLastError()); return -1; @@ -2360,9 +2360,9 @@ static int devtree(const char* name, const char* smartctl, const int* smartignor devinfo = calloc_nofail(1, sizeof(devinfo_t)); - pathcpy(devinfo->name, sizeof(devinfo->name), name); - pathcpy(devinfo->smartctl, sizeof(devinfo->smartctl), smartctl); - memcpy(devinfo->smartignore, smartignore, sizeof(devinfo->smartignore)); + pathcpy(devinfo->name, sizeof(devinfo->name), parent->name); + pathcpy(devinfo->smartctl, sizeof(devinfo->smartctl), parent->smartctl); + memcpy(devinfo->smartignore, parent->smartignore, sizeof(devinfo->smartignore)); devinfo->device = vde->Extents[i].DiskNumber; pathprint(devinfo->file, sizeof(devinfo->file), "/dev/pd%" PRIu64, devinfo->device); pathprint(devinfo->wfile, sizeof(devinfo->wfile), "\\\\.\\PhysicalDrive%" PRIu64, devinfo->device); @@ -2992,7 +2992,7 @@ int devquery(tommy_list* high, tommy_list* low, int operation, int others) } /* expand the tree of devices */ - if (devtree(devinfo->name, devinfo->smartctl, devinfo->smartignore, devinfo->wfile, devinfo, low) != 0) { + if (devtree(devinfo, low) != 0) { /* LCOV_EXCL_START */ log_fatal("Failed to expand device '%s'.\n", devinfo->file); return -1; diff --git a/cmdline/portable.h b/cmdline/portable.h index cc133ddf..2be582eb 100644 --- a/cmdline/portable.h +++ b/cmdline/portable.h @@ -504,7 +504,7 @@ int randomize(void* ptr, size_t size); */ struct devinfo_struct { uint64_t device; /**< Device ID. */ - char name[PATH_MAX]; /**< Name of the disk. */ + char name[PATH_MAX]; /**< Name of the disk combined with the split index if any */ char mount[PATH_MAX]; /**< Mount point or other contained directory. */ char smartctl[PATH_MAX]; /**< Options for smartctl. */ int smartignore[SMART_IGNORE_MAX]; /**< Attribues to ignore */ @@ -526,6 +526,8 @@ struct devinfo_struct { }; typedef struct devinfo_struct devinfo_t; +void device_name_set(devinfo_t* dev, const char* name, int index); + #define DEVICE_LIST 0 #define DEVICE_DOWN 1 #define DEVICE_UP 2 diff --git a/cmdline/thermal.c b/cmdline/thermal.c index 1b22f341..aca7cb3e 100644 --- a/cmdline/thermal.c +++ b/cmdline/thermal.c @@ -159,7 +159,7 @@ void state_thermal(struct snapraid_state* state, time_t now) entry = calloc_nofail(1, sizeof(devinfo_t)); entry->device = disk->device; - pathcpy(entry->name, sizeof(entry->name), disk->name); + device_name_set(entry, disk->name, 0); pathcpy(entry->mount, sizeof(entry->mount), disk->dir); pathcpy(entry->smartctl, sizeof(entry->smartctl), disk->smartctl); memcpy(entry->smartignore, disk->smartignore, sizeof(entry->smartignore)); @@ -176,7 +176,7 @@ void state_thermal(struct snapraid_state* state, time_t now) entry = calloc_nofail(1, sizeof(devinfo_t)); entry->device = state->parity[j].split_map[s].device; - pathcpy(entry->name, sizeof(entry->name), lev_config_name(j)); + device_name_set(entry, lev_config_name(j), s); pathcpy(entry->mount, sizeof(entry->mount), state->parity[j].split_map[s].path); pathcpy(entry->smartctl, sizeof(entry->smartctl), state->parity[j].smartctl); memcpy(entry->smartignore, state->parity[j].smartignore, sizeof(entry->smartignore)); diff --git a/cmdline/unix.c b/cmdline/unix.c index 78ee10ce..83115407 100644 --- a/cmdline/unix.c +++ b/cmdline/unix.c @@ -993,7 +993,7 @@ static dev_t devread(const char* path) * Read a device tree filling the specified list of disk_t entries. */ #if HAVE_LINUX_DEVICE -static int devtree(const char* name, const char* smartctl, const int* smartignore, dev_t device, devinfo_t* parent, tommy_list* list) +static int devtree(devinfo_t* parent, dev_t device, tommy_list* list) { char path[PATH_MAX]; DIR* d; @@ -1021,7 +1021,7 @@ static int devtree(const char* name, const char* smartctl, const int* smartignor /* LCOV_EXCL_STOP */ } - if (devtree(name, smartctl, smartignore, subdev, parent, list) != 0) { + if (devtree(parent, subdev, list) != 0) { /* LCOV_EXCL_START */ closedir(d); return -1; @@ -1065,9 +1065,9 @@ static int devtree(const char* name, const char* smartctl, const int* smartignor devinfo = calloc_nofail(1, sizeof(devinfo_t)); devinfo->device = device; - pathcpy(devinfo->name, sizeof(devinfo->name), name); - pathcpy(devinfo->smartctl, sizeof(devinfo->smartctl), smartctl); - memcpy(devinfo->smartignore, smartignore, sizeof(devinfo->smartignore)); + pathcpy(devinfo->name, sizeof(devinfo->name), parent->name); + pathcpy(devinfo->smartctl, sizeof(devinfo->smartctl), parent->smartctl); + memcpy(devinfo->smartignore, parent->smartignore, sizeof(devinfo->smartignore)); pathcpy(devinfo->file, sizeof(devinfo->file), path); devinfo->parent = parent; @@ -1713,7 +1713,7 @@ int devquery(tommy_list* high, tommy_list* low, int operation, int others) } /* expand the tree of devices */ - if (devtree(devinfo->name, devinfo->smartctl, devinfo->smartignore, device, devinfo, low) != 0) { + if (devtree(devinfo, device, low) != 0) { /* LCOV_EXCL_START */ log_fatal("Failed to expand device '%u:%u'.\n", major(device), minor(device)); return -1; diff --git a/doc/snapraid_log.1 b/doc/snapraid_log.1 index b476da04..5733f929 100644 --- a/doc/snapraid_log.1 +++ b/doc/snapraid_log.1 @@ -504,14 +504,16 @@ The calculated ambient temperature in degrees Celsius. .PD .RE .TP -.B thermal:current::: +.B thermal:current:[/]:: Logs the most recent temperature reading for a specific disk device. .RS 4 .PD 0 .HP 4 -.I +.I [/] The configured name of the disk. +In case of multiple splits, the splits after the first +one have an extension \`/N\`, where N starts from 1. .HP 4 .I The unique device ID (uint64). @@ -534,16 +536,13 @@ The highest temperature observed in degrees Celsius. .PD .RE .TP -.B thermal:heat:::: +.B thermal:heat:[/]::: Logs the entire history of temperature data points collected so far for a specific disk, used for fitting the heating model. Only monotone increasing temperatures are included in the history. .RS 4 .PD 0 .HP 4 -.I -The configured name of the disk. -.HP 4 .I The unique device ID (uint64). .HP 4 @@ -563,7 +562,7 @@ monitoring (uint, seconds). .PD .RE .TP -.B thermal:params:::::::: +.B thermal:params:[/]::::::: Logs the estimated parameters for the exponential heating model (fit using least squares) and associated quality metrics for a specific disk. @@ -572,9 +571,6 @@ where T_0 is the initial temperature. .RS 4 .PD 0 .HP 4 -.I -The configured name of the disk. -.HP 4 .I The unique device ID (uint64). .HP 4 @@ -1448,7 +1444,7 @@ you\'ll see multiple tags for the same \`\` but with different Tags logging specific disk identification and raw SMART attribute values. .TP -.B smart:: +.B smart::[/] Logs the start of the SMART report for a device. .RS 4 .PD 0 @@ -1456,12 +1452,14 @@ Logs the start of the SMART report for a device. .I The file path of the device (e.g., /dev/sdb). .HP 4 -.I +.I [/] The configured name of the disk. +In case of multiple splits, the splits after the first +one have an extension \`/N\`, where N starts from 1. .PD .RE .TP -.B attr:::serial: +.B attr::[/]:serial: Logs the disk\'s serial number. .RS 4 .PD 0 @@ -1471,7 +1469,7 @@ The disk\'s serial number (escaped). .PD .RE .TP -.B attr:::vendor: +.B attr::[/]:vendor: Logs the disk\'s vendor string. .RS 4 .PD 0 @@ -1481,7 +1479,7 @@ The disk\'s vendor identifier (escaped). .PD .RE .TP -.B attr:::model: +.B attr::[/]:model: Logs the disk\'s model string. .RS 4 .PD 0 @@ -1491,7 +1489,7 @@ The disk\'s model identifier (escaped). .PD .RE .TP -.B attr:::afr:: +.B attr::[/]:afr:: Logs the estimated Annual Failure Rate (AFR) and the probability of one failure in the next year based on SMART attributes. The AFR is calculated using the maximum rate @@ -1508,7 +1506,7 @@ next year (double). .PD .RE .TP -.B attr:::size: +.B attr::[/]:size: Logs the size of the disk. .RS 4 .PD 0 @@ -1518,7 +1516,7 @@ The disk size in bytes (uint64). .PD .RE .TP -.B attr:::error: +.B attr::[/]:error: Logs the total error count. .RS 4 .PD 0 @@ -1528,7 +1526,7 @@ The total error count (uint64). .PD .RE .TP -.B attr:::rotationrate: +.B attr::[/]:rotationrate: Logs the disk\'s rotation rate. A value of 0 indicates an SSD. .RS 4 .PD 0 @@ -1538,7 +1536,7 @@ The rotation rate (uint64, RPM). .PD .RE .TP -.B attr:::flags:: +.B attr::[/]:flags:: Logs the SMART status flags from the \`smartctl\` utility. Per the smartctl manpage, these flags are bit\-mapped to indicate specific issues like \[dq]Command line did not parse\[dq], @@ -1555,7 +1553,7 @@ The raw flags value (uint64, hexadecimal). .PD .RE .TP -.B attr::::: +.B attr::[/]::: Logs the raw value of any assigned SMART attribute. .RS 4 .PD 0 @@ -1596,7 +1594,7 @@ command execution. They are primarily output during the \`up\` (spin\-up), \`down\` (spin\-down), and \`probe\` (power state check) commands. .TP -.B device:::active +.B device::[/]:active Logs that the device was confirmed to be in an active power state after a status probe. .RS 4 @@ -1605,27 +1603,29 @@ state after a status probe. .I The system path to the device node. .HP 4 -.I -The SnapRAID internal disk disk_name. +.I [/] +The configured name of the disk. +In case of multiple splits, the splits after the first +one have an extension \`/N\`, where N starts from 1. .PD .RE .TP -.B device:::standby +.B device::[/]:standby Logs that the device was confirmed to be in a standby/spun\-down state. .TP -.B device:::up +.B device::[/]:up Logs a successful spin\-up operation via direct O_DIRECT read. .TP -.B device:::down +.B device::[/]:down Logs a successful spin\-down operation initiated via the smartctl command. .TP -.B device:::shell +.B device::[/]:shell Logs a failure in the command shell execution environment. .TP -.B device:::error: +.B device::[/]:error: Logs a low\-level system error during direct file operations. This is triggered when open(), read(), or close() calls fail during a spin\-up attempt. @@ -1638,12 +1638,12 @@ the OS. .PD .RE .TP -.B device:::error:abort +.B device::[/]:error:abort Logs that an external process (smartctl) failed to complete normally, such as being terminated by a signal rather than exiting. .TP -.B device:::exit: +.B device::[/]:exit: Logs that the external command (smartctl) returned a non\-zero exit code that was not explicitly recognized as a valid state. .RS 4 diff --git a/doc/snapraid_log.d b/doc/snapraid_log.d index 50ccc938..585dba16 100644 --- a/doc/snapraid_log.d +++ b/doc/snapraid_log.d @@ -340,11 +340,13 @@ Thermal Tags - The calculated ambient temperature in degrees Celsius. - =thermal:current::: + =thermal:current:[/]:: Logs the most recent temperature reading for a specific disk device. - - The configured name of the disk. + [/] - The configured name of the disk. + In case of multiple splits, the splits after the first + one have an extension `/N`, where N starts from 1. - The unique device ID (uint64). - The current temperature read from the disk in degrees Celsius. @@ -356,12 +358,11 @@ Thermal Tags - The highest temperature observed in degrees Celsius. - =thermal:heat:::: + =thermal:heat:[/]::: Logs the entire history of temperature data points collected so far for a specific disk, used for fitting the heating model. Only monotone increasing temperatures are included in the history. - - The configured name of the disk. - The unique device ID (uint64). - The total number of collected data points (uint). - A comma-separated list of temperature/time pairs. @@ -370,14 +371,13 @@ Thermal Tags - Time offset from the start of the thermal monitoring (uint, seconds). - =thermal:params:::::::: + =thermal:params:[/]::::::: Logs the estimated parameters for the exponential heating model (fit using least squares) and associated quality metrics for a specific disk. The model is: T(t) = T_steady - (T_steady - T_0) e^(-kt), where T_0 is the initial temperature. - - The configured name of the disk. - The unique device ID (uint64). - The heating rate constant, k (double). - The ambient temperature, T_ambient (double). @@ -926,28 +926,30 @@ Command Smart Tags Tags logging specific disk identification and raw SMART attribute values. - =smart:: + =smart::[/] Logs the start of the SMART report for a device. - The file path of the device (e.g., /dev/sdb). - - The configured name of the disk. + [/] - The configured name of the disk. + In case of multiple splits, the splits after the first + one have an extension `/N`, where N starts from 1. - =attr:::serial: + =attr::[/]:serial: Logs the disk's serial number. - The disk's serial number (escaped). - =attr:::vendor: + =attr::[/]:vendor: Logs the disk's vendor string. - The disk's vendor identifier (escaped). - =attr:::model: + =attr::[/]:model: Logs the disk's model string. - The disk's model identifier (escaped). - =attr:::afr:: + =attr::[/]:afr:: Logs the estimated Annual Failure Rate (AFR) and the probability of one failure in the next year based on SMART attributes. The AFR is calculated using the maximum rate @@ -957,22 +959,22 @@ Command Smart Tags - The probability of one or more failures in the next year (double). - =attr:::size: + =attr::[/]:size: Logs the size of the disk. - The disk size in bytes (uint64). - =attr:::error: + =attr::[/]:error: Logs the total error count. - The total error count (uint64). - =attr:::rotationrate: + =attr::[/]:rotationrate: Logs the disk's rotation rate. A value of 0 indicates an SSD. - The rotation rate (uint64, RPM). - =attr:::flags:: + =attr::[/]:flags:: Logs the SMART status flags from the `smartctl` utility. Per the smartctl manpage, these flags are bit-mapped to indicate specific issues like "Command line did not parse", @@ -982,7 +984,7 @@ Command Smart Tags - The raw flags value (uint64, decimal). - The raw flags value (uint64, hexadecimal). - =attr::::: + =attr::[/]::: Logs the raw value of any assigned SMART attribute. - The SMART attribute ID (uint). @@ -1007,29 +1009,31 @@ Device Status Tags (spin-up), `down` (spin-down), and `probe` (power state check) commands. - =device:::active + =device::[/]:active Logs that the device was confirmed to be in an active power state after a status probe. - The system path to the device node. - - The SnapRAID internal disk disk_name. + [/] - The configured name of the disk. + In case of multiple splits, the splits after the first + one have an extension `/N`, where N starts from 1. - =device:::standby + =device::[/]:standby Logs that the device was confirmed to be in a standby/spun-down state. - =device:::up + =device::[/]:up Logs a successful spin-up operation via direct O_DIRECT read. - =device:::down + =device::[/]:down Logs a successful spin-down operation initiated via the smartctl command. - =device:::shell + =device::[/]:shell Logs a failure in the command shell execution environment. - =device:::error: + =device::[/]:error: Logs a low-level system error during direct file operations. This is triggered when open(), read(), or close() calls fail during a spin-up attempt. @@ -1037,12 +1041,12 @@ Device Status Tags - The standard integer error number provided by the OS. - =device:::error:abort + =device::[/]:error:abort Logs that an external process (smartctl) failed to complete normally, such as being terminated by a signal rather than exiting. - =device:::exit: + =device::[/]:exit: Logs that the external command (smartctl) returned a non-zero exit code that was not explicitly recognized as a valid state. diff --git a/doc/snapraid_log.txt b/doc/snapraid_log.txt index c1772484..9ac09fcd 100644 --- a/doc/snapraid_log.txt +++ b/doc/snapraid_log.txt @@ -358,11 +358,13 @@ disk access. - The calculated ambient temperature in degrees Celsius. - thermal:current::: + thermal:current:[/]:: Logs the most recent temperature reading for a specific disk device. - - The configured name of the disk. + [/] - The configured name of the disk. + In case of multiple splits, the splits after the first + one have an extension `/N`, where N starts from 1. - The unique device ID (uint64). - The current temperature read from the disk in degrees Celsius. @@ -374,12 +376,11 @@ disk access. - The highest temperature observed in degrees Celsius. - thermal:heat:::: + thermal:heat:[/]::: Logs the entire history of temperature data points collected so far for a specific disk, used for fitting the heating model. Only monotone increasing temperatures are included in the history. - - The configured name of the disk. - The unique device ID (uint64). - The total number of collected data points (uint). - A comma-separated list of temperature/time pairs. @@ -388,14 +389,13 @@ disk access. - Time offset from the start of the thermal monitoring (uint, seconds). - thermal:params:::::::: + thermal:params:[/]::::::: Logs the estimated parameters for the exponential heating model (fit using least squares) and associated quality metrics for a specific disk. The model is: T(t) = T_steady - (T_steady - T_0) e^(-kt), where T_0 is the initial temperature. - - The configured name of the disk. - The unique device ID (uint64). - The heating rate constant, k (double). - The ambient temperature, T_ambient (double). @@ -968,28 +968,30 @@ you'll see multiple tags for the same `` but with different Tags logging specific disk identification and raw SMART attribute values. - smart:: + smart::[/] Logs the start of the SMART report for a device. - The file path of the device (e.g., /dev/sdb). - - The configured name of the disk. + [/] - The configured name of the disk. + In case of multiple splits, the splits after the first + one have an extension `/N`, where N starts from 1. - attr:::serial: + attr::[/]:serial: Logs the disk's serial number. - The disk's serial number (escaped). - attr:::vendor: + attr::[/]:vendor: Logs the disk's vendor string. - The disk's vendor identifier (escaped). - attr:::model: + attr::[/]:model: Logs the disk's model string. - The disk's model identifier (escaped). - attr:::afr:: + attr::[/]:afr:: Logs the estimated Annual Failure Rate (AFR) and the probability of one failure in the next year based on SMART attributes. The AFR is calculated using the maximum rate @@ -999,22 +1001,22 @@ values. - The probability of one or more failures in the next year (double). - attr:::size: + attr::[/]:size: Logs the size of the disk. - The disk size in bytes (uint64). - attr:::error: + attr::[/]:error: Logs the total error count. - The total error count (uint64). - attr:::rotationrate: + attr::[/]:rotationrate: Logs the disk's rotation rate. A value of 0 indicates an SSD. - The rotation rate (uint64, RPM). - attr:::flags:: + attr::[/]:flags:: Logs the SMART status flags from the `smartctl` utility. Per the smartctl manpage, these flags are bit-mapped to indicate specific issues like "Command line did not parse", @@ -1024,7 +1026,7 @@ values. - The raw flags value (uint64, decimal). - The raw flags value (uint64, hexadecimal). - attr::::: + attr::[/]::: Logs the raw value of any assigned SMART attribute. - The SMART attribute ID (uint). @@ -1052,29 +1054,31 @@ command execution. They are primarily output during the `up` (spin-up), `down` (spin-down), and `probe` (power state check) commands. - device:::active + device::[/]:active Logs that the device was confirmed to be in an active power state after a status probe. - The system path to the device node. - - The SnapRAID internal disk disk_name. + [/] - The configured name of the disk. + In case of multiple splits, the splits after the first + one have an extension `/N`, where N starts from 1. - device:::standby + device::[/]:standby Logs that the device was confirmed to be in a standby/spun-down state. - device:::up + device::[/]:up Logs a successful spin-up operation via direct O_DIRECT read. - device:::down + device::[/]:down Logs a successful spin-down operation initiated via the smartctl command. - device:::shell + device::[/]:shell Logs a failure in the command shell execution environment. - device:::error: + device::[/]:error: Logs a low-level system error during direct file operations. This is triggered when open(), read(), or close() calls fail during a spin-up attempt. @@ -1082,12 +1086,12 @@ commands. - The standard integer error number provided by the OS. - device:::error:abort + device::[/]:error:abort Logs that an external process (smartctl) failed to complete normally, such as being terminated by a signal rather than exiting. - device:::exit: + device::[/]:exit: Logs that the external command (smartctl) returned a non-zero exit code that was not explicitly recognized as a valid state.