Add best-effort Linux disk instance mappings using boot_id and diskseq
Some checks are pending
Build / build-mac (push) Waiting to run
Build / build-linux (push) Waiting to run
Build / build-arm32 (push) Waiting to run
Build / build-win (push) Waiting to run
Build / build-freebsd (push) Waiting to run
Build / build-musl (push) Waiting to run
CodeQL Advanced / Analyze (c-cpp) (push) Waiting to run
CodeQL Advanced / Analyze (actions) (push) Waiting to run

This commit is contained in:
Andrea Mazzoleni 2026-10-22 21:36:39 +02:00
parent 7275872c80
commit 4054832c7e
2 changed files with 34 additions and 0 deletions

View file

@ -3,6 +3,9 @@ SnapRAID HISTORY
15.1 2026/10 15.1 2026/10
============ ============
* Add synthetic device IDs on Linux, allowing SnapRAID Daemon to
preserve history for devices without unique hardware IDs while
they remain connected within the same boot.
* Fix a failed internal inconsistency check when '--gui-touch-before' * Fix a failed internal inconsistency check when '--gui-touch-before'
is used before the first sync when no content file exists yet. is used before the first sync when no content file exists yet.
Also ensure that commands that can save the content file ('touch', Also ensure that commands that can save the content file ('touch',

View file

@ -4447,6 +4447,7 @@ int devmap(void)
{ {
#if HAVE_LINUX_DEVICE #if HAVE_LINUX_DEVICE
char path[PATH_MAX]; char path[PATH_MAX];
char boot_id[64];
DIR* d = opendir("/sys/block"); DIR* d = opendir("/sys/block");
if (!d) { if (!d) {
/* LCOV_EXCL_START */ /* LCOV_EXCL_START */
@ -4454,6 +4455,22 @@ int devmap(void)
/* LCOV_EXCL_STOP */ /* LCOV_EXCL_STOP */
} }
/* optional boot identity: failure must not affect hardware mappings */
if (sysattr("/proc/sys/kernel/random/boot_id", boot_id, sizeof(boot_id)) != 0 || strlen(boot_id) != 36) {
boot_id[0] = 0;
} else {
for (unsigned i = 0; i < 36; ++i) {
if (i == 8 || i == 13 || i == 18 || i == 23) {
if (boot_id[i] == '-')
continue;
} else if (hexval(boot_id[i]) >= 0) {
continue;
}
boot_id[0] = 0;
break;
}
}
struct dirent* dd; struct dirent* dd;
while (1) { while (1) {
char buf[256]; char buf[256];
@ -4517,6 +4534,20 @@ int devmap(void)
if (sysattr(path, buf, sizeof(buf)) == 0 && buf[0] != 0) { if (sysattr(path, buf, sizeof(buf)) == 0 && buf[0] != 0) {
log_tag("map:/dev/%s:%s\n", dd->d_name, esc_tag(buf)); log_tag("map:/dev/%s:%s\n", dd->d_name, esc_tag(buf));
} }
/*
* This identifies the kernel device instance within one boot, not
* persistent hardware across reconnections. Missing attributes are optional.
*/
if (boot_id[0] != 0) {
pathprint(path, sizeof(path), "/sys/block/%s/diskseq", dd->d_name);
if (sysattr(path, buf, sizeof(buf)) == 0) {
char* end;
unsigned long long diskseq = strtonll(buf, &end, 10);
if (buf[0] >= '0' && buf[0] <= '9' && diskseq != 0 && end != buf && *end == 0)
log_tag("map:/dev/%s:linux-diskseq.%s.%llu\n", esc_tag(dd->d_name), esc_tag(boot_id), diskseq);
}
}
} }
closedir(d); closedir(d);