Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package snapraid for openSUSE:Factory checked in at 2026-10-28 17:48:51 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/snapraid (Old) and /work/SRC/openSUSE:Factory/.snapraid.new.2252680 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "snapraid" Wed Oct 28 17:48:51 2026 rev:14 rq:1393292 version:15.1 Changes: -------- --- /work/SRC/openSUSE:Factory/snapraid/snapraid.changes 2026-10-21 20:53:48.978712807 +0200 +++ /work/SRC/openSUSE:Factory/.snapraid.new.2252680/snapraid.changes 2026-10-28 17:48:58.879173113 +0100 @@ -1,0 +2,17 @@ +Wed Oct 28 07:32:46 UTC 2026 - Paolo Stivanin <[email protected]> + +- Update to 15.1: + * 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' + is used before the first sync when no content file exists yet. + Also ensure that commands that can save the content file ('touch', + 'scrub', 'rehash', 'rewrite') fail with a clear error message if the + array has not been synced yet. This fix is required by + SnapRAID-Daemon. + * Make test and doc variables in Makefile.am compatible with BSD make, + allowing builds, tests, and documentation generation on BSD systems + without requiring GNU make. + +------------------------------------------------------------------- Old: ---- snapraid-15.0.tar.gz New: ---- snapraid-15.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ snapraid.spec ++++++ --- /var/tmp/diff_new_pack.Sm5WqM/_old 2026-10-28 17:49:00.305232771 +0100 +++ /var/tmp/diff_new_pack.Sm5WqM/_new 2026-10-28 17:49:00.306232813 +0100 @@ -17,7 +17,7 @@ Name: snapraid -Version: 15.0 +Version: 15.1 Release: 0 Summary: Disk array backup for many large rarely-changed files License: GPL-3.0-or-later ++++++ snapraid-15.0.tar.gz -> snapraid-15.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapraid-15.0/.version new/snapraid-15.1/.version --- old/snapraid-15.0/.version 2026-10-16 00:03:58.000000000 +0200 +++ new/snapraid-15.1/.version 2026-10-22 21:48:34.000000000 +0200 @@ -1 +1 @@ -15.0 \ No newline at end of file +15.1 \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapraid-15.0/HISTORY new/snapraid-15.1/HISTORY --- old/snapraid-15.0/HISTORY 2026-10-01 19:09:57.000000000 +0200 +++ new/snapraid-15.1/HISTORY 2026-10-22 21:39:18.000000000 +0200 @@ -1,8 +1,23 @@ SnapRAID HISTORY ================ -15.0 (Work in Progress) -======================= +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' + is used before the first sync when no content file exists yet. + Also ensure that commands that can save the content file ('touch', + 'scrub', 'rehash', 'rewrite') fail with a clear error message if the + array has not been synced yet. This fix is required by + SnapRAID-Daemon. + * Make test and doc variables in Makefile.am compatible with BSD make, + allowing builds, tests, and documentation generation on BSD systems + without requiring GNU make. + +15.0 2026/10 +============ * Added support for automated filesystem snapshots to ensure data consistency and improve recovery reliability. When the 'snapshot' option is enabled, SnapRAID transparently manages diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapraid-15.0/Makefile.am new/snapraid-15.1/Makefile.am --- old/snapraid-15.0/Makefile.am 2026-10-08 13:16:29.000000000 +0200 +++ new/snapraid-15.1/Makefile.am 2026-10-18 22:29:14.000000000 +0200 @@ -228,13 +228,28 @@ LANG_CODES = de es fr it ja ko pl pt ro ru sv uk zh -LIST_D = doc/snapraid.d doc/snapraid_log.d $(patsubst %, doc/snapraid-%.d, $(LANG_CODES)) +LIST_LANG_D = \ + doc/snapraid-de.d \ + doc/snapraid-es.d \ + doc/snapraid-fr.d \ + doc/snapraid-it.d \ + doc/snapraid-ja.d \ + doc/snapraid-ko.d \ + doc/snapraid-pl.d \ + doc/snapraid-pt.d \ + doc/snapraid-ro.d \ + doc/snapraid-ru.d \ + doc/snapraid-sv.d \ + doc/snapraid-uk.d \ + doc/snapraid-zh.d -LIST_MAN = doc/snapraid.1 doc/snapraid_log.1 $(patsubst %, doc/snapraid-%.1, $(LANG_CODES)) +LIST_D = doc/snapraid.d doc/snapraid_log.d $(LIST_LANG_D) -LIST_TXT = doc/snapraid.txt doc/snapraid_log.txt $(patsubst %, doc/snapraid-%.txt, $(LANG_CODES)) +LIST_MAN = $(LIST_D:.d=.1) -LIST_XML = doc/snapraid.xml doc/snapraid_log.xml $(patsubst %, doc/snapraid-%.xml, $(LANG_CODES)) +LIST_TXT = $(LIST_D:.d=.txt) + +LIST_XML = $(LIST_D:.d=.xml) EXTRA_DIST = \ autogen.sh autover.sh valgrind.supp \ @@ -385,8 +400,13 @@ CHECKCOUNT_DEFAULT = 500 endif # HAVE_POSIX -CHECKCOUNT = $(if $(filter 1,$(SHORTCHECK)),500,$(CHECKCOUNT_DEFAULT)) -CHECKSIZE = $(if $(filter 1,$(SHORTCHECK)),100,4000) +CHECKCOUNT_0 = $(CHECKCOUNT_DEFAULT) +CHECKCOUNT_1 = 500 +CHECKCOUNT = $(CHECKCOUNT_$(SHORTCHECK)) + +CHECKSIZE_0 = 4000 +CHECKSIZE_1 = 100 +CHECKSIZE = $(CHECKSIZE_$(SHORTCHECK)) CONF = $(srcdir)/test/test-par6.conf THERMAL = $(srcdir)/test/test-par6-thermal.conf diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapraid-15.0/Makefile.in new/snapraid-15.1/Makefile.in --- old/snapraid-15.0/Makefile.in 2026-10-16 00:02:29.000000000 +0200 +++ new/snapraid-15.1/Makefile.in 2026-10-22 21:47:05.000000000 +0200 @@ -590,10 +590,25 @@ $(srcdir)/os/unix.h LANG_CODES = de es fr it ja ko pl pt ro ru sv uk zh -LIST_D = doc/snapraid.d doc/snapraid_log.d $(patsubst %, doc/snapraid-%.d, $(LANG_CODES)) -LIST_MAN = doc/snapraid.1 doc/snapraid_log.1 $(patsubst %, doc/snapraid-%.1, $(LANG_CODES)) -LIST_TXT = doc/snapraid.txt doc/snapraid_log.txt $(patsubst %, doc/snapraid-%.txt, $(LANG_CODES)) -LIST_XML = doc/snapraid.xml doc/snapraid_log.xml $(patsubst %, doc/snapraid-%.xml, $(LANG_CODES)) +LIST_LANG_D = \ + doc/snapraid-de.d \ + doc/snapraid-es.d \ + doc/snapraid-fr.d \ + doc/snapraid-it.d \ + doc/snapraid-ja.d \ + doc/snapraid-ko.d \ + doc/snapraid-pl.d \ + doc/snapraid-pt.d \ + doc/snapraid-ro.d \ + doc/snapraid-ru.d \ + doc/snapraid-sv.d \ + doc/snapraid-uk.d \ + doc/snapraid-zh.d + +LIST_D = doc/snapraid.d doc/snapraid_log.d $(LIST_LANG_D) +LIST_MAN = $(LIST_D:.d=.1) +LIST_TXT = $(LIST_D:.d=.txt) +LIST_XML = $(LIST_D:.d=.xml) EXTRA_DIST = \ autogen.sh autover.sh valgrind.supp \ README AUTHORS HISTORY INSTALL BLUEBOX TODO CHECK INSTALL.windows \ @@ -687,8 +702,12 @@ # Number of files to create @HAVE_POSIX_TRUE@CHECKCOUNT_DEFAULT = 1000 -CHECKCOUNT = $(if $(filter 1,$(SHORTCHECK)),500,$(CHECKCOUNT_DEFAULT)) -CHECKSIZE = $(if $(filter 1,$(SHORTCHECK)),100,4000) +CHECKCOUNT_0 = $(CHECKCOUNT_DEFAULT) +CHECKCOUNT_1 = 500 +CHECKCOUNT = $(CHECKCOUNT_$(SHORTCHECK)) +CHECKSIZE_0 = 4000 +CHECKSIZE_1 = 100 +CHECKSIZE = $(CHECKSIZE_$(SHORTCHECK)) CONF = $(srcdir)/test/test-par6.conf THERMAL = $(srcdir)/test/test-par6-thermal.conf HOLE = $(srcdir)/test/test-par6-hole.conf diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapraid-15.0/TODO new/snapraid-15.1/TODO --- old/snapraid-15.0/TODO 2026-09-30 08:59:23.000000000 +0200 +++ new/snapraid-15.1/TODO 2026-10-18 22:19:53.000000000 +0200 @@ -6,19 +6,23 @@ 16.x Releases ============= -* Use statx() instead of lstat() when scanning directories. +* Support a `[power_control: off]` tag in `smartctl` options to disable power + management (`up` and `down`) on specific disks (e.g. for SAS drives that + fail to wake up on write). Emit an attribute tag in probe for snapraid-daemon. + +* Enable MuseAir and disable random seed * Add a new 'restore' command, similar to 'fix', that recovers a whole disk using the same multithreaded approach as sync/scrub. +* Use statx() instead of lstat() when scanning directories. + * Integration with MergerFS ? * Restore ownership and permissions, at least in Unix. * Restore directory timestamps. -* Enable MuseAir and disable random seed - * Check Reliability Test. We can derive Failure probability from MBTF https://github.com/linuxhw/SMART https://github.com/linuxhw/EnterpriseDrive diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapraid-15.0/cmdline/snapraid.c new/snapraid-15.1/cmdline/snapraid.c --- old/snapraid-15.0/cmdline/snapraid.c 2026-10-07 09:04:46.000000000 +0200 +++ new/snapraid-15.1/cmdline/snapraid.c 2026-10-18 11:07:27.000000000 +0200 @@ -1530,7 +1530,8 @@ if (state.opt.force_realloc) state_locate_mark_tail_blocks_for_resync(&state, opt.parity_tail); - if (opt.gui_touch_before) { + /* skip touch itself until content is loaded and sync has initialized parity sizes */ + if (opt.gui_touch_before && state_is_write_ready(&state)) { ret = state_touch(&state); /* save the new state if required */ @@ -1627,6 +1628,9 @@ } else if (operation == OPERATION_REHASH) { state_read(&state); + /* prevent saving content with uninitialized parity split sizes */ + state_require_write_ready(&state); + state_rehash(&state); /* @@ -1645,6 +1649,9 @@ } else if (operation == OPERATION_SCRUB) { state_read(&state); + /* prevent saving content with uninitialized parity split sizes */ + state_require_write_ready(&state); + /* refresh the size info before the content write */ state_refresh(&state); @@ -1667,6 +1674,9 @@ } else if (operation == OPERATION_REWRITE) { state_read(&state); + /* prevent saving content with uninitialized parity split sizes */ + state_require_write_ready(&state); + /* intercept signals while operating */ os_signal_init(app_signal_handler, app_signal_handler); @@ -1682,6 +1692,9 @@ } else if (operation == OPERATION_TOUCH) { state_read(&state); + /* prevent saving content with uninitialized parity split sizes */ + state_require_write_ready(&state); + memory(); ret = state_touch(&state); @@ -1696,6 +1709,7 @@ */ os_signal_init(app_signal_handler, app_signal_handler); + /* save the new state if required */ if (state.need_write) state_write(&state); } else if (operation == OPERATION_SPINUP) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapraid-15.0/cmdline/state.c new/snapraid-15.1/cmdline/state.c --- old/snapraid-15.0/cmdline/state.c 2026-10-07 09:04:46.000000000 +0200 +++ new/snapraid-15.1/cmdline/state.c 2026-10-18 11:14:39.000000000 +0200 @@ -171,7 +171,6 @@ state->autosave = 0; state->need_write = 0; state->written = 0; - state->checked_read = 0; state->block_size = 256 * KIBI; /* default 256 KiB */ state->raid_mode = RAID_MODE_CAUCHY_RAID; state->file_mode = ADVISE_DEFAULT; @@ -5423,9 +5422,37 @@ log_tag("content_info:read_unixtime:%" PRId64 "\n", (int64_t)st.st_mtime); } log_flush(); +} + +/** + * Check if all configured parity splits have persistent sizes. + */ +int state_is_write_ready(struct snapraid_state* state) +{ + unsigned l, s; - /* mark that we read the content file, and it passed all the checks */ - state->checked_read = 1; + for (l = 0; l < state->level; ++l) { + for (s = 0; s < state->parity[l].split_mac; ++s) { + if (state->parity[l].split_map[s].size == PARITY_SIZE_INVALID) + return 0; + } + } + + return 1; +} + +/** + * Require sync to initialize parity sizes before commands that can save content. + * Check before modifying timestamps or metadata, as a later write could fail + * even if the command has no blocks to process (e.g. a missing content replica). + */ +void state_require_write_ready(struct snapraid_state* state) +{ + if (!state_is_write_ready(state)) { + log_fatal(EUSER, "The array has not been synced yet, or its parity configuration has changed.\n"); + log_fatal(EUSER, "Run 'snapraid sync' before '%s'.\n", state->command); + exit(EXIT_FAILURE); + } } struct state_verify_thread_context { @@ -5936,7 +5963,6 @@ log_flush(); state->need_write = 0; /* no write needed anymore */ - state->checked_read = 0; /* what we wrote is not checked in read */ state->written = 1; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapraid-15.0/cmdline/state.h new/snapraid-15.1/cmdline/state.h --- old/snapraid-15.0/cmdline/state.h 2026-10-15 15:35:31.000000000 +0200 +++ new/snapraid-15.1/cmdline/state.h 2026-10-18 11:14:39.000000000 +0200 @@ -130,7 +130,6 @@ uint64_t autosave; /**< Autosave after the specified amount of data. 0 to disable. */ int need_write; /**< If the state is changed. */ int written; /**< If the state was written at least one time */ - int checked_read; /**< If the state was read and checked. */ uint32_t block_size; /**< Block size in bytes. */ unsigned raid_mode; /**< Raid mode to use. RAID_MODE_DEFAULT or RAID_MODE_ALTERNATE. */ int file_mode; /**< File access mode. Combination of ADVISE_* flags. */ @@ -241,6 +240,16 @@ void state_read(struct snapraid_state* state); /** + * Check if all configured parity splits have persistent sizes. + */ +int state_is_write_ready(struct snapraid_state* state); + +/** + * Require initialized parity split sizes before commands that can save content. + */ +void state_require_write_ready(struct snapraid_state* state); + +/** * Count the number of unsynced parity positions using an event sweep across extents. * Counts positions in [blockmin, blockmax). The caller must ensure that the disk list, * extent trees, and block states remain unchanged for the duration of the call. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapraid-15.0/cmdline/unixapp.c new/snapraid-15.1/cmdline/unixapp.c --- old/snapraid-15.0/cmdline/unixapp.c 2026-10-07 09:04:46.000000000 +0200 +++ new/snapraid-15.1/cmdline/unixapp.c 2026-10-22 21:32:09.000000000 +0200 @@ -4447,6 +4447,7 @@ { #if HAVE_LINUX_DEVICE char path[PATH_MAX]; + char boot_id[64]; DIR* d = opendir("/sys/block"); if (!d) { /* LCOV_EXCL_START */ @@ -4454,6 +4455,22 @@ /* 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; while (1) { char buf[256]; @@ -4517,6 +4534,20 @@ if (sysattr(path, buf, sizeof(buf)) == 0 && buf[0] != 0) { 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); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapraid-15.0/configure new/snapraid-15.1/configure --- old/snapraid-15.0/configure 2026-10-16 00:02:28.000000000 +0200 +++ new/snapraid-15.1/configure 2026-10-22 21:47:04.000000000 +0200 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.72 for SnapRAID CLI 15.0. +# Generated by GNU Autoconf 2.72 for SnapRAID CLI 15.1. # # # Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, @@ -600,8 +600,8 @@ # Identity of this package. PACKAGE_NAME='SnapRAID CLI' PACKAGE_TARNAME='snapraid' -PACKAGE_VERSION='15.0' -PACKAGE_STRING='SnapRAID CLI 15.0' +PACKAGE_VERSION='15.1' +PACKAGE_STRING='SnapRAID CLI 15.1' PACKAGE_BUGREPORT='' PACKAGE_URL='https://www.snapraid.it' @@ -1353,7 +1353,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -'configure' configures SnapRAID CLI 15.0 to adapt to many kinds of systems. +'configure' configures SnapRAID CLI 15.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1425,7 +1425,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of SnapRAID CLI 15.0:";; + short | recursive ) echo "Configuration of SnapRAID CLI 15.1:";; esac cat <<\_ACEOF @@ -1559,7 +1559,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -SnapRAID CLI configure 15.0 +SnapRAID CLI configure 15.1 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. @@ -2145,7 +2145,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by SnapRAID CLI $as_me 15.0, which was +It was created by SnapRAID CLI $as_me 15.1, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw @@ -3563,7 +3563,7 @@ # Define the identity of the package. PACKAGE='snapraid' - VERSION='15.0' + VERSION='15.1' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -10210,7 +10210,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by SnapRAID CLI $as_me 15.0, which was +This file was extended by SnapRAID CLI $as_me 15.1, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -10279,7 +10279,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -SnapRAID CLI config.status 15.0 +SnapRAID CLI config.status 15.1 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\"
