Rsync parity: extended metadata preservation (hard links, ACLs, xattrs, devices, sparse files) #121

Closed
opened 2026-07-21 16:23:17 +02:00 by TapTap · 0 comments
Owner

FastSync currently preserves basic POSIX metadata (mode, uid, gid, mtime) via -M / --preserve. Rsync can preserve much more. FastSync should support:

Missing preservation flags

  • -H, --hard-links — preserve hard links (detect and recreate same-inode files)
  • -A, --acls — preserve POSIX ACLs
  • -X, --xattrs — preserve extended attributes
  • --devices — preserve device files (requires super-user)
  • --specials — preserve special files (named sockets, fifos, etc.)
  • -S, --sparse — handle sparse files efficiently (finding 19)
  • --preallocate — pre-allocate destination files before writing
  • -O, --omit-dir-times — omit directories from mtime preservation
  • --super / --fake-super — receiver attempts super-user activities

Current code

  • src/shared/metadata.c — only handles mode, uid, gid, mtime_sec, mtime_nsec
  • src/shared/metadata.h — struct FileMetadata has no fields for ACLs, xattrs, hard links, or device info
  • src/shared/file.c — no ACL/xattr restore logic

Impact

  • Hard links: currently each hard link is transferred as a separate file copy, wasting bandwidth and disk space
  • ACLs/xattrs: lost on transfer, breaking permission models on systems that rely on them (NFSv4, SELinux, NFSv4 ACLs)
  • Sparse files: expanded to full size on disk when transferred
  • Device files: silently skipped or cause errors

Implementation notes

  • Hard links: scanner needs to track inode/dev pairs and emit a special marker; receiver creates link instead of writing data
  • ACLs/xattrs: require platform-specific syscalls (acl_get_fd/acl_set_fd on Linux)
  • Sparse: receiver-side optimization using lseek(SEEK_HOLE) or detecting zero runs
  • Wire format: metadata struct needs new optional fields with backward-compatible parsing
FastSync currently preserves basic POSIX metadata (mode, uid, gid, mtime) via `-M / --preserve`. Rsync can preserve much more. FastSync should support: ## Missing preservation flags - `-H, --hard-links` — preserve hard links (detect and recreate same-inode files) - `-A, --acls` — preserve POSIX ACLs - `-X, --xattrs` — preserve extended attributes - `--devices` — preserve device files (requires super-user) - `--specials` — preserve special files (named sockets, fifos, etc.) - `-S, --sparse` — handle sparse files efficiently (finding 19) - `--preallocate` — pre-allocate destination files before writing - `-O, --omit-dir-times` — omit directories from mtime preservation - `--super` / `--fake-super` — receiver attempts super-user activities ## Current code - `src/shared/metadata.c` — only handles mode, uid, gid, mtime_sec, mtime_nsec - `src/shared/metadata.h` — struct `FileMetadata` has no fields for ACLs, xattrs, hard links, or device info - `src/shared/file.c` — no ACL/xattr restore logic ## Impact - Hard links: currently each hard link is transferred as a separate file copy, wasting bandwidth and disk space - ACLs/xattrs: lost on transfer, breaking permission models on systems that rely on them (NFSv4, SELinux, NFSv4 ACLs) - Sparse files: expanded to full size on disk when transferred - Device files: silently skipped or cause errors ## Implementation notes - Hard links: scanner needs to track inode/dev pairs and emit a special marker; receiver creates link instead of writing data - ACLs/xattrs: require platform-specific syscalls (acl_get_fd/acl_set_fd on Linux) - Sparse: receiver-side optimization using lseek(SEEK_HOLE) or detecting zero runs - Wire format: metadata struct needs new optional fields with backward-compatible parsing
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: TapTap/FastSync#121