UMSFUSE

Timeline
Login

Timeline

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

50 most recent check-ins

2026-11-12
23:29
UMSFUSE version 1.1.1 leaf check-in: 6c8abf6aca user: chungy tags: release, trunk, version-1.1.1
18:21
UMSFUSE version 1.1.0 check-in: 541a1ec04e user: chungy tags: release, trunk, version-1.1.0
18:00
Implement directory caching for umsfsck and likewise improve its performance massively. check-in: 4359e5e59a user: chungy tags: trunk
17:40
fsck_cache_test.sh: the large-tree timing checks take the best of up to three tries.

In 300 runs of the test, four at a time with the box short of memory, two runs that were running side by side measured 34 s of CPU time for -n on the upper-case tree (0.3 s on the lower-case one), within 0.1 s of each other; the other 298 measured at most 0.6 s, as did 100 more runs of that check alone. CPU time does not grow with a busy CPU, but it can when the kernel has to reclaim memory or reread directorie... closed check-in: 335dc03384 user: grok tags: fsck-perf

16:57
Merge trunk into fsck-perf.

Brings in the hard-link index of umsdosfs, the hlink_format_test fix and tests/clockshim.c.

  • doc/umsfuse.texi: the only conflict. Both sides added text after the directory cache section: this branch a paragraph saying umsfsck uses the same cache, trunk the Hard-link index section. Kept both, the paragraph first, so it stays in the directory cache section.
  • src/ums_dcache.c, src/umsdos.c, src/umsdos.h and tests/run_tests.sh merged without conflicts.
check-in: d27cb8b8e1 user: grok tags: fsck-perf
16:56
fsck_cache_test.sh: compare the trees without depending on the second each run happened to take, and time umsfsck by its CPU time.

The comparison of each run with the cache off against the same run with the cache on, at 4K and without the stat check masked only the ctime of an EMD record from the start of the runs on. A repair such as -y -s also stamps a record's atime (and some its mtime) with the time it ran, so two runs on either side of a second boundary gave records differing in one byte, ... check-in: d8e1603bcf user: grok tags: fsck-perf

16:12
umsfsck -n: the scratch copy reads each host directory's listing once, so host names that are not lower case no longer make it quadratic.

For every host name that is not all lower case (a FAT listing shows them upper case), the copy asked ums_host_alias whether the lower-case spelling was an alias, and ums_host_lookup read the whole host directory to answer; at the end of each directory, every record's host name was looked up the same way, to remember lookup errors for the check. The directory ... check-in: 2e054a3fc2 user: grok tags: fsck-perf

15:32
Document the directory cache in umsfsck.
  • Info manual, umsfsck: each directory read once and looked up in memory; the 128 MiB default; -n uses the cache only on its scratch copy, which remains the largest part of a dry run; what memory grows with; UMSFSCK_CACHE, UMSFSCK_CACHE_NOCHECK and UMSFSCK_CACHE_STATS.
  • Info manual, Directory cache: umsfsck uses the same cache.
  • umsfsck.8: UMSFSCK_CACHE under ENVIRONMENT.
check-in: fcaa675bbb user: grok tags: fsck-perf
15:32
umsfsck: UMSFSCK_CACHE_STATS, and a test of the cache.

UMSFSCK_CACHE_STATS=FILE appends the directory cache's counters to FILE at the end of the run, in the format umsdosfs uses for UMSDOSFS_CACHE_STATS.

New tests/fsck_cache_test.sh, run from run_tests.sh:

  • a tree made through the driver (long and short names, gaps, hard links in one and in several directories with three names, a symlink, a fifo, a read-only file), clean and with three sets of host-side damage (untracked and missing files...
check-in: f6d11b2b1b user: grok tags: fsck-perf
15:27
umsfsck: link count and visibility fixes read the record through the cache instead of a copy of the whole directory (work in progress on this branch). check-in: 50a65b67ff user: grok tags: fsck-perf
15:25
umsfsck -o: hash maps for the pointers per hidden file (collapse_singles), the renamed hidden files (fix_renamed_targets) and the host names that change (compact_dir), and their paths held by pointer; ums_alloc's first fit on a copy found on a map of the slots instead of sorting the records for each call (work in progress on this branch). check-in: d50e622b97 user: grok tags: fsck-perf
15:20
Remove -j$(nproc) from the README: while beneficial, it looks “weird” and encourages a copy-paste job. Plain single-threaded make doesn’t take too long anyhow. check-in: dc97da8e1f user: chungy tags: trunk
15:17
changes: document hard link index improvement check-in: aab64ae1da user: chungy tags: trunk
15:15
umsfsck -n: the cache is turned on after the scratch copy (it reads control files without O_NOATIME); the copy's lookups of names listed as they are skip the host lookup (work in progress on this branch). check-in: 78e58d555a user: grok tags: fsck-perf
15:14
umsfsck: a directory's duplicate names, used host names, name conflicts and subdirectory names are found through hash maps and a binary search, not by comparing every pair (work in progress on this branch). check-in: 0d6b61517d user: grok tags: fsck-perf
15:11
umsfsck: hidden link files found by host path through a sorted index, and the hard-link lists hold their strings by pointer (work in progress on this branch).

find_hid_by_host looked up the host name of every hidden file for each pointer (pointers times hidden files directory opens). The index is made once and again only after a change to the host, counted through ums_mod_before. The pointer, hidden file and collapse candidate lists kept three 4 KiB arrays per entry (some 300 MB for 20,000 smal... check-in: ed3ed6651f user: grok tags: fsck-perf

15:09
umsfsck: use the library's directory cache (work in progress on this branch).

Without the cache every ums_host_lookup reads the whole host directory, so checking a directory is quadratic in its size and every hard-link resolution rereads each directory on its path. umsfsck now turns the cache on (128 MiB) for the check, -o and the scratch copy of -n (dropped after the copy, whose directories are written past it). The one direct control-file write, -o's compaction, tells the cache through the ne... check-in: 7386c7b262 user: grok tags: fsck-perf

15:06
umsdosfs now has a hard link index cache, also producing massive performance improvements with large trees and large numbers of link relations. Intermittent test failures related to host time changing underneath the test have also been repaired. check-in: 8cc4092f3e user: chungy tags: trunk
08:41
hlink_format_test: fix two intermittent failures, both in the test. umstar and umsdosfs are unchanged.

"archives differ by format" (about 6% of runs on an idle machine, 4% pinned to one CPU): the three trees archived by umstar (new format, old format, old format with a link root) are made one after the other by separate mounts, with the clock's times. umstar records each record's mtime (ustar header) and its atime and ctime (pax records) in whole seconds, so when the trees were made on either s... closed check-in: 8ea66b04fc user: grok tags: hlink-format-flake

08:38
umsdosfs: a hard-link index, so the pointer upkeep no longer walks the whole tree. A second link to a linked file, removing the next-to-last name of a group, and renaming a directory or a hard-link name used to scan every directory and every pointer of the tree (normalize_links, collapse_last, fix_pointers, each through scan_ptrs) and then re-mirror the host times of every record (hsync_tree). With the directory cache on, they now work from an index of the pointers; -o umscache=0 turns it off al... closed check-in: b3e4966836 user: grok tags: hlink-index
07:47
umsdosfs now has a directory cache and has huge performance gains as a result. check-in: 2666f587e2 user: chungy tags: trunk
07:39
umsls displays listings in columns by default. check-in: 3d1b7b9aca user: chungy tags: trunk
07:21
umsls column tests: no result depends on the caller's terminal size or COLUMNS. script(1) gives its pseudo-terminal the size of the terminal it is run from, and the terminal's width comes before COLUMNS (as in ls), so in a wide terminal two umsls_columns_test cases used that width and failed: "terminal: columns down by default, COLUMNS honoured" and "terminal -m".
  • umsls_columns_test.sh: onterm now takes the pseudo-terminal width, sets it with stty cols N rows 24 before running the command,...
closed check-in: 35606d33fc user: grok tags: umsls-columns
07:17
umsdosfs: one malloc arena, and the tree is unlocked before the cache counters are written at unmount.

The reported umscache=0 regression on a flat directory of 20,000 files (ls -l 594 s cold, RSS 68 MiB, against trunk's 173 s and 20 MiB) does not come from the cache code: with umscache=0 every library entry point returns to trunk's code before touching the cache, and a gprof profile of ls -l over 8,000 files shows the same functions with the same call counts as trunk (128 million ums_parse/ums... closed check-in: 0a85145f93 user: grok tags: dircache

06:56
umsls: multi-column output like GNU ls. On a terminal entries are listed in columns sorted down, otherwise one per line; new options -x, -1, --format=WORD, -w/--width=COLS and -T/--tabsize=COLS. The layouts follow GNU ls 9.12 byte for byte.
  • Format: the last of -l, -n, -x, -1 and --format wins, except that -1 after -l stays long (as ls). --format takes vertical, across, horizontal, commas, single-column, long and verbose, or an unambiguous abbreviation. -C keeps its meaning in every UMSFUSE...
check-in: 2bf4639f20 user: grok tags: umsls-columns
05:55
umsfsck -n behaves better, not copying file data into the tmp directory, and deleting it following a process termination. check-in: 247294db6d user: chungy tags: trunk
05:32
fsck_scratch_test: fix two failures seen on other systems, and make umsfsck's prompt wait race-free.

"-n changed the tree": only directory access times differed. umsfsck -n did not move them (it reads the tree with O_NOATIME, as trunk does; neither moves any access time even on a strictatime tmpfs). The test itself did: while -n was held, it listed the tree with find, between the two snapshots. On relatime an access time not newer than the change time is updated, and tar leaves the two equal, s... closed check-in: 7e6deded6f user: grok tags: fsck-scratch

05:08
umsdosfs: a directory cache. Directories once read are kept in memory (decoded EMD records and the host listing, with hash indexes), so repeated lookups, getattr, access, readlink and readdir no longer read the host directory and the whole EMD again. New option -o umscache=SIZE (bytes, K/M/G suffixes, default 128M, 0 turns the cache off and keeps the previous behaviour).

Design (src/ums_dcache.c, src/ums_dcache.h):

  • One entry per host directory, keyed by (st_dev, st_ino) and held open with...
check-in: 5e73353a7e user: grok tags: dircache
04:25
umsfsck: -n's scratch copy holds only the file data umsfsck reads, and a signal (SIGINT, SIGTERM, SIGHUP) removes the scratch copy, or without -n stops between repairs.

Scratch copy (-n): every host name, type, mode, mtime and atime is copied as before, and now the owner too where the copy may set it (root, or a group of the caller's own), but data only for:

  • control files, whole;
  • host files whose record is a hard-link pointer or a symlink: the first 4096 bytes (pointers are read up t...
check-in: 62f3c3ce18 user: grok tags: fsck-scratch
2026-11-11
20:47
Replace “Suggested downloads” link with a direct link to the current version. check-in: e004f4512f user: chungy tags: trunk
2026-11-10
17:55
Add a small list of distributions that took advantage of UMSDOS, and a cautionary note about stability in > 2.4.21. check-in: cd37f7a983 user: chungy tags: trunk
07:27
UMSDOS version 1.0.0 check-in: 961d20ae32 user: chungy tags: release, trunk, version-1.0.0
07:21
Document link-root and old-hard-links in the Common Options check-in: 4908a7614e user: chungy tags: trunk
07:16
Replace the README with something more friendly. check-in: d0dce3c9b9 user: chungy tags: trunk
06:22
Fill out UMSDOS specification in Texinfo document. check-in: 5796705bba user: chungy tags: trunk
06:20
Make sure non-lowercase variants of the --LINUX-.--- file name are accepted. check-in: fef53d4492 user: chungy tags: trunk
06:14
emd_name_case_test: run in the C locale, so the umsls -m check does not depend on the caller's collation.

umsls sorts names with strcoll, as ls does, and the expected listing was written in C (byte) order. Under en_US.UTF-8 the collation ignores the punctuation and orders lower case before upper case, so the same six entries came out as --linuX-.---, --lInux-.---, --Linux-.---, --LiNuX-.---, --LINUX-.---, --LINUX-.--x and the check failed. umsls is unchanged: sorting by locale is what ls does. ... closed check-in: f3008d4950 user: grok tags: linux-emd-name-case

04:29
Only the exact name --linux-.--- is refused; its case variants are ordinary names, as in Linux 2.x. Tests on a Slackware system show that Linux UMSDOS refuses --linux-.--- (EIO) but accepts --LINUX-.---, --Linux-.--- and every other spelling that is not all lower case. UMSFUSE refused the name in any case: umsdosfs gave EINVAL for creating, linking or renaming to any variant, and umstar -x skipped such members as "name is --linux-.---".
  • src/ums_compat.c: ums_name_allowed compares with strc...
check-in: 2b6b161f1c user: grok tags: linux-emd-name-case
04:28
Correct the entry-name rules in the UMSDOS specification chapter of the Info manual. Tests on a Slackware system show that Linux UMSDOS refuses a name containing DEL (0x7f) with EIO, and refuses the exact name --linux-.--- with EIO, while case variants such as --LINUX-.--- and --Linux-.--- are accepted as ordinary names. The manual said Linux 2.x accepted both, and that UMSFUSE refused --linux-.--- in any case.
  • Name fields and mangling: a name cannot contain DEL and cannot be exactly --lin...
closed check-in: d8386a53ee user: grok tags: umsdos-spec
04:02
Replace AsciiDoc manpages with plain groff. check-in: d439237dfd user: chungy tags: trunk
03:43
Correct the hard-link pointer format history in the Info manual.

The new format is the one used by the UMSDOS driver's internal version 0.85g, which first appears in Linux 2.2.15 and 2.4.10. That dating matches the Linux 2.2 and 2.4 sources, and has been checked on Slackware systems running kernels from before and after the change. References to 2.2.14 for this change now say 2.2.15. The earlier note that the sources dated the format to 2.2.11 and 2.3.2, and the "Unverified" remark on a root-le... check-in: 2a923cd1a2 user: grok tags: umsdos-spec

03:43
Give the manual pages a generated date and version from the Fossil manifest.

doc/mkversion already extracts those from the manifest for the Info manual. It now also writes doc/version.man, which supplies the date and the UMSFUSE version used in each page's .TH line, in the same form GNU coreutils uses in the footer. The time and check-in hash are not included.

  • The .TH date and the "UMSFUSE" version footer come from version.man, not a hard-coded date.
  • make install concatenates versio...
closed check-in: c641cba1ab user: grok tags: manpages-groff
02:23
Convert the manual pages from AsciiDoc to hand-written groff.

The pages are terse references now that the Info manual holds the full documentation, so they no longer need a generator. Each doc/*.adoc is replaced by an equivalent page written with the man macros (umscat.1, umscp.1, umsdosfs.1, umsls.1, umsstat.1, umstar.1, umsfsck.8), with the same sections and wording.

  • doc/Makefile: the pages are sources; the a2x/asciidoctor rules are gone, and "make clean" no longer removes the pages. ...
check-in: 6764337c09 user: grok tags: manpages-groff
02:19
Write the UMSDOS specification chapter of the Info manual.

Replace the TODO in "UMSDOS specification" and fill in its sections: directory layout, the 64-byte slot and record format with an annotated dump from the sample tree, the name mangling algorithm with worked examples, the metadata fields and host permissions, timestamps, hard-link records and the two pointer formats, special files, the PowerPC layout and its detection, and the invariants umsfsck checks.

Behaviour of the Linux 2.x driver... check-in: 492d77dcc2 user: grok tags: umsdos-spec

01:50
Bring over info documentation to trunk check-in: 0c1145e19e user: chungy tags: trunk
01:11
Host write and execute permissions follow the UMSDOS mode, if possible. Host directories are exempt and always remain writable. check-in: f44ea42d14 user: chungy tags: trunk
00:52
Make the test suite run without prompts on a terminal

With write bits passed through and access(2) honoring the shown UMSDOS mode, some files the tests delete are write-protected (the sample tree's exec.exe and named-pipe, control-chars, link2.txt and link3.txt, and the rw_test pointer hard3). GNU rm asks before removing those when stdin is a terminal, so `make test` waited for an answer.

  • fsck_test.sh, fsck_dryrun_test.sh, fsck_undo_test.sh: setup uses `rm -f` and `rm -rf`.
  • hlink_co...
closed check-in: 505339b0c6 user: grok tags: test-noninteractive
00:21
Execute bits: the umsdosfs view answers access(2) from the UMSDOS mode, and host execute bits follow the record where the host keeps its own (not on FAT).

The view already reported the record's mode in getattr, but u_access only resolved the path and returned 0, so every access(X_OK) succeeded: find -type f -executable listed every file, test -x passed and bash's command completion offered any file (running one was already refused by the kernel from the mode). u_access now checks the mode it sh... closed check-in: cbb84ec91e user: grok tags: host-write-bits

00:03
Finish documenting umstar in the Info format. closed check-in: 67ce2612c1 user: chungy tags: info
2026-11-09
23:51
Isolate and protected test runs in their own $TMPDIR. check-in: bee6c22e7a user: chungy tags: trunk