~jorge/snapraid/upstream

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
SnapRAID HISTORY
================

11.4 2019/05
============
 * In fixing, if a parity is filtered out, don't attempt to recover its size,
   and proceed without it if missing.
 * Avoid unnecessary parity read when fixing the parity itself.
   This improves the 'fix' speed when a parity file is completely missing.
 * Removed a build warning about major/minor defined now in sys/sysmacros.h.

11.3 2018/11
============
 * Fixed handing of Linux devices that have multiple slaves. This affects
   the smart/list/devices/down commands [Valentin Hilbig].
 * The 'list' command in verbose mode prints the full nanosecond
   timestamp precision.
 * After writing content files also sync their directory.
 * Fix a invalid time computation that could result in future scrub dates.
   Such dates are fixed automatically at the next scrub or sync.

11.2 2017/12
============
 * Fixed recognition of NTFS hardlinks. They behave differently than
   standard Unix hardlinks and this could result in SnapRAID reporting
   internal inconsistency errors for detecting links to the same file
   with different metadata attributes.
 * More efficient 'pool' command that updates only the links
   that need to be updated. This ensures that no change is
   done, avoiding to trigger a directory rescan of other programs.
 * In Linux use by default the advise "discard" mode instead of "flush".
   This avoids to swap-out the other process memory, leaving the system
   more responsive.
 * Changed the fallocate() use to work better with Btrfs with parity disks.
 * Changed the --test-io-stats screen to print the file name in process
   for each disk.

11.1 2017/05
============
 * Fixed the check command to correctly ignore errors on unused parity.
   This was broken in version 9.0.
 * Allow increasing the number of parity splits of existing parity.
 * Fixed quoting when printing in Linux. This fixes the UTF-8 screen
   output. Windows version was not affected.
 * Fixed recognition of 'hashsize' in the configuration file.
   The previous incorrect 'hash_size' is still supported for backward
   compatibility.
 * Fixed building in platforms that don't provide major/minor definitions
   in sys/types.h.
 * When creating 'pool' symbolic links, set their time as the linked files.
 * Added support for the Windows 10 symbolic link unprivileged creation,
   using SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE.
 * Windows binaries built with gcc 4.9.4 using the MXE cross compiler at
   commit ae56efa2b23a793b0146508bfef33027cdb09fd2 with targets
   i686-w64-mingw32 and x86_64-w64-mingw32 and optimization -O2.

11.0 2016/11
============
 * Added support for splitting the parity in multiple partitions. You
   can now specify multiple files for a single parity. As soon a file
   cannot grow anymore, the next one starts growing.
   In the configuration file, just put more files in the same 'parity'
   line, separated by , (comma).
   Note that if this feature is used, the saved content file won't be
   read by older SnapRAID versions.
   In Windows, 256 MB are left free in each disk to avoid the warning
   about full disks.
 * Added a new 'hashsize' configuration option. It could be useful in
   systems with low memory, to reduce the memory usage.
   Note that if this feature is used, the saved content file won't be
   read by older SnapRAID versions.
 * In Linux added the missing support for Btrfs file-systems. Note that
   to have full support you need also the 'libblkid' library, otherwise
   you won't get the UUIDs.
 * In screen messages don't print the disk directory in file path. You
   can control the format with the test option:
   --test-fmt file|disk|path.
 * In Windows allows to use the escape char '^' to handle file patterns
   containing real characters matching the globbing '*?[]' ones. In Unix
   it was already possible to do the same escaping with '\'.
 * Added a new -R, --force-realloc option to reallocate all the
   parity information keeping the precomputed hash.
   This is the previous -F, --force-full that instead now maintains the
   same parity organization and just recomputes it.
 * Added test options for selecting the file advise mode to use:
   --test-io-advise-none for standard mode
   --test-io-advise-sequential advise sequential access (Linux/Windows)
   --test-io-advise-flush flush cache after every operation (Linux)
   --test-io-advise-flush-window flush cache every 8 MB (Linux)
   --test-io-advise-discard discard cache after every operation (Linux)
   --test-io-advise-discard-window discard cache every 8 MB (Linux)
   --test-io-advise-direct use direct/unbuffered mode (Linux/Windows)
   The new default mode is 'flush' in Linux (before it was 'sequential'),
   and 'sequential' in Windows (like before).
 * For Seagate SMR (Shingled Magnetic Recording) ignore the SMART
   attribute Command_Timeout 188 as not reliable.
 * Fixed running in Windows platforms that miss the RtlGenRandom()
   function.
 * Added the --test-io-cache=1 option to disable the multi-thread IO
   mode.

10.0 2016/02
============
 * Boosts the speed of the 'sync' and 'scrub' commands with a new
   multi-thread implementation. It uses one thread for each disk,
   dedicated exclusively to read-ahead data and parity and to
   write-behind parity. This maximizes the data throughput keeping
   disks always busy.
   You can control the number of blocks to cache with the option
   --test-io-cache=NUMBER, where the number is between 3 and 128.
   The default is 8 MiB of blocks.
   You can show run-time stats during the process with the
   --test-io-stats option. You will see a graph with the number of
   cached blocks, and a graph with the wait time percentage for all the
   disks and computations.
 * The -h, --pre-hash command, saves the content file only after having
   verified all the hashes. This allows recovering of moved files in
   case a silent error is found during the hash verification check.
 * Allows to use the -d, --filter-disk option in the 'up' and 'down'
   commands.
 * Allows to run the 'smart' command without a configuration file.
   In such case it operates on all the disks of the machine.
 * In the configuration file 'data' is now a synonymous of 'disk'.
 * Adds the 'touch' command intended to arbitrarily set all the zero
   sub-second timestamps. This improves the SnapRAID capabilities to
   identify files. The 'status' command recommends to run 'touch' if
   required.
 * Restores the functionality of the -D, --force-device option when used
   to workaround the use of the same disk for two logical data drives
   when running the 'fix' command.
 * Uses a correct shell quoting in the example commands that involve
   files.
 * The minimum Windows version supported is now Windows Vista. This is
   required to use the native Windows thread support for the new
   multi-thread implementation. If you need to run on Windows XP, you
   have to stick on SnapRAID 9.x.

9.3 2016/01
===========
 * Fixes an invalid assumption in the copy detection mechanism that
   could result in an internal inconsistency, and with the impossibility
   to run the 'sync' and 'diff' commands.
   This was triggered by a very specific pattern of identical files.
   At least three of them, with one already in the parity, and at a
   higher disk number than the others that should be instead new ones.
   This had no bad effect, if not preventing the 'sync' command to run.
   A workaround was to just run 'sync' one time with the -N,
   --force-nocopy option to disable the copy detection.
 * Restored the -O2 optimization option for Windows binaries, as -Og has
   a too big performance penality.

9.2 2016/01
===========
 * Fixes support for symlinks pointing to an empty target. Before they
   were only partially supported, and their presence could result in a
   content file not readable.
   This also disables multi-thread content write, as this was the issue
   we tried to detect with this feature, and it doesn't provide a
   performance advantage. Content verification is instead still multi
   thread.
 * Autorename disks using the matching UUID. To rename a disk you can
   now change directly the name in the configuration file, and run a
   'sync' command.
 * Improves the physical offset ordering for the Btrfs file-system,
   correctly detecting files that have not a physical offset, for
   whatever reason.
 * Adds UUID support to Btrfs file-systems. It's present only if the
   'libblkid' development library is available on the system.
   Usually this requires to install the libblkid-dev or libblkid-devel
   package.
 * Added a new --no-warnings option to disable some repetitive warnings
   that could be annoying to power users.
 * Improves the error reporting, printing a complete stack trace, that
   can be used to track down bugs more easily.
   For this reason the Windows binaries are now built with optimization
   option -Og, instead than -O2.

9.1 2015/11
===========
 * Fixes a bug when reading a content file with a deleted entry bigger
   than 4 GB. This was a regression introduced in version 9.0 that could
   result in the impossibility to read a valid content file, after a
   deletion of a file bigger than 4 GB in the array.
   If this happened to you, just upgrading to 9.1 fixes the issue, and
   it allows you to continue to work.
   Note that this bug only prevented to run 9.0, but your data was still
   protected and could have been recovered using the versions 8.1 or
   9.1.
 * In Windows disables the file zero check requiring the --force-zero
   option. This check is intended for possible case using ext3/4 in
   Linux, and there is no evidence that in Windows it's possible at all.
 * Windows binaries built with gcc 4.9.3 using the MXE cross compiler at
   commit 62bcdbee56e87c81f1faa105b8777a5879d4e2e with targets
   i686-w64-mingw32 and x86_64-w64-mingw32 and optimization -O2.

9.0 2015/11
===========
 * Fixes an invalid assumption that could happen when using the -e,
   --filter-error option with "fix" or "check".
   This was triggered by a very specific pattern of fragmented files
   and bad blocks combination, not so easy to reproduce.
   This had no bad effect, if not preventing the command to run.
 * Drastically reduces the memory usage. For each block, it now uses 17
   bytes of memory, instead of the previous 28 bytes (for 32 bit) or 36
   bytes (for 64 bit).
   This could result is a memory saving of up the 50%.
 * The -p, --plan option (old --percentage) can be used to define a
   scrub plan: "new", "bad" and "full".
   The "new" plan scrubs all the new synced  blocks not yet scrubbed.
   This allows to verify as early as possible that the written parity
   during sync is really correct. You can use the "status" command to
   show the amount blocks not yet scrubbed.
   The "bad" plan scrubs only bad blocks.
   The "full" plan scrubs all blocks.
 * The graph in the "status" command now show scrubbed blocks with '*',
   and synced, but not yet scrubbed, blocks with 'o'.
   Note that when upgrading from a previous version, all blocks are
   assumed scrubbed the first time.
 * Content files are now written asynchronously from different threads
   to avoid the unfortunate condition that a memory error affects all of
   them in the same way.
   After writing, they are read again to verify their CRC.
   This is done to ensure that they are really OK, even in the case of
   the worst possible silent errors.
 * Extends the -D, --force-device option to ignore more erroneous
   conditions in the 'fix' command, like inaccessible disks,  or disks
   sharing the same physical device.
 * Extends the -d, --filter-disk option to allow to filter also by
   parity disk.
 * Extends the -h, --pre-hash option to also verify moved and copied
   files into the array before running a 'sync'.
 * Updates 'best' RAID functions for recent Atom CPUs.
 * Validates filters specifications rejecting relative paths.

8.1 2015/05
===========
 * Fixes build issues in generic Unix platforms, including Mac OS X.
 * The "diff" command returns with error code 2 if a "sync" is required,
   to differentiate with the generic error code 1.
 * Reduces the effect of SMART attribute 193 on the failure probability
   to avoid some false positive reports.

8.0 2015/04
===========
 * Allows "sync" and "scrub" to continue after the first bunch of disk
   errors. Blocks with errors are marked as bad, and you can fix them
   with the "fix -e" command.
   The fix is expected to force the disk firmware to reallocate the
   bad sector, likely fixing the problem.
   You can control the number of allowed errors with the new
   -L, --error-limit option. The default is 100.
 * The -e, --filter-error option doesn't write anymore fixes to
   unsynced files. This helps in case you are running it on a not
   synced array, removing the risk to revert some files to an old state.
 * The -e, --filter-error option is now optimal and reads only the
   minimal amount of data necessary to fix the errors.
 * The "diff" command returns with an error code if a "sync" is
   required.
 * Adds new "smart" command to print a SMART report of the array.
 * Adds new "up" and "down" commands to spin up and down the disks of
   the array.
 * Adds new "devices" command to print the devices associations in the
   array.
 * Changes the log handling. If no log file is specified, all the
   warnings and not fatal errors messages goes to stderr. If a log file
   is specified, only fatal error messages are printed on the screen.
   You can control the amount of informative messages on stdout with
   the -q, --quiet and -v, --verbose options, that can be specified
   multiple times to be more quiet or verbose.
 * In the "status" command the "Wasted" column now shows a negative
   number for the amount of space that you can still waste without
   filling up the parity.
 * In the "status" and others commands we now use GB instead of GiB,
   when referring to disk space.
 * Renames the -s and -t options to -S and -B as they are intended to
   be manual only operations.
 * Windows binary built with gcc 4.8.1 using the MXE cross compiler
   2.23, with targets i686-w64-mingw32 and x86_64-w64-mingw32. Before
   the x86 target was i686-pc-mingw32.

7.1 2015/01
===========
 * In 'scrub' and 'sync' detects and reports Input/Output errors
   separately from generic file system errors.
 * In 'diff' doesn't print the "add" entry if a "copy" one is already
   printed.
 * Fixes build with old compilers in the x64 platforms [Leigh Phillips].
 * Fixes out-of-dir builds [Christoph Junghans].

7.0 2014/11
===========
 * In 'check' and 'fix' the array is scanned to find any moved files
   that could be used to recover missing data. Files are identified by
   time-stamp, and then they are recognized also if moved to a different
   disk. Note that even if there are false positive they are identified
   checking the hash, so they have not effect, besides making the
   process a little slower. To disable this new behavior you can use
   the -N, --force-nocopy option.
 * The -i, --import command now identifies files by time-stamp making it
   very fast in importing directories.
 * More detailed 'status' report with single disk stats and free space
   available.
 * A lot faster directory listing for Windows.
 * Adds AVX2 support to improve parity generation speed.
 * Prints the time spent waiting for each disk also in 'scrub'.
 * The CPU usage, speed and ETA estimations are now based on the last
   100 seconds rather than from the start.
 * Keeps track of the UUID of the parity disks to check them before
   operating.
 * Windows binary built with gcc 4.8.1 using the MXE cross compiler
   2.23.

6.4 2014/11
===========
 * Adds support for the new binary format of SnapRAID 7.0.
   This allows to downgrade from version 7.0 to 6.x or previous.

6.3 2014/7
==========
 * The -N, --force-nocopy option now also works if you used previously
   "sync" commands without it.
 * In 'sync' keeps stats about the amount of time spent waiting for each
   disk and what is spent in CPU computation.
 * Auto exclude the lock file.
 * A more precise counting of how may block to scrub. Now it's exact
   regardless the order of the blocks timing.
 * Don't prints the 'UUID set' message anymore because it's the normal
   condition for empty disks.
 * In Windows, if the disk doesn't support reading physical offsets,
   allows SnapRAID to continue anyway.
 * Added a new -F, --force-full option that forces a full sync reusing
   the hash data present in the content file.

6.2 2014/5
==========
 * Fixed the regression test when run as root.
 * Added a new heuristic to detect file copies. Now a file is assumed
   to be a copy if name, size and nanosecond time-stamp are matching,
   but if the nanosecond part of the time-stamp is 0, it requires
   the full path matching and not only the name.
 * Added the -N, --force-nocopy option to disable completely the copy
   detection. SnapRAID also suggests to use this option in the error
   message of a data mismatch if likely caused by the copy detection.

6.1 2014/4
==========
 * Fixed build and regression test in Mac OS X.

6.0 2014/3
==========
 * In "sync", even if a silent error is found, continue to update the
   parity if it's possible to correct the error.
   Note that the block will be marked bad, and the data will be fixed
   only at the next "fix -e" call.
   But any new data added will be protected if you are using enough
   parity to fix both the silent error and at least another potential
   error.
 * Detect copied files from one disk to another and reuse the already
   computed hash information to validate them in "sync".
   Files are assumed copied if they matches the name, size and
   time-stamp.
 * For "sync", added a new -h, --pre-hash option to run a preliminary
   hashing step for all the new files to ensure to detect silent errors
   caused by the heavy machine usage of the parity computation.
 * In "fix", if a previous fixing attempt was made resulting in a
   .unrecoverable file, uses this file as starting point for the
   new attempt.
 * In the log file name allows the use of the '>>', %D, %T modifiers
   to select append mode, and to insert the date and time in the name.
 * The options  -p, --percentage and -o, --older-than now keep their
   default value even if the other one is specified.
 * Moved the .lock file in the same dir of the first specified content
   file. This avoid to spin-up the parity disks in all commands.
 * The "diff", "list", "dup", "status" and "pool" commands don't access
   anymore the parity disks that can now stay powered down.
 * The default configuration file in Windows is now searched in the same
   directory where the snapraid.exe file resides.
 * New source code organization. The RAID engine is now an external
   component usable also in other projects.

5.3 2014/3
==========
 * Don't warn about UUID changed if it's for an empty disk.
 * Fixed the number of blocks that scrub has to process when
   selecting a high percentage of the array.
 * Removed duplicate recovery attempts in synced state.

5.2 2013/12
===========
 * If a disk changes UUID, automatically disable the inode
   recognition, because this is likely a new file-system with
   all the inodes reassigned, and we don't want to risk a false
   positive when searching for inode/time-stamp/size.
 * Allow to run a fix command with disks that doesn't need to be
   fixed mounted as read-only.
 * After a failed sync, always reallocates new files with a not
   yet computed parity to ensure to minimize the parity usage,
   if some other file is deleted in the meantime.
 * Doesn't count empty dirs as files in the diff counters.
 * Added a new "share" configuration option to allow to share
   in the network the pool directory also in Windows.
 * Fixed build problems in OpenBSD due the old assembler.
 * Fixed build problems in platforms different than x86.

5.1 2013/12
===========
 * Fixed a potential crash if a file is deleted during a "sync/scrub".
   This is a problem introduced in version 5.0 due new logging.
   If happened to you to have a crash in sync, you don't need to take
   any special action, just run "sync" again.
 * Restored the functionality of -C, --gen-conf command.
 * Prints the files with duplicate physical offset if the -v, --verbose
   option is specified.

5.0 2013/11
===========
 * Added support for up to six levels of parity.
 * Added a specific and faster triple parity format for CPUs that
   don't support SSSE3 instructions like ARM and AMD Phenom, Athlon
   and Opteron.
 * Faster RAID5 and RAID6 implementation for ARM 64 bit CPUs.
 * If a silent error is found during a "sync" command, directly marks
   the block as bad like in "scrub", without stopping the the "sync"
   process.
 * Sort files by inode when listing the directory. This improves
   the scanning performance.
 * For files with changes only in some blocks, updates the parity
   only for blocks that really are changed.
   This improves the performance in sync for modified files.
 * Added a new "list" command to see the stored list of files.
 * Removed the detailed list of errors from the screen output.
   To get it you must explicitly use the -l, --log option.
   It's now too detailed for the screen, because it contains a lot
   of info.
 * Changed the output format of some commands to make it similar
   at the new "list" one.
 * Reduced memory usage removing some unnecessary allocations.
 * Added a memory test on the memory buffers used in sync, scrub, check,
   fix before using them.

4.4 2013/10
===========
 * Relaxed the check about small parity files, to allow to recover after
   a failed sync before resizing the parity files.

4.3 2013/10
===========
 * Fixed the scrub command with the -p0 option. Now it really scrubs
   only the blocks marked as bad and not the full array.

4.2 2013/10
===========
 * Fixed the wrong warning about physical offsets not supported caused
   by files not having a real offset because too small.
   For example, in NTFS it's possible to store such files in the MFT.
   It's just a cosmetic change, and not a functional one.
 * Remove unexpected 'Restore' entries in the diff output when dealing
   with file-system without persistent inodes like NTFS in Linux.
 * Added support for filenames containing newlines. This happens in Mac
   OS X.

4.1 2013/9
==========
 * If the underline file-system doesn't support the FIEMAP command,
   automatically fall back to use FIBMAP for sorting files.
 * Fixed the import of content files from previous version of SnapRAID
   that are the result of an incomplete sync.
 * Added a new -C, --gen-conf option to generate a dummy configuration
   file from the info in the content file.
   Just in case that you lose everything, except the content file.
 * At the end of sync/scrub/check/fix prints "Everything OK" if no error
   was found. This should make clear that everything is really OK.

4.0 2013/9
==========
 * New 'scrub' command to periodically check the oldest blocks for
   silent errors without the need to scan the whole array.
 * New 'status' command to check the fragmentation, the last check time
   distribution, and the silent error status of the array.
 * Added the new Spooky hash. It's faster in 64 bit architectures.
   To convert you can use the new 'rehash' command.
 * Changed to a binary content file to improve speed and reduce size.
 * Removed the --find-by-name, -N option. Now it always searches
   by name if a file is not found searching by inode, automatically
   reassigning inodes in restored files without needing to sync
   again the file.
   This happens only if the file has the same path, size and timestamp
   at nanosecond precision.
 * Added a hash seed to make harder intentional collision attacks.
 * When inserting files for the first time, sort them by their physical
   address to improve read performance.
 * Optimized the cache use for the all the RAID computations.
   This improves a lot the RAID performance.
 * Better selection of the RAID6 implementation for different CPUs.
 * Added RAID5/RAID6 mmx and sse2 implementations with unrolling by 4.
   They are a little faster than the previous unroll by 2.
 * Added a lock file to avoid multiple running instances on the same
   array. The file is named as parity file adding the .lock extension.
   There is also the undocumented --test-skip-lock to avoid to check it.
 * Automatically ignores, with warning, mount points inside the array
   directory tree.
 * Changes the 'dup' output format to include the size of each duplicate
   file.

3.2 2013/7
==========
 * Fixed a directory creation problem in Windows when the "disk" option
   points to the root directory of a drive. Now SnapRAID won't complain
   about the inability to create such directory.
   If you encounter this problem when trying to recover your data, just
   upgrade to this version, and you'll be able to complete the
   recovering process.
   No need to upgrade for platforms different than Windows.

3.1 2013/5
==========
 * Direct use of Windows API for disk access to improve error reporting.
 * If the 'fix' process is aborted, it removes all the new files
   partially recovered, to allow to reuse again the -m, --filter-missing
   flag.
 * In Windows don't exclude anymore system files. Only system
   directories are excluded.
 * In Windows applies filters in case insensitive way.
 * The Windows binaries are now built with gcc 4.7.2.
 * Reduced memory occupation for hardlinks and directories.
 * In 'dup' don't list files with 0 size.

3.0 2013/3
==========
 * Added pooling support with the new 'pool' command. It creates a
   virtual view of the array using symbolic links pointing to the
   original files.
 * Added a new -m, --filter-missing option that allow to undelete files,
   without checking/fixing the others.
 * Added a new -i, --import option to automatically import deleted files
   when fixing.
 * Added a new -l, --log option to save to disk the detailed log.
 * Added support for hardlinks and empty directories.
 * Added support to save symlinks to files in Windows. Note that only
   the symlink is saved and not the linked file.
   Note that Windows Symlinks to dirs and junctions are still not
   supported.
 * Files without read permission generate an error instead of a warning.
   You now must explicitly exclude them in the configuration file with
   exclusion rules.
 * In 'check' and 'fix', if verbose is enabled, prints the result for
   each processed file.
 * Added an UUID check to detect when a disk is replaced, and to prevent
   unwanted disk swaps.

2.1 2013/1
==========
 * Checks for wrong empty fields in the configuration file.
 * Filter rules for files are not anymore applied to directories.

2.0 2012/12
===========
 * Added a new -a option to make the 'check' command to only check file
   hashes without checking the parity data.
 * Added a new -d option to filter by disk name.
 * The file modification time is now saved using nanosecond precision.
   This allows to restore the exact modification time in 'fix'.
   The new 'content' files written with this version are not backward
   compatible, but it's still possible to read the old format.
 * Fixed hard-links automatic exclusion. All the hardlinks after the
   first one are now correctly ignored.
 * If it isn't possible to grow a parity file, prints the list of files
   outside the maximum size allocated.
 * Autosave isn't triggered if we are near the end of the 'sync'
   process.
 * Before starting a 'sync', we wait for two seconds, to workaround the
   FAT limitation of having two seconds modification time precision.
   This a safe measure to be 100% sure to always detect file changes.
 * Always fill the memory after allocating it to avoid the OOM (Out Of
   Memory) killer in Linux.
 * Fixed compilation in Solaris/OpenIndiana for lacking both futimes()
   and futimens().
 * Now 'sync' ensures that the parity files are not too small to contain
   the just loaded data.
 * Removed the '-H,--filter-nohidden' option. It doesn't make sense to
   have it as command line option.
   You must use the 'nohidden' option in the configuration file.
 * When opening files in read-only mode, also specify the noatime flag,
   to avoid to update the file access time.
 * Exclude rules for files are now also applied to directories.
   This allows to excludes some file/directory without the need to call
   the stat() function on them.
 * The -N, --find-by-name option also ignores the nanosecond part of
   timestamps to work with copy programs not supporting nanoseconds.
 * Fixed deduplicated files handling in Windows Server 2012.
 * Removed MD5 support.

1.13 2012/11
============
 * Fixed a Segmentation Fault when checking/fixing if there are three
   or more errors in a specific block.

1.12 2012/9
===========
 * Fixed file renaming in Windows during a 'fix' command.
   This is only a Windows only issue, no reason to upgrade for other
   platforms.

1.11 2012/7
===========
 * Fixed again directories inclusion. Exclusion rules for directories
   were ignored.

1.10 2012/6
===========
 * Fixed directory inclusion, in case the last rule is an "include" one.
 * Fixed very long paths in Windows. We now always use the special '\\?'
   prefix to remove the 260 chars limitation.
 * If a file is excluded, it prints explicitly which attribute caused
   the exclusion.
 * Automatically excludes also the temporary copy of content file,
   the one with the ".tmp" extension.
 * Avoid Windows to go in automatic sleep mode when running.

1.9 2012/3
==========
 * Implemented a more sophisticated recovering in case a harddisk
   failure happens during a 'sync' command.
   When using RAID6 it improves the chances of recovering data with
   partially computed parity, after an aborted 'sync'.
 * Fixed the count of new files.
 * Added a new 'autosave' configuration option to save the intermediate
   'sync' state.
 * Supported file-systems with read requests returning less data than
   requested.
 * In Windows ensures that the disk serial number is not zero.

1.8 2012/1
==========
 * Added a new "dup" command to find all the duplicate files.
 * Added a new option "--filter-nohidden" to exclude hidden files.
 * Faster and parallel writing of content files.
 * The example configuration files now put the content files in the data
   disks instead than in the parity disks.
 * Added a checksum at the content file to ensure its integrity.
 * Using fallocate() instead posix_fallocate() to avoid the very slow
   posix_fallocate() fall back of writing the whole file.

1.7 2011/11
===========
 * If a file is modified or removed during a sync, the sync process
   doesn't stop anymore, but it will simply skip the file, resulting in
   an incomplete sync. Note that the sync will terminate with an error.
 * If the content file is placed in a data disk, it's automatically
   excluded from the sync process.
 * Increased by one the minimum number of content files. Before it was
   only a suggestion, but now it's a requirement because you are allowed
   to put content files in data disks.
 * Added checks to ensure that data and parity disks are different, and
   to correctly count the number of copies of "content" files in
   different disks.
 * Removed the dependency of the "disk" order specification in the
   configuration file. The used order is now saved in the content file
   to avoid to damage the dual parity in case the order is changed by
   the user. It easily allows to remove or add disks from the array when
   using a dual parity.
 * Improved the "fix" performance when a lot of files or the parity have
   to be recreated from scratch.
 * When getting unrecoverable errors, the printed log line now starts
   with "unrecoverable:" instead of "error:" to allow an easier
   identification.
 * Added a new option "--find-by-name" to allow to sync using only the
   file path and not the inode. This is useful to avoid long sync when
   you replace one disk with another copying manually the files.
 * If "fix" cannot recover a file, it's renamed adding the
   ".unrecoverable" extension.
 * Checking and fixing also empty files with size 0.

1.6 2011/9
==========
 * The content file is now saved also at the start of the "sync"
   command. This avoids parity errors if the sync process is aborted
   without saving the content file and you made changes at the disk
   array before another "sync" command was done.
   More specifically, deletions or truncations of not yet synced files
   after the aborted sync, and before the next sync command, may have
   damaged the parity data. New file additions were instead safe.
   If these conditions may have happened to you a "check" command (also
   with older version of the program) is recommended to ensure the
   correctness of your parity data.
 * The "diff" command now recognizes the reuse of inodes.
 * Windows hidden files are now saved like any other files.
 * Symbolic links are now saved in *nix. Not supported in Windows.
 * The "fix" command restores also the original modification time.
 * The message asking to use the --force-empty option now lists all the
   empty disks.

1.5 2011/7
==========
 * Ignores extra spaces in the configuration file.
 * Changed the output of check/fix to allow a more easy post-processing
   with other tools like awk and sort.
 * Added the hidden option -G/--gui to enable the output of progress
   information for a potential GUI for SnapRAID.
 * Added a new "diff" command to print the list of changes detected at
   file level.
 * Faster loading of content file. Approx three times faster.

1.4 2011/6
==========
 * Ignoring in sync System and Hidden files in Windows.
 * Files without read permission are ignored in sync.
 * If a file is ignored a warning message is printed. You have to
   exclude it to remove the warning.
 * In fixing, if a file cannot be written for missing permission, an
   error is reported only if a write is effectively required.
 * Ignores any symbolic links. They are not saved.

1.3 2011/5
==========
 * Fixed the restore of directory with unicode chars in Windows.
 * Fixed support of file names starting or ending with a space.
 * Removes files before inserting new ones to minimize the parity size.

1.2 2011/5
==========
 * Fixed use of file names out of the codepage in Windows. All the names
   are now stored in UTF8 in the content file.

1.1 2011/5
==========
 * Fixed a bug in the check command when detecting garbage data over the
   expected end of the file.
   The parity data was anyway computed correctly, and no special action
   is required to update.
 * Changed the default checksum to Murmur3 hash. It's a lot faster than
   MD5. You can check its speed with the "snapraid -T" command.
   MD5 is still supported for backward compatibility.
   To convert to the new Murmur3 hash, simply remove the 'content' file,
   and start a new complete 'sync'.
 * Added RAID6 support. It's used the very good RAID6 library made by H.
   Peter Anvin also used in the Linux Kernel. It contains optimized
   implementations for SSE2 and MMX.
 * Added support for multiple 'content' files. You can save extra copies
   to be able to verify the checksums also if you lose all the 'content'
   files in the parity disks.
 * Added a filtering include logic, where anything not explicitly
   included is excluded. For example, it allow to include only the files
   in a predefined set of directories.
 * The check command returns with an error code if any kind of error is
   present. Previously it was returning an error only if unrecoverable
   errors were present.
 * Opening the files in sequential mode in Windows. This should give a
   speedup in Windows.
 * In Windows you can use the backslash \ in the filter definitions
   instead of the forward slash /.

1.0 2011/4
==========
 * No relevant change.

0.4 2011/4
==========
 * Added hidden 'dry' command mainly for speed measurement.
 * As default, uses the OpenSSL crypto MD5 implementation.

0.3 2011/4
==========
 * Added --filter option to select a subset of file in check and fix.
 * Better ETA estimation in all the commands.
 * Added support for OpenSSL crypto library to use its optimized MD5
   implementation.
 * Added test vectors and a speed test for MD5.

0.2 2011/3
==========
 * Second public test release of SnapRAID.
 * Functionally complete in check and fix.
 * Files are identified by inode and not anymore by name.
 * Exclusion list of files and directories.
 * Precise error management.
 * More regression tests.

0.1 2011/3
==========
 * First public test release of SnapRAID.