Compare commits

..

1562 commits

Author SHA1 Message Date
Antonio SJ Musumeci
8e87bcbff2 docs: Add Unraid migration guidance for mergerfs
- Add a top-level Migration page covering both migration directions.
- Explain filesystem reuse, parity constraints, partition requirements,
  and unlocking encrypted Unraid disks.
- Describe intact ZFS pool imports and subdirectory branch reuse,
  distinguishing them from cases requiring a data copy.
- Add navigation and link the guide from the Unraid comparison.
2026-10-03 16:52:25 -05:00
Antonio SJ Musumeci
fcd7527c9d docs: document mergerfs tradeoffs and web UI management
* Add: a comprehensive downsides FAQ with mitigations and practical
  priorities.
* Document: mergerfs-webui and link it from setup and configuration
  guides.
* Replace: obsolete mergerfs.fsck references with fsck.mergerfs
  guidance.
2026-10-01 20:14:52 -04:00
Antonio SJ Musumeci
83d1630f55 docs: rework and expand project comparisons 2026-09-22 14:50:47 -05:00
Antonio SJ Musumeci
cfb925e5ae docs: clarify branch resolution and mount ordering 2026-09-21 13:46:38 -05:00
Antonio SJ Musumeci
515b0549ef docs/performance: explain mergerfs IO performance vs RAID
Describe why mergerfs does not aggregate branch performance like
RAID/ZFS (whose aggregate throughput is also capped by shared
interconnects) and instead provides independent per-branch
performance: best case A+B+C across concurrent streams, worst case
single-stream limited to one branch's speed.
2026-09-05 16:00:43 -04:00
natalefalco
8ea47df13e Include Docker Compose setup for mergerfs
Added Docker Compose configuration for running mergerfs.
2026-07-31 08:13:59 -05:00
shyney7
42ab831d97 docs/setup: link install :z example to SELinux FAQ 2026-05-17 10:14:21 -05:00
shyney7
89b4046d11 docs/faq: add SELinux relabeling entry 2026-05-17 10:14:21 -05:00
Antonio SJ Musumeci
7ec6f8e2f2 Manage cloned /dev/fuse fds in sessions
- Store cloned read-worker fds on fuse_session and close them there.
- Set up clone fallback through session helpers used by the loop.
- Carry per-request fds through receive, process, and reply paths.

Tests show significant performance increases in highly concurrent
workloads on a high core count system. Upto 15% better on reads and
27% on writes.
2026-05-14 20:13:07 -05:00
Antonio SJ Musumeci
5f7fa17ad8 Inline ioprio disabled fast path
- Expose the ioprio enabled flag as an atomic for relaxed inline checks
- Inline SetFrom construction so disabled read/write paths avoid a function call
- Move priority application into a slow helper used only when ioprio is enabled
2026-05-14 00:22:06 -04:00
Antonio SJ Musumeci
30d59d4458 Use shared_mutex for fuse log config
- Guard fuse_cfg_t log file and filepath shared pointers with a shared mutex
- Replace atomic shared pointer loads and stores with shared and unique locks
2026-05-14 00:22:06 -04:00
Antonio SJ Musumeci
02dc36080c Use shared_mutex for ReadDir state
- Replace atomic shared pointer loads/stores with shared/unique locking.
- Store the configured readdir mode directly as std::string.
- Copy the active ReadDir implementation under lock before invoking it.
2026-05-14 00:22:06 -04:00
Antonio SJ Musumeci
8734847968 Guard branch snapshots with shared_mutex
Important changes:
- Replace atomic shared_ptr operations with shared_mutex-protected snapshots.
- Retry copy-on-write branch updates when another writer publishes first.
- Keep long-running parsing and read-only filesystem checks outside branch locks.
2026-05-14 00:22:06 -04:00
Antonio SJ Musumeci
608cd00764 Use atomic open file reference counts
- Use relaxed increment under the map bucket lock when duplicating file handles.
- Use acq_rel decrement when releasing and checking for final references.
- Load moved ref_count with relaxed ordering during map insertion.
2026-05-14 00:22:06 -04:00
Antonio SJ Musumeci
b13727abde Document readdir merge mutex scope
- Explain that the mutex is per readdir call.
- Document that only dirent deduplication and list append are serialized.
- Clarify that per-branch opendir and getdents64 work runs outside the critical section.
2026-05-14 00:22:06 -04:00
Antonio SJ Musumeci
231aac15cd Use shared write locks until ENOSPC relocation
- Replace the per-file Mutex with std::shared_mutex for shared write access.
- Run direct and cached writes under a shared lock while the fd is stable.
- Retry failed writes under a unique lock before move-on-ENOSPC relocation.
2026-05-14 00:22:06 -04:00
Antonio SJ Musumeci
8b17d5f35e Synchronize node updates with path release
- Add helpers that release path locks and update node state under f.lock.
- Update getattr and setattr stat-cache invalidation while preserving ESTALE handling.
- Rework create, open, tmpfile, and set_path_info to mutate lookup/open state under the shared lock.
2026-05-14 00:22:06 -04:00
Antonio SJ Musumeci
8608b2be46 Clarify releasedir readdir synchronization barrier
- Document the lock/unlock pair as an acquire/release barrier.
- Explain that releasedir waits for in-flight readdir calls before destroy/free.
- Warn against removing the synchronization despite it not being a critical section.
2026-05-14 00:22:06 -04:00
Antonio SJ Musumeci
1e0bd54989 Move statvfs cache to use shared mutex
Its read heavy and micro benchmarks show no regression on the low end
and 30%+ throughput improvements on the highend.
2026-05-14 00:22:06 -04:00
Antonio SJ Musumeci
56285fc6e5 Pass annobin override to RPM toolset builds
Important changes:
- Add Makefile RPMBUILD and RPMBUILD_FLAGS overrides for the rpm target.
- Detect /opt/rh GCC toolsets before RPM packaging.
- Pass --undefine _annotated_build to avoid Rocky 8 annobin plugin failures.
2026-05-13 17:01:41 -04:00
Antonio SJ Musumeci
dfe053a0ae Require C++20-capable build toolchains
Important changes:
- Switch mergerfs and vendored libfuse Makefiles to -std=c++20.
- Select the latest available GCC/G++ or toolset in container builds.
- Verify compiler C++20 support during package installation.
- Fix dynamic SysLog formatting for fmt C++20 checks.
2026-05-13 13:55:43 -05:00
Antonio SJ Musumeci
12ac368e8b Preserve CPPFLAGS in release builds
- Append -DNDEBUG to existing CPPFLAGS in the release target.
- Keep caller-provided build flags for Debian packaging.
2026-05-09 19:28:56 -05:00
Antonio SJ Musumeci
c8f32f9f25 update build system and dependency configuration 2026-05-09 18:55:23 -05:00
Antonio SJ Musumeci
ce3737ff33 Add new OS build files 2026-05-07 23:35:14 -04:00
Antonio SJ Musumeci
84e4cdeb7e make all integration tests self-contained with ephemeral mounts
- Add mergerfs_mount() context manager in posix_parity.py that creates
  temporary branch dirs in tests/.test_tmp/, mounts an ephemeral mergerfs
  instance, and cleans up after use.
- Add find_mergerfs(), find_fusermount(), mount_mergerfs(), unmount_mergerfs()
  helpers.
- Update run-tests to invoke each TEST_* script without a mountpoint arg.
- Update README.md to document the new `python3 tests/run-tests` invocation.
- Fix 44 tests to use mergerfs_mount() instead of expecting a pre-mounted path.
- Add tempfile import to 10 tests that were missing it.
- Fix TEST_mount_lifecycle to use mergerfs_mount() context manager.
- Fix TEST_posix_tmpfile missing join import.
- Fix TEST_cfg_xattr_modes error message framing (no "(known bug)").
- Fix TEST_posix_copy_file_range: loop-copy full size, compare st_size and
  SHA256 hash; add NativeTmp for space management; route native temp to
  tests/.test_tmp/ to avoid ENOSPC on /tmp.
- Fix TEST_posix_getattr_fgetattr: st_cmp skips st_size for dirs; add
  compare_ino param for safe inode comparison when inodecalc=passthrough.
- Fix TEST_unlink_rename, TEST_use_* tests: namespace cleanup, consistent
  variable naming, None check for cmpfunc.
- Fix TEST_readlink_semantics: remove type annotations to support older
  Python; wrap in mergerfs_mount() try/except.
- Add flush=True to run-tests print so test names show immediately.
2026-05-07 21:47:40 -04:00
Antonio SJ Musumeci
6d6d73c7b3 Use unmount() on FreeBSD for ENOTCONN umount 2026-05-07 17:49:24 -04:00
Antonio SJ Musumeci
bea31543a0 update fuse_lib_tmpfile() node management to match fuse_lib_create() 2026-05-06 20:49:46 -04:00
Antonio SJ Musumeci
99835a0178 Document advisory locking limitation and update deprecated options
- Add documentation explaining that advisory file locking is not supported

- Add remember-nodes to deprecated options mapping

- Add comment explaining stat_crc32b fingerprint invalidation behavior

- Fix heading level for Host vs Container identity section
2026-05-06 20:49:46 -04:00
Antonio SJ Musumeci
342a1efcfb Add QEMU binfmt setup and fix static installer
- Fix typo in static.installer: /pkg/ -> /pkgs/

- Add missing mkdir -p /build before makeself

- Mount pkgs directory via podman build -v so static.installer can access

  previously built static tarballs without relying on bind mounts relative

  to the build context

- Register qemu-user-static binfmt handlers for cross-compilation

- Make --git-repo optional when using --setup
2026-05-06 20:49:46 -04:00
Antonio SJ Musumeci
c587a127fb add missing <new> include for std::nothrow in fuse_session.cpp 2026-05-06 20:49:46 -04:00
Antonio SJ Musumeci
f1034a3ad6 Remove timed node removal 2026-05-06 20:49:46 -04:00
Antonio SJ Musumeci
8117998205 Remove unused lock operation plumbing 2026-05-06 20:49:46 -04:00
Antonio SJ Musumeci
cc780bc521 libfuse: remove per-node lock bookkeeping 2026-05-06 20:49:46 -04:00
Antonio SJ Musumeci
14b7c8e607 Use stat fingerprint as cache validity sentinel
- Reserve a zero stat CRC to represent an invalid cache fingerprint.

- Include device, size, inode, mtime, and ctime data in the fingerprint.

- Recompute the fingerprint during auto-cache open before keeping cache.
2026-05-06 20:49:46 -04:00
Antonio SJ Musumeci
3ff9794fff libfuse: fix use-after-free in fuse_lib_ioctl 2026-04-30 12:51:12 -05:00
Antonio SJ Musumeci
f71e27644e vendor moodycamel queue and upgrade to 1.0.5 2026-04-30 08:43:42 -04:00
Antonio SJ Musumeci
943f91ff98 Strengthen mergerfs integration tests
- Make the test runner fail on failed tests and report explicit skips
- Strengthen assertions for O_DIRECT, LUP policy, EXDEV fallback, and xattrs
- Fix cleanup and file descriptor handling across test scripts
2026-04-29 20:25:20 -04:00
Antonio SJ Musumeci
ef1e01b5a5 Add unit and integration tests for recently changed code
Unit tests (29 new in tests/tests.cpp):
- str::eq() and str::startswith() char* nullptr safety
- str::from() u64/s64/int suffix parsing (K/M/G/T, overflow, invalid)
- num::humanize() byte formatting (0, 512, 1K, 1M, 1G, 1T, non-exact)
- RmdirErr priority error accumulation (ENOTEMPTY/EEXIST override rules)
- HashSet inline-to-heap growth, empty string, and large insertion
- fs::inode algorithm switching (valid/invalid names, passthrough raw ino,
  distinct inodes across algorithms)
- RND::rand64() bounds (range, max, shrink_to_rand_elem)
- Branches::Impl copy and move assignment re-links default_minfreespace

Integration tests (5 new in tests/):
- TEST_policy_lup: LUP policy create and search
- TEST_rmdir_enotempty_priority: rmdir returns ENOTEMPTY for non-empty dirs
- TEST_open_after_unlink: read/write via fd after unlink
- TEST_api_xattr: mergerfs xattr API (fullpath, relpath, basepath, allpaths)
- TEST_movefile_enospc: moveonenospc configuration round-trip

Also: remove xattr nosys checks from TEST_cfg_xattr_modes, reformat
integration test scripts to use temp_dir/cleanup_dir helpers, and
minor parameter alignment changes in fuse_getxattr, fuse_init,
fuse_rename.
2026-04-29 17:41:00 -04:00
Antonio SJ Musumeci
50c0627b2b Better handle make sanitize option 2026-04-29 12:24:10 -04:00
Antonio SJ Musumeci
660f556ac6 Don't return success on ENOTEMPTY rmdir errors 2026-04-29 12:23:49 -04:00
Antonio SJ Musumeci
997b036064 Reject invalid policies 2026-04-29 00:34:00 -04:00
Antonio SJ Musumeci
9308a3729c When file unlinked check open_files map
Inadvertantly removed. Didn't realize that the kernel would not always
send file handle when unlinked.
2026-04-28 16:04:26 -04:00
Antonio SJ Musumeci
7616d8b1ac Rework readlink to not depend on cstr nul termination 2026-04-26 01:37:08 -04:00
Antonio SJ Musumeci
a86092b3c2 Don't push docs for RC tags 2026-04-23 20:46:55 -05:00
Antonio SJ Musumeci
e613d9415f Better same file check for fsck 2026-04-22 22:28:56 -05:00
Antonio SJ Musumeci
1a8eb326af Tweak docs on NFS and identity management 2026-04-21 13:20:07 -05:00
Antonio SJ Musumeci
9fb1642e93 Fix docs regarding "noforget" 2026-04-20 23:25:47 -05:00
Antonio SJ Musumeci
8be86ee611 Remove mkdocs build github workflow 2026-04-19 23:48:13 -05:00
Antonio S. Musumeci
da68cf3a85 Formatting: normalize brace style and parameter alignment
Some checks failed
mkdocs / deploy (push) Has been cancelled
No functional change: libfuse/helper.cpp (fuse_daemonize,
fuse_helper_opt_proc, fuse_parse_cmdline) and mergerfs
fuse_init.cpp (_want helpers) reformatted to match the project's
GNU-style brace placement and aligned parameter lists.
2026-04-18 13:47:23 -05:00
Antonio S. Musumeci
ec40866091 libfuse: small safety and portability fixes across opt/cpu/fusermount/maintenance_thread
- fuse_opt: reformat process_opt_param to project style; return the
  rv from sscanf through a named local so the error branch prints
  the failing option cleanly.

- cpu.cpp: when parsing /sys/devices/system/cpu/*/topology/core_id,
  bail out cleanly on stream read failure rather than recording an
  uninitialized core_id.

- fusermount: free(copy) on the success path of parsing the mount
  option (previously leaked on every mount), and replace the fixed-
  buffer sprintf into procfile with snprintf bounded by the buffer
  size.

- maintenance_thread: widen the iteration count from int to u64
  so a long-lived daemon doesn't wrap after ~68 years of ticks
  (real effect: silence signed-overflow warnings under UBSan).
2026-04-18 13:47:23 -05:00
Antonio S. Musumeci
bd0714272e libfuse: thread_pool/objpool/fuse_loop - safer memory and iteration
- ThreadPool::destroy used to iterate _threads directly while another
  thread could be adjusting the same vector. Snapshot the vector
  under the mutex and iterate the local copy for pthread_cancel /
  pthread_join.

- ObjPool::construct now returns NULL when the pooled allocator
  returns NULL instead of invoking placement-new on a null
  pointer. In destroy, compute to_node(obj) before running the
  destructor - the destructor may scrub bytes the to_node helper
  reads.

- In the async/sync workers in fuse_loop, msgbuf_alloc can return
  NULL under memory pressure. Fail the worker cleanly with a
  diagnostic rather than dereferencing. Also introduce a small
  _nproc() helper that treats hardware_concurrency()==0 as 1, so
  the downstream min/max arithmetic doesn't produce a zero thread
  count.
2026-04-18 13:47:23 -05:00
Antonio S. Musumeci
27acd9fcc7 libfuse: use atomic fuse_session pointer in signal handler
The signal handler reads the global session pointer from an async-
signal context while another thread installs/removes the session
via set/remove_signal_handlers. Use std::atomic<fuse_session*> with
acquire/release ordering so the handler either sees NULL or a fully
published session, never a torn pointer.
2026-04-18 13:47:23 -05:00
Antonio S. Musumeci
4516685ca7 libfuse: harden fuse.cpp against NULL nodes; use lock guards; check allocations
Collapse get_node/get_node_nocheck into a single function that
returns NULL when the node is absent rather than abort()ing.
Callers that previously assumed non-NULL now check the return value
and either reply ESTALE/ENOMEM or fall through gracefully; a few
places where the node is load-bearing (e.g. unhash during remove)
use fatal::abort with a descriptive message.

Switch mutex_lock / mutex_unlock pairs to mutex_lockguard so early
returns on error paths no longer leak the lock, and add NULL-safety
around fuse_dh in readdir/readdir_plus, fuse_dirents_init error
returns, the getattr path when both name and fh are empty, and the
msgbuf allocation in fuse_lib_read.

Pull the new xstrdup/xmalloc wrappers from xalloc.hpp for the root
node name so the common-case OOM path terminates with a diagnostic
instead of a silent corrupted node.

Also guard fuse_session_destroy against a NULL session - called
from error-recovery paths.
2026-04-18 13:47:23 -05:00
Antonio S. Musumeci
0bdbaf1d6c libfuse: remove userdata from init/destroy APIs; drop unused fuse_reply_ioctl_iov
The low-level init/destroy callbacks were passed a userdata pointer
that mergerfs never consumed - the caller threaded it through
fuse_lowlevel_new only to hand it back unchanged. Remove the
parameter from the ops struct, from fuse_lowlevel_new(_common),
and from the internal fuse_ll struct; update fuse_lib_init and
fuse_lib_destroy accordingly.

Also drop fuse_reply_ioctl_iov: no caller in-tree invokes it and
the public API is defined by this vendored libfuse fork.
2026-04-18 13:47:23 -05:00
Antonio S. Musumeci
e67b7d0825 log: default debug log path to empty; skip set when empty
libfuse previously initialized its debug log filepath to
"/dev/stderr", forcing the config layer to reopen stderr on every
load whether or not the user asked for it. Default the libfuse log
path to "" and have the mergerfs config layer only forward the
request to libfuse when the user supplied an explicit path.
2026-04-18 13:47:23 -05:00
Antonio S. Musumeci
981d5473ee str: null-safe same() and startswith()
Both helpers previously called strcmp/pointer-dereference directly
on their arguments, so a stray NULL (e.g. an unset env string or an
absent xattr) crashed the process. Guard both helpers: same()
returns true only if both pointers are equal, startswith() returns
false if either side is NULL.
2026-04-18 13:47:23 -05:00
Antonio S. Musumeci
364f8c4407 fs_movefile_and_open: -ENOSPC when no destination branch available
The create policy can legitimately return success with an empty
destination list (e.g. every candidate rejected). Previously we
then dereferenced dst_branch[0] and faulted. Return -ENOSPC so the
original write that triggered the move propagates a sensible errno
to userspace.
2026-04-18 13:47:23 -05:00
Antonio S. Musumeci
ef9c7ad5df fuse_statfs: scale with long double to avoid integer overflow
The branch-aggregation code computed
  blocks * f_frsize / min_frsize
as u64 arithmetic. With large filesystems the intermediate product
blocks * f_frsize overflows 64 bits long before the division can
bring the result back into range, producing garbage bavail/bfree
values reported to userspace.

Compute the scale factor once in long double and multiply each
count by it, so the only narrowing happens in the final cast back
to fsblkcnt_t.
2026-04-18 13:47:23 -05:00
Antonio S. Musumeci
4288a60c5d fuse_readlink: always null-terminate buffer
Old code only null-terminated when the returned/copied length was
strictly less than the caller-supplied bufsize_, leaving the buffer
unterminated on an exact-fill. Since buf_ is consumed as a C string,
reserve one byte for the terminator up front and unconditionally
terminate.
2026-04-18 13:47:23 -05:00
Antonio S. Musumeci
cf38a37176 fuse_readdir: atomic initialized flag; bound error string; check msgbuf allocation
- ReadDir::_initialized is set by the first thread through the
  lazy-init path and read by every subsequent caller; make it
  std::atomic<bool> so the read/write pair has a happens-before
  relationship.

- The 'no valid mergerfs branch found' error directory entry used
  strcpy into a fixed-size dirent buffer. The message happens to
  fit today but the buffer is only NAME_MAX wide; switch to a
  length-bounded strncpy driven by the constexpr string size.

- The getdents implementations for seq/cor/cosr allocated a msgbuf
  without checking for allocation failure and then dereferenced it.
  Return -ENOMEM when the allocation fails.
2026-04-18 13:47:23 -05:00
Antonio S. Musumeci
f5d9a60b9d fuse_getattr/statx: populate timeouts in fake_root and controlfile replies
The fake-root and control-file fast paths returned a synthetic stat
without touching the timeout struct. Callers that took those paths
ended up sending whatever the timeout struct happened to hold,
which is uninitialized memory for the control-file path and
whatever a prior call left there for the fake-root path. Kernel
behavior is undefined when the timeout is garbage.

Pass timeout_ into both helpers and set entry/attr from the
configured cache values.
2026-04-18 13:47:23 -05:00
Antonio S. Musumeci
0c17492c78 FUSE: pass Branches::Ptr by value with empty-branches guards
Previously most FUSE ops took a reference to the live cfg.branches
object. With atomic_load now producing a shared_ptr snapshot, pass
it by value: the op works against a single stable view of the
configuration for its whole lifetime, immune to concurrent
reconfiguration.

Also bail out with -ENOENT when the policy returns an empty branch
set rather than dereferencing branches[0]. This was reachable if a
policy rejected every branch (e.g. everything readonly while
looking for a writable target).

Covers access, chmod, chown, create, getattr, getxattr, ioctl,
link, listxattr, mkdir, mknod, open, readdir (cor/cosr),
readlink, removexattr, rename, rmdir, setxattr, statfs, statx,
symlink, truncate, unlink, utimens.

While here, in _getattr only dereference st_->st_mode when lstat
succeeded (it is otherwise uninitialized).
2026-04-18 13:47:23 -05:00
Antonio S. Musumeci
98648ae44b FUSE: require valid file/dir handle; drop open_files fallback
Several FUSE ops fell back to looking up a FileInfo via
state.open_files when the kernel-provided fh was zero, returning
-ENOENT if the lookup failed. This path papered over handle-tracking
bugs and added cost on every call. Use the handle directly and
return -EBADF when it is invalid - the kernel should always hand us
a valid fh for an open resource.

Also simplify FileInfo::from_fh / DirInfo::from_fh and their to_fh
helpers: callers now handle the null-pointer case explicitly so the
ASSERT_NOT_NULL checks are redundant.

Covers fallocate, fchmod, fchown, fgetattr, flock, ftruncate,
futimens, read, release, releasedir, write, statx, ioctl (file +
dir), readdir (sequential, concurrent-on-read,
concurrent-on-search), and the passthrough fast paths in
create/open.
2026-04-18 13:47:23 -05:00
Antonio S. Musumeci
0dcca0f1a3 branches: re-link default_minfreespace pointer on copy/move; atomically publish branch mode changes
Branches using the default minfreespace held a reference to their
owning Impl's _default_minfreespace. After a copy or move the
pointer still referenced the source Impl, which could become
invalid or diverge after further configuration changes. Switch to
a pointer and re-link it to the destination Impl on copy/move.

While here, convert set_branch_mode to do an atomic_store of a
newly constructed Impl rather than mutating the shared pointer
target in place. Readers holding an atomic_load snapshot are no
longer affected by a concurrent mode change.
2026-04-18 13:47:23 -05:00
Antonio S. Musumeci
103cd358f2 state: atomic ref_count in OpenFile
ref_count is read and written from multiple FUSE worker threads
during open/release. Make it std::atomic<int> and provide a move
constructor so OpenFile remains movable when the underlying atomic
is non-movable.
2026-04-18 13:47:23 -05:00
Antonio S. Musumeci
aa46001923 Remove unused rwlock.hpp header and includes
rwlock.hpp was left over after migrating to atomic shared pointers
for branches configuration. No code references ReadGuard/WriteGuard
any longer, so drop the header and its stale includes.
2026-04-18 13:47:23 -05:00
Antonio SJ Musumeci
ff48ff6047 Handle/ignore SIGHUP
Some checks are pending
mkdocs / deploy (push) Waiting to run
2026-04-17 11:14:05 -05:00
Antonio SJ Musumeci
d5a2187713 Fix make race condition
Some checks are pending
mkdocs / deploy (push) Waiting to run
2026-04-16 18:20:00 -05:00
Antonio S. Musumeci
351adc2b20 Add tests for HashSet, rapidhash withSeed consistency, and ReaddirCalc parity with calc
Some checks failed
mkdocs / deploy (push) Has been cancelled
2026-04-12 23:44:23 -05:00
Antonio S. Musumeci
a1e681f36b Use ReaddirCalc in all readdir implementations
* avoids per-entry path construction
2026-04-12 23:44:23 -05:00
Antonio S. Musumeci
e3a467de80 Refactor fs_inode
* add Algo enum
* ReaddirCalc class
* string_view params
* fs::path overloads
2026-04-12 23:44:23 -05:00
Antonio S. Musumeci
cdadda5eb9 Replace khash with custom hash set 2026-04-12 23:44:23 -05:00
Antonio SJ Musumeci
4c9a9d7e15 Upgrade rapidhash 2026-04-12 23:44:23 -05:00
Antonio SJ Musumeci
425e30b50f Use nanosleep rather than yield and return EINTR
Some checks failed
mkdocs / deploy (push) Has been cancelled
2026-04-11 11:30:57 -05:00
Antonio SJ Musumeci
3905355522 Detect OS for release-sample make target
Some checks failed
mkdocs / deploy (push) Has been cancelled
2026-04-08 20:48:02 -05:00
Antonio SJ Musumeci
9e2e1afafa Update docs on limiting drive spinup
Some checks failed
mkdocs / deploy (push) Has been cancelled
2026-04-06 14:01:20 -05:00
Antonio SJ Musumeci
6d218fa87f Misc updates and fixes
Some checks failed
mkdocs / deploy (push) Has been cancelled
2026-04-04 02:46:24 -05:00
Antonio SJ Musumeci
3b10406f95 Add more details to project comparisons 2026-04-04 02:17:06 -05:00
Antonio SJ Musumeci
f2c8e5d9eb Add FUSE request_timeout
Some checks failed
mkdocs / deploy (push) Has been cancelled
Not yet hooked up to config parser to set as need to evaluate usage.
2026-04-01 23:20:05 -05:00
Antonio SJ Musumeci
b581c5d5e7 Add support for FUSE_COPY_FILE_RANGE_64 2026-04-01 23:20:05 -05:00
Antonio SJ Musumeci
1ebc8cfa5f Enable statx with file handle
Some checks are pending
mkdocs / deploy (push) Waiting to run
2026-03-31 19:53:17 -04:00
Antonio SJ Musumeci
acfa797503 Misc formatting changes 2026-03-31 19:53:17 -04:00
Antonio SJ Musumeci
7fc20457ca Rework open file resource management 2026-03-31 19:53:17 -04:00
Antonio SJ Musumeci
ecee84b323 Improve proj comparisons + new SnapRAID details 2026-03-31 19:51:28 -04:00
Antonio SJ Musumeci
b8776d205d Update docs; add nofs, policyfs and greyhole
Some checks failed
mkdocs / deploy (push) Has been cancelled
2026-03-27 22:54:39 -05:00
Antonio SJ Musumeci
06433a0548 Fallback to fusermount3 where available
Some checks failed
mkdocs / deploy (push) Has been cancelled
Also general cleanup of mount_generic.
2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
f4b602340b Add more integration tests 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
a78aef36e0 Additional check for ENOTCONN on mount 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
0d05523dfd Move maintainence thread func take u64 rather than int
signed rollover is UB
2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
0cfab60f37 replace raw C-strings with std::string in converted libfuse files
util/mount.mergerfs.cpp:
- Remove xstrdup/xrealloc wrappers entirely
- Convert type, source, options, command, setuid to std::string
- Replace add_arg() pointer-rewriting with shell_quote() returning std::string
- Replace add_option() with simple std::string += concatenation
- Fix const_cast UB on string literal assignment

lib/helper.cpp:
- Convert add_default_subtype local subtype_opt: malloc+snprintf+free -> std::string construction

lib/mount_generic.h:
- Convert fuse_mount_sys locals source/type: malloc+strcpy+strcat -> std::string
- Remove 4 unnecessary free() calls (RAII cleanup)
- .c_str() at mount() and fuse_mnt_add_mount() boundaries

lib/mount_util.h:
- Rewrite fuse_mnt_resolve_path internals using std::string: rfind/substr
  instead of manual pointer arithmetic, strrchr, strlen chains
2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
21966ade97 Convert vendored/libfuse C sources to C++17
Convert all C source files in vendored/libfuse/ to C++17:
- lib/crc32b.c    -> crc32b.cpp  (const void* cast)
- lib/fuse_opt.c -> fuse_opt.cpp (designated init, void* arithmetic)
- lib/fuse_signals.c -> fuse_signals.cpp
- lib/helper.c   -> helper.cpp  (void* data cast)
- lib/mount.c    -> mount.cpp  (thin wrapper)
- lib/mount_generic.c -> mount_generic.h (static inline, #pragma once)
- lib/mount_bsd.c -> mount_bsd.h    (static inline, #pragma once)
- lib/mount_util.c -> mount_util.h   (static inline, #pragma once)
- util/fusermount.c -> fusermount.cpp
- util/mount.mergerfs.c -> mount.mergerfs.cpp

Key changes:
- Replace C99 designated initializer in fuse_opt_parse with field-by-field init
- Fix void* pointer arithmetic via char* base + offset pattern
- All C-style (T*)voidptr casts replaced with static_cast/reinterpret_cast
- Remove redundant #define _GNU_SOURCE (already in FUSE_FLAGS)
- Wrap __clone2 declaration in extern "C" for ia64 path
- Update Makefile: empty SRC_C, build utils with $(CXX) instead of $(CC)
- Remove stale .c files now replaced by .cpp/.h counterparts

All binaries build cleanly: mergerfs, mergerfs-fusermount, mount.mergerfs
2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
96eb51eecb Move fuse_session to C++ and make exit flag atomic 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
881147daa2 Fix null ptr handling issue in ioctl processing 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
0f1a8e9b69 Fix error condition in fs_copyfile 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
08f9cc6932 Fix readlink implementation, add more tests 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
3099b15db1 More aggressive error handing with pagesize queries 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
07b1e6bdba Auto-commit fuse_msgbuf.cpp 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
7763c7384a Use fatal::abort() rather than assert in places 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
61365d226d Move scope_guard to vendored/ 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
f33e78bc24 Cleanup procfs and abort on critical issues 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
7f52623536 Cleanup branches and add more unit tests 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
a30a4df9c0 Cleanup config and add tests 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
1e0d5aa91d fs_wait_for_mount cleanup 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
d09fadbc28 fs_inode cleanup 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
21ce889449 Fixup listxattr error handling 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
9d1a4696e9 Small improvements to fs::statvfs_cache 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
ed0cbcf064 Cleanup fuse_readlink 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
076e359891 Improve thread pool 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
bf98d3f3a6 Fix possible error handling issue with errno 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
c45c5ce920 Make cfgfile depth calculation thread friendly 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
e0a892f0d0 Improve error handling when querying pagesize 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
164b7f73c9 Misc fixes and improvements to thread pool 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
3a45be4cd8 Rework string utils, more test cases 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
107a3acf95 Better error handling in pagesize config type 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
a5eafb8972 Check string is not empty before resize in Config::keys 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
8199cc8a8b Fix error handling in fuse chmod, chown, setxattr, removexattr 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
e5d897f3dc Ensure zero initialized timeouts structs 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
c0af09f7d8 Fix incorrect type in fs_read and write 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
1b1e14ca29 Remove dead branch in fuse_reply_data 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
82b89aa099 Change session->exited to sig_atomic_t 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
aa91e1b2ba Initialize stat buffer and add stat call in fuse_mount_sys 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
82e81afcdc Add NULL check for cmsg in receive_fd to prevent segfault 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
1a5c39f813 Fix buffer overflow in readlink by reserving space for null terminator 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
fce1803d42 Use RND class for shrink_to_rand_elem and add assertions 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
5a9a17afcb fix objpool: add size tracking, improve allocation matching; fix msgbuf: clear pool on size change 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
8648de6bb6 fix policy_eppfrd.cpp: return 0 when branchinfo found, -ENOENT only when empty 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
f227a63e15 fix str.cpp: use string_view::npos, fix erase() calls, remove extra whitespace 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
aa47b74dea Remove iterator methods from Branches class 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
206ad1dd53 Fix futimens bugs: stat pointer, variable names, and negation 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
80aead7085 Add null pointer checks for FileInfo/DirInfo 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
1220befacf Fix copydata_copy_file_range bug 2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
01aa888c7a Fix eplus search bug
Not that anyone would ever use this but it was noticed in a scan.
2026-03-24 21:13:34 -04:00
Antonio SJ Musumeci
6a6aa054cd Add support for Arch, btw
Some checks failed
mkdocs / deploy (push) Has been cancelled
2026-03-14 11:39:48 -04:00
Antonio SJ Musumeci
04939bbe72 No longer explicitly error out on broken mount point
Some checks failed
mkdocs / deploy (push) Has been cancelled
If ENOTCONN (broken FUSE mount) umount first and continue to mount.
2026-03-08 00:39:45 -05:00
Antonio SJ Musumeci
2ea6290e4b Update limiting drive spinup doc
Some checks failed
mkdocs / deploy (push) Has been cancelled
2026-03-04 11:05:55 -05:00
Antonio SJ Musumeci
c66c68b137 Misc cleanup
Some checks failed
mkdocs / deploy (push) Has been cancelled
2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
075a8a6548 Convert some push_back to emplace_back 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
3c6d1b47f6 Remove unused "using"s 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
6f281b9f7f Remove duplicate includes 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
511bf47af9 Convert stdint to short ints 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
53c5a2cf1e Move fmtlib to vendored and upgrade to 12.1.0 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
eb8074ed9a Update vendored/nonstd to latest and fix API usage 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
38c19df95a Update vendored/boost to 1.90.0 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
b1228f11bd Update vendored/acutest to latest master 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
cfafafd7ff Update vendored/CLI11 to v2.6.2 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
c8ce82ce54 Update vendored/subprocess to v2.5 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
05c3d97368 Update vendored/rapidhash to v3 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
2c87e68635 Cleanup ugid.hpp usage 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
8f1ef59770 Move 3rd party libraries to "vendored" directory 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
a460c52861 Remove unused files 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
a4aade6666 Make global inode calculation function pointer atomic 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
1d1bcd3b87 Add extra checks in for file handle lookup 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
099ce2d91d Add more asserts 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
56cd831ec8 Fix str::trim to handle all whitespace characters
Use std::isspace() instead of comparing only to space character.
Now handles tabs, newlines, carriage returns, etc.
2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
e43be3c221 Remove unused PolicyCache implementation 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
2754536727 Fix integer overflow in size suffix parsing
Use __builtin_mul_overflow to detect overflow when applying size
suffixes (K, M, G, T) in str::from for int64_t and uint64_t. Previously,
large values with suffixes could silently wrap around.
2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
a0cff637e1 Misc cleanup 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
a5a6c892b9 Update copyright headers 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
3d50d4a52f Explicitly return EXIT_FAILURE 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
f69c31fd77 Rework objpool 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
a2860c3f1f Use debug mutex more 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
3f70e66ee3 Rework node obj pool to use objpool 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
160d3c832d Fix branches unit test 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
15bcc47d6a Remove "channels" and embed into session 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
e55bb93890 Simplify lowlevel fuse state management and req mem 2026-03-02 01:09:16 -05:00
Antonio SJ Musumeci
5a2a9e4530 Remove fuse_ll_pipe dead code 2026-03-02 01:09:16 -05:00
trapexit
b4239495a0
Update docs for logging changes + new video (#1618)
Some checks failed
mkdocs / deploy (push) Has been cancelled
2026-02-12 23:21:43 -06:00
trapexit
3222de6c9c
Fixup debug output (#1617) 2026-02-12 22:50:38 -06:00
Aaron Andersen
be4d388813
Add support for -n to not update mtab (#1616) 2026-02-12 20:35:48 -06:00
trapexit
a47842e2f8
Add MOS to projects and update misc links (#1614)
Some checks failed
mkdocs / deploy (push) Has been cancelled
2026-01-27 11:25:32 -06:00
trapexit
f769d7474b
Add new links to media docs (#1613)
Some checks are pending
mkdocs / deploy (push) Waiting to run
2026-01-27 07:59:38 -06:00
trapexit
2ae57642f4
Misc documentation updates (#1612) 2026-01-27 07:00:22 -06:00
trapexit
7f1b7ac343
Add lshw to collect info tool (#1610)
Some checks failed
mkdocs / deploy (push) Has been cancelled
2026-01-19 13:57:42 -06:00
trapexit
1290ab9708
Ensure ::exists() call can't throw (#1609)
Some checks failed
mkdocs / deploy (push) Has been cancelled
2026-01-15 17:33:31 -06:00
trapexit
965e26989c
Misc documentation updates (#1605)
Some checks failed
mkdocs / deploy (push) Has been cancelled
2025-12-23 23:25:39 -06:00
trapexit
0caae4fbf0
Tag container image to ghcr for convenience (#1604)
Some checks failed
mkdocs / deploy (push) Has been cancelled
2025-12-14 15:21:56 -06:00
trapexit
4d1760cb69
Rework new lup policy to work on 32bit systems (#1603)
__int128 is not available on 32bit platforms. Moved to extended
precision floats.
2025-12-14 14:56:34 -06:00
François-Xavier Payet
22df87c86a
Add LUP policy (#1601)
Some checks are pending
mkdocs / deploy (push) Waiting to run
2025-12-14 00:36:12 -06:00
trapexit
72fb6e4aba
Update submitting bug reports, improve collect-info (#1598)
Some checks failed
mkdocs / deploy (push) Has been cancelled
2025-12-06 13:55:14 -06:00
trapexit
9b046d9a34
Rework credential handling to support chroot & idmap (#1595)
Some checks are pending
mkdocs / deploy (push) Waiting to run
Run in an elevated credential mode (root) and let the kernel manage
entitlements. Will result in slightly different behavior but should
not be noticed by most.
2025-12-05 21:03:48 -06:00
Emanuel Haupt
d8918458bf
libfuse: fix narrowing conversion of nsec fields on i386 (#1593)
Some checks failed
mkdocs / deploy (push) Has been cancelled
On 32 bit platforms tv_nsec is a signed long while the FUSE setattr
arguments provide nanoseconds as uint32_t. C++17 treats uint32_t -> long
in a brace initializer as a narrowing conversion and rejects it on ILP32
targets. This surfaced when building on FreeBSD i386 with clang 19 where
the compiler refused the list initialization of struct timespec.

Add explicit static_cast<long>() for the nsec fields to make the
conversion intentional and portable. This avoids build failures on i386
while leaving 64 bit builds unchanged.
2025-11-29 10:45:20 -06:00
trapexit
d3a3f65e7b
Ignore remote when forcing generation of docs (#1592)
Some checks failed
mkdocs / deploy (push) Has been cancelled
2025-11-25 23:39:13 -06:00
trapexit
411d181473
Add qbittorrent specific section of known issues (#1591) 2025-11-25 23:14:20 -06:00
Emanuel Haupt
caf7915003
tools/preload: include correct extended attribute headers on FreeBSD (#1590)
Some checks are pending
mkdocs / deploy (push) Waiting to run
Add conditional includes for extended attribute support. FreeBSD uses
<sys/extattr.h> instead of <sys/xattr.h>, which prevents the preload
module from building. This update selects the proper header based on
the target platform and fixes the build failure on FreeBSD.
2025-11-25 12:09:41 -06:00
trapexit
4c5473d569
Remove cirris builds, codeql; redo mkdocs builds (#1585)
Some checks failed
mkdocs / deploy (push) Has been cancelled
2025-11-19 10:28:38 -06:00
trapexit
104f378c2c
Replace 'unknown' distro-codename when building deb from tarball src (#1584) 2025-11-19 07:57:58 -06:00
trapexit
a364405cf0
Remove --depth=1 to clone for tarball builder (#1583)
Led to empty changelog
2025-11-19 06:56:23 -06:00
trapexit
960f5fdbba
Fix some links in docs (#1582)
Some checks failed
mkdocs / deploy (push) Waiting to run
CodeQL / Analyze (push) Has been cancelled
2025-11-18 08:35:27 -06:00
trapexit
6813a51fce
Ensure cfg references do not also try to initialize the value (#1580)
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
2025-11-17 17:08:36 -06:00
trapexit
f7e86d90ce
Add FAQ about lack of create policies about file size (#1578)
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
2025-11-16 23:44:24 -06:00
trapexit
66d120c721
Add Ubuntu 25.10 build (#1577) 2025-11-16 22:30:32 -06:00
trapexit
01973214bf
Slight tweaks to config parsing error handling (#1575)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-11-13 16:05:03 -06:00
trapexit
af1edadf72
Fix size comparison for returning ERANGE in listxattr (#1574)
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
2025-11-12 18:58:50 -06:00
trapexit
3bacaa6f7f
Add lazy-umount-mountpoint page and mount -a FAQ (#1573) 2025-11-12 12:19:00 -06:00
trapexit
b6e1a08aef
Add link to container image repo (#1570)
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
2025-11-11 19:38:18 -06:00
trapexit
47bd4259b8
Add container image details (#1569)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-11-08 20:28:10 -06:00
trapexit
dc486e79ce
Add container image building (#1568)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-11-06 23:39:05 -06:00
trapexit
78551049d5
Add ability to passthrough 'nofail' mount option (#1567)
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
2025-11-06 11:05:19 -06:00
trapexit
4aab008233
Ensure backward compatibility with remember & noforget (#1566)
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
2025-11-05 19:43:57 -06:00
trapexit
3a7a4a13e7
Improve mergerfs intro in docs (#1563)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-11-04 00:02:46 -06:00
trapexit
41b65ae9e8 Misc cleanup for FreeBSD and clang (#1560)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-11-02 10:49:22 -06:00
trapexit
2412ae7316
Further tweaks to config parsing and error reporting (#1559)
* Further tweaks to config parsing and error reporting

* Fix static builds
2025-11-01 15:20:30 -05:00
trapexit
ec16d07fba
Mention how mmap error when direct io is enabled (#1557)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-10-31 09:31:37 -05:00
trapexit
37f10888a9
Add more debugging options to makefiles and cleanup (#1556)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-10-29 22:42:42 -05:00
Satadru Pramanik, DO, MPH, MEng
0db8a1ed6a
Fix manpage links for 2.41.0-rc3 (#1555)
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
2025-10-29 12:07:49 -05:00
trapexit
cfaad60275
Misc updates to arg parsing (#1554)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
Ignore "defaults" and add a number of more modern VFS mount switches
2025-10-26 21:05:05 -05:00
trapexit
077484323c
Fix variable names of fuse-msg-size and posix-acl (#1553)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-10-25 17:00:16 -05:00
trapexit
700fcfccf5
Update fuse-msg-size docs (#1552)
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
2025-10-24 23:34:28 -05:00
trapexit
4b4801add6
Config options docs updates (#1551) 2025-10-24 22:31:04 -05:00
trapexit
741128cb23
Fix lack of include for fmt (#1550) 2025-10-24 21:00:15 -05:00
trapexit
3bee0f0b57
Misc docs updates (#1549) 2025-10-24 20:47:33 -05:00
trapexit
727c522fb8
Rework config, centralize fuse config (#1547)
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
2025-10-24 08:20:29 -05:00
trapexit
00e5467e99
Misc docs updates (#1544)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-10-13 11:44:53 -05:00
trapexit
0371f03def
Rework how fuse request context is handled (#1543)
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
2025-10-12 23:21:36 -05:00
trapexit
d18c273293
Allow setting of passthrough max-stack-depth (#1542)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-10-07 21:52:13 -05:00
trapexit
0f24bb29ac
Make allow-idmap optional (default: false) (#1541)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
This is just to correct default behavior for now. More investigation
is necessary to properly support idmapping.
2025-10-06 14:46:58 -05:00
trapexit
3cb35a3a65
Fix rename path generation (#1540)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-10-01 17:47:13 -05:00
trapexit
25b0bc72df
Fix dirent64::namelen calculation (#1538)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
Worked fine on my machine where padding seemed to be all zeroed out
but that doesn't appear to be the case elsewhere.

Could try
https://codeberg.org/jbruchon/libjodycode/src/branch/master/dir.c#L92-L110
but needs to be tested.
2025-09-30 11:25:19 -05:00
trapexit
e6fcebe4f3
Misc build fixes (#1537)
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
2025-09-29 14:05:07 -05:00
trapexit
46f85c0f6d
Misc fixes, mostly for FreeBSD (#1536)
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
2025-09-28 23:17:51 -05:00
trapexit
7a9c3b7eb2
Remove need for and use of ioprio header (#1535)
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
2025-09-28 00:01:26 -05:00
trapexit
569a151da2
Add ability to proxy ioprio of client apps (#1534)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-09-26 11:36:56 -05:00
trapexit
2f3e807e9d
Add getdents based readdir functions for Linux (#1533)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-09-23 23:51:21 -05:00
trapexit
95ab37fdd2
Fix typo in visualization and add new vid to docs (#1532)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-09-22 16:23:50 -05:00
trapexit
1707dc27e3
Misc doc updates (#1531)
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
2025-09-21 14:25:24 -05:00
trapexit
c4126a0796
Add script to generate docs from scratch and push to github (#1530) 2025-09-21 13:04:55 -05:00
pjv
6acef3a638
Fix typo in moveonenospc.md (#1527)
typo
2025-09-21 11:42:15 -05:00
trapexit
b3656a0243
Fix broken doc links (#1525)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-09-19 19:25:31 -05:00
trapexit
41b40b94fa
Misc docs updates (#1524) 2025-09-19 19:20:28 -05:00
trapexit
ca59ae53a5
idmap mount support (#1523)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
* Add idmap mount support

* Further replacement of std::filesystem::path to fs::path

* Update docs regarding idmap support
2025-09-18 00:07:28 -05:00
trapexit
8c649d33ee
Start using std::filesystem::path for fusepath (#1522)
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
2025-09-17 22:51:16 -05:00
trapexit
f64ff9ca1e
Revert removal of readdir init setup, simplify cfg usage (#1520)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-09-06 11:03:51 -05:00
trapexit
99c28ad3bc
Add Ubuntu 25.04 builds (#1519)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-09-04 19:29:47 -05:00
trapexit
5becb334cd
Misc updates of docs (#1518)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-09-01 20:58:58 -05:00
trapexit
071af2e516
More build process updates (#1516)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-08-29 07:51:05 -05:00
trapexit
90b3585347
Update readme to match index of mkdocs (#1515)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-08-22 20:53:22 -05:00
trapexit
d7549f8d53
Fix string manipulation functions after refactor (#1514) 2025-08-22 19:42:31 -05:00
trapexit
6ac7f389c5
Misc changes (#1513)
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
* Start moving to string_view where possible
* Rework readdir object to use atomic load/store
2025-08-21 22:42:58 -05:00
trapexit
2101ef5bcc
Updates to docs, add nonraid, more intro to fs details (#1512)
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
2025-08-21 15:09:04 -05:00
Max.-F. Helm
dd1bea52cd
Allow empty lines in config ini files (#1509)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
* Allow empty lines in config files

* Add example comment to ini example in docs/quickstart.md

---------

Co-authored-by: Max-F-Helm <m7t24zklr@relay.firefox.com>
2025-08-13 20:00:05 -05:00
trapexit
df19f99976
Fix constructing string from attrval setxattr config (#1508)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-08-11 19:50:12 -05:00
trapexit
24e778b95a
Rework calculation of branch for release make targets (#1507)
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
2025-08-10 18:39:18 -05:00
trapexit
a8a7b34cf3
Add Debian 13 build targets (#1506) 2025-08-10 17:50:06 -05:00
trapexit
6ae9641bcc
Misc documentation updates (#1505) 2025-08-10 17:23:55 -05:00
trapexit
4439c2a030
Add setting of oom_score_adj (#1504)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
To limit risk of killing by OOM Killer.
2025-08-07 23:58:06 -05:00
trapexit
9872710720
More makefile tweaks, build log, smaller git clones (#1503)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-08-06 12:24:25 -05:00
trapexit
b18aba86b6
Build improvements (#1501)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
* Remove python dependency
* Remove ecfd
* Improve makefiles
* Make preload.so more 32bit compatible
2025-08-04 23:39:52 -05:00
trapexit
33fc26f81f
Cleanup copy functions (#1500)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-07-27 16:23:45 -05:00
trapexit
e8cd74cab0
Move everything to negative errno return types (#1499)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-07-25 17:53:48 -05:00
trapexit
2b500f194a
Rework of runtime interface (#1498)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
Also have special error handling for when branches are invalid and
ENOENT would be returned for getattr and readdir so users understand
what is going on and the runtime interface can still be used to fix
the problem.
2025-07-21 18:18:59 -05:00
trapexit
e87867cd2a
Clear O_NOFOLLOW when opening a relative fd (#1494)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-07-08 18:25:00 -05:00
trapexit
fa851eda3a
Ensure passthrough and keep_cache are mutually exclusive (#1493)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-07-06 18:31:47 -05:00
trapexit
f852474073
Update the secondary group cache (#1492)
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
* Use concurrent_flat_map to build a global cache rather than per
thread.
* Create global maintanence thread manager for clearing unused cache
entries.
2025-07-05 17:05:53 -05:00
trapexit
9e626228be
Add mergerfs.collect-info (#1491)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
A tool to collect info for support requests.
2025-07-03 20:18:05 -05:00
trapexit
71ddae8713
Misc documentation changes (#1489)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-06-29 19:08:57 -05:00
trapexit
e216a81a27
Rework movefile and cow break to use copyfile (#1488)
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
2025-06-28 17:27:40 -05:00
trapexit
264c5600f8
Misc cleanup (#1486)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
* Skip non-directories when loading branches
* Warn if branch doesn't exist
* Add braces to globbing
2025-06-25 22:43:49 -05:00
trapexit
be49dbe1bd
Remove linux only getdents in favor of readdir for FreeBSD sake (#1485)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-06-24 19:31:40 -05:00
trapexit
eb124316c9
Set default read thread count to 0 (#1484)
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
2025-06-23 22:39:42 -05:00
trapexit
77ef88b04c
Add fsck.mergerfs tool (#1483) 2025-06-23 21:57:55 -05:00
trapexit
34f07e57f5
Add RHEL/CentOS 10 build support (#1479)
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-06-09 14:33:55 -05:00
trapexit
095fcf82a3
Misc doc updates
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
2025-06-08 23:59:17 -05:00
trapexit
1b167d34d8
Spawn "mount" on branches when waiting for mounts enabled
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
2025-06-08 15:09:47 -05:00
trapexit
23824eaeb4
Misc cleanup
Some checks failed
CodeQL / Analyze (push) Has been cancelled
mkdocs / deploy (push) Has been cancelled
2025-06-06 19:10:19 -05:00
trapexit
e310d24615
Add support for FUSE passthrough
Some checks are pending
CodeQL / Analyze (push) Waiting to run
mkdocs / deploy (push) Waiting to run
2025-06-05 23:47:42 -05:00
trapexit
92312c8507
Add debugging of mutexes (#1470)
When DEBUG defined it will used timed locks which will log when held
too long along with where.
2025-05-26 00:44:39 -05:00
trapexit
4b751c2d37
Fix incorrect dyn cast (#1467) 2025-05-19 22:46:55 -05:00
trapexit
86b50d2d4e
Rework policies to return branches rather than path strings 2025-05-17 16:35:18 -05:00
trapexit
7e084ea7db
Update README.md to fix link (#1464) 2025-05-12 09:48:19 -05:00
trapexit
6eca711f58 Update mkdocs build action (#1458) 2025-05-10 12:56:10 -05:00
trapexit
923d9608e8
Add details to docs about FreeBSD limitations 2025-05-09 21:18:20 -05:00
trapexit
3a034712f6
Add versioning to docs using 'mike' 2025-05-08 19:53:54 -05:00
Zack Guo
5db04b4b5f
Update installation.md for SUSE 2025-05-08 07:44:57 -05:00
trapexit
fa3266ca7f
Add podman release build tooling + misc build fixes (#1455) 2025-05-08 00:00:53 -05:00
trapexit
344014aa81
Rework thread pool for increased stability + config and doc updates (#1453)
Also updates fmt to 11.2.0 and replaced syslog usage with a wrapper
leveraging fmt.
2025-05-05 18:28:49 -05:00
Solipsistmonkey
455a81290b
Fix build instructions typo
the location of install-build-pkgs was in buildtools and not tools
---------

Co-authored-by: Jesse Harwin <jesse@jharwin.com>
2025-04-28 14:00:20 -05:00
trapexit
deb54c58d8
Merge pull request #1448 from trapexit/defaultperms
Add config option to control default_permissions
2025-04-25 17:34:16 -05:00
Antonio SJ Musumeci
2b04a791b7 Add config option to control default_permissions
Defaults true but there might be some situations where it is useful to
disable.
2025-04-25 16:34:39 -05:00
trapexit
8ee998e8aa
Merge pull request #1447 from trapexit/branchcfg
Improve mount waiting + misc doc improvements
2025-04-23 16:40:26 -05:00
Antonio SJ Musumeci
de2a82800a Improve mount waiting + misc doc improvements
Adds user.mergerfs.branch and user.mergerfs.branch_mounts_here
Adds .mergerfs.branch and .mergerfs.branch_mounts_here files.
2025-04-23 15:58:36 -05:00
trapexit
212681ddc5
Merge pull request #1445 from trapexit/docs
Misc doc updates + add logo
2025-04-19 22:45:27 -05:00
Antonio SJ Musumeci
9dac54f223 Misc doc updates + add logo 2025-04-19 22:44:08 -05:00
trapexit
78fa34098e
Merge pull request #1444 from trapexit/docs
Add FAQ entry regarding OS support
2025-04-15 23:41:45 -05:00
Antonio SJ Musumeci
54681e885a Add FAQ entry regarding OS support 2025-04-15 23:40:42 -05:00
trapexit
de5a871326
Merge pull request #1443 from trapexit/inode
Change the "devino" inode calculation
2025-04-15 19:29:43 -05:00
Antonio SJ Musumeci
77bf16e9ae Change the "devino" inode calculation
Use hashing of branch path rather than use st_dev.
2025-04-15 18:54:51 -05:00
trapexit
ad54c8be19
Merge pull request #1441 from trapexit/docs
Add doc pages for minfreespace and moveonenospc + other misc updates
2025-04-10 23:00:43 -05:00
Antonio SJ Musumeci
c769e959e8 Add doc pages for minfreespace and moveonenospc + other misc updates 2025-04-10 22:59:49 -05:00
trapexit
1f3ebcf418
Merge pull request #1439 from trapexit/statx
Add statx support
2025-04-04 22:25:30 -05:00
Antonio SJ Musumeci
80085c9844 Add statx support 2025-04-04 22:23:16 -05:00
trapexit
b85cc8c370
Merge pull request #1438 from trapexit/docs
Update docs regarding error handling
2025-04-04 18:42:37 -05:00
Antonio SJ Musumeci
95732222d9 Update docs regarding error handling 2025-04-04 18:41:58 -05:00
trapexit
17a551d0a4
Merge pull request #1435 from trapexit/rapidhash
Replace usage of wyhash with rapidhash
2025-03-30 18:03:35 -05:00
Antonio SJ Musumeci
f74dc36e92 Replace usage of wyhash with rapidhash
https://github.com/Nicoshev/rapidhash
2025-03-30 17:57:20 -05:00
trapexit
764bd8f7be
Merge pull request #1434 from trapexit/change-defaults
Change misc defaults
2025-03-30 17:25:18 -05:00
Antonio SJ Musumeci
b7f7f7fa97 Change misc defaults
* category.create=pfrd
* moveonenospc=pfrd
* cache.files=off
* parallel-direct-writes=true

These changes were made to match the recommended settings for most
users to reduce confusion.
2025-03-30 17:22:38 -05:00
trapexit
7f410073d4
Merge pull request #1433 from trapexit/maxpages
Support Linux v6.13 FUSE max_page_limit
2025-03-30 00:09:03 -05:00
Antonio SJ Musumeci
92ae63e842 Support Linux v6.13 FUSE max_page_limit 2025-03-30 00:07:08 -05:00
trapexit
d31e97e64c
Merge pull request #1431 from trapexit/docs
Add links to options docs page to individual pages
2025-03-27 19:55:19 -05:00
Antonio SJ Musumeci
579690f411 Add links to options docs page to individual pages 2025-03-27 19:47:37 -05:00
trapexit
ca449a73be
Merge pull request #1429 from trapexit/docs
Update docs on default create policy
2025-03-26 14:34:28 -05:00
Antonio SJ Musumeci
2d86ed946a Update docs on default create policy 2025-03-26 14:33:11 -05:00
trapexit
3e454f528c
Merge pull request #1426 from trapexit/docs
Misc doc updates
2025-03-12 18:30:21 -05:00
Antonio SJ Musumeci
a4fdbae1ca Misc doc updates 2025-03-12 18:29:38 -05:00
trapexit
aff66812c0
Merge pull request #1425 from trapexit/docs-tips
Misc doc updates
2025-03-08 22:03:14 -06:00
Antonio SJ Musumeci
6472ac51e9 Misc doc updates 2025-03-08 22:02:34 -06:00
trapexit
d3770802b1
Merge pull request #1423 from trapexit/docs-inotify
Add FAQ entry regarding inotify
2025-03-05 16:59:45 -06:00
Antonio SJ Musumeci
bcbff5c82e Add FAQ entry regarding inotify 2025-03-05 16:58:27 -06:00
trapexit
09743ee187
Merge pull request #1416 from trapexit/docs
Add FAQ section on common perceived problems
2025-02-22 22:30:28 -06:00
Antonio SJ Musumeci
3a33a6db2b Add FAQ section on common perceived problems 2025-02-22 22:25:39 -06:00
trapexit
c0d5f4795a
Merge pull request #1415 from trapexit/docs
Update docs on out-of-band usage
2025-02-19 14:13:32 -06:00
Antonio SJ Musumeci
ef9074ab4a Update docs on out-of-band usage 2025-02-19 14:13:06 -06:00
trapexit
2d03b89c2d
Merge pull request #1414 from theHenMan/patch-2
Update terminology.md
2025-02-19 00:09:55 -06:00
trapexit
64cc63b2bc
Merge pull request #1413 from theHenMan/patch-1
Update quickstart.md
2025-02-18 23:04:59 -06:00
Hennie Botha
514c478a39
Update terminology.md
Fixed typo
2025-02-19 07:04:11 +02:00
Hennie Botha
8179f91c48
Update quickstart.md
Fixed a typo
2025-02-19 07:02:22 +02:00
trapexit
371764d800
Merge pull request #1412 from trapexit/docs
Rework questions on what settings and policies to use
2025-02-11 19:47:18 -06:00
Antonio SJ Musumeci
1c44ef7967 Rework questions on what settings and policies to use 2025-02-11 19:46:33 -06:00
trapexit
aa97bac533
Merge pull request #1409 from trapexit/docs
Add details about logging to syslog
2025-01-25 20:58:57 -06:00
Antonio SJ Musumeci
12d6302457 Add details about logging to syslog 2025-01-25 20:56:28 -06:00
trapexit
740fc3f84a
Merge pull request #1408 from trapexit/docs
Add details about user namespacing and root squashing
2025-01-25 13:54:43 -06:00
Antonio SJ Musumeci
f18719ced2 Add details about user namespacing and root squashing 2025-01-25 13:54:06 -06:00
trapexit
366f5fcc4c
Merge pull request #1407 from trapexit/docs
Misc doc updates
2025-01-25 13:02:36 -06:00
Antonio SJ Musumeci
1729835b8c Misc doc updates 2025-01-25 13:00:00 -06:00
trapexit
1180fd6dd3
Merge pull request #1402 from trapexit/docs
Doc and mover script updates
2025-01-20 01:45:51 -06:00
Antonio SJ Musumeci
19509e33d2 Doc and mover script updates 2025-01-20 01:43:58 -06:00
trapexit
8f355d7dd5
Merge pull request #1399 from oregonpillow/master
Readability changes to mkdocs installation
2025-01-18 15:21:20 -06:00
debian
2aa9697c87 re-order OS, shorten Debian based OS instructions 2025-01-18 01:14:50 +01:00
trapexit
978d067921
Merge pull request #1398 from trapexit/freebsd
Improve FreeBSD compatibility
2025-01-15 22:16:13 -06:00
Antonio SJ Musumeci
b83bd5fd14 Improve FreeBSD compatibility
First draft. Need to investigate why upstream patches include certain
function that appear to exist in FreeBSD 14.2.
2025-01-15 22:10:02 -06:00
trapexit
dd906c8a4c
Merge pull request #1395 from oregonpillow/latest-release
fix edit uri
2025-01-11 18:07:15 -06:00
debian
6fb9111c03 fix edit uri 2025-01-12 00:56:39 +01:00
trapexit
bc382e0fd2
Merge pull request #1392 from trapexit/usr1
Send invalidate node request outside lock
2025-01-10 00:35:59 -05:00
trapexit
0197984db3 Send invalidate node request outside lock 2025-01-09 23:22:07 -06:00
trapexit
248b1aca1c
Merge pull request #1391 from trapexit/cpp
Move fuse.c and fuse_lowlevel.c to C++
2025-01-09 20:10:35 -05:00
Antonio SJ Musumeci
9056898bbf Move fuse.c and fuse_lowlevel.c to C++ 2025-01-09 19:05:32 -06:00
trapexit
5e584f246a
Merge pull request #1390 from trapexit/tiered
Add tiered cache details to docs
2025-01-08 00:56:48 -05:00
Antonio SJ Musumeci
7e964283b9 Add tiered cache details to docs 2025-01-07 23:55:13 -06:00
trapexit
03dc17fff2
Merge pull request #1389 from trapexit/misc
Update funding and cirrus builds
2025-01-07 00:18:32 -05:00
Antonio SJ Musumeci
8cb68dce4a Update funding and cirrus builds 2025-01-06 23:07:33 -06:00
trapexit
28260c434a
Merge pull request #1388 from trapexit/mkdocs
Update README to point to docs, update project comparisons
2025-01-05 23:40:54 -06:00
Antonio SJ Musumeci
fae9b993fe Update README to point to docs, update project comparisons 2025-01-05 23:39:48 -06:00
trapexit
171eb9c7c0
Merge pull request #1387 from trapexit/workflows
Fix pip install in mkdocs workflow
2025-01-03 12:41:47 -06:00
Antonio SJ Musumeci
174e703d2e Fix pip install in mkdocs workflow 2025-01-03 12:40:50 -06:00
trapexit
efd0dfaa2f
Merge pull request #1386 from trapexit/docs
Rework mkdocs based documentation
2025-01-03 12:33:54 -06:00
Antonio SJ Musumeci
75d7a93724 Rework mkdocs based documentation
Lots of restructoring and extra information.
2025-01-03 12:17:26 -06:00
Timothy Pillow
50fa7ac694
add mkdocs
Initial commit of a mkdocs based docs setup
2024-12-21 09:36:07 -06:00
trapexit
7d64a47b88
Merge pull request #1377 from trapexit/movecopy-readme
Add FAQ entry on 'move' and 'copy'
2024-11-30 00:23:39 -06:00
Antonio SJ Musumeci
5fba42f076 Add FAQ entry on 'move' and 'copy' 2024-11-30 00:12:44 -06:00
trapexit
b0bb7ef38c
Merge pull request #1346 from grunthos503/master
Add missing --relative flag to rsync in percent-full mover script
2024-07-18 15:28:42 -05:00
Alan Millar
85ce7d6178 Add missing --relative flag to rsync in percent-full mover script 2024-07-18 12:14:02 -07:00
trapexit
40359df453
Merge pull request #1342 from techie2000/patch-2
Update README.md
2024-07-18 13:50:29 -05:00
techie2000
9b2a5a75ee
Update README.md
Correcting a couple of typos.
Enhancing readability.
2024-06-28 10:15:02 +01:00
trapexit
b21172c609
Merge pull request #1321 from trapexit/allowmmap
Add support for 'direct-io-allow-mmap' if supported by kernel
2024-03-21 21:54:04 -04:00
Antonio SJ Musumeci
f0444a1ca9 Add support for 'direct-io-allow-mmap' if supported by kernel 2024-03-21 20:48:42 -05:00
trapexit
977d04229f
Merge pull request #1320 from trapexit/readme
Suggest cache.files=auto-full rather than partial
2024-03-21 21:36:27 -04:00
Antonio SJ Musumeci
757ae66327 Suggest cache.files=auto-full rather than partial 2024-03-17 00:47:33 -05:00
trapexit
42d0b5734c
Merge pull request #1312 from trapexit/preload-tmpfile
Special case O_TMPFILE in preload
2024-02-29 15:41:22 -05:00
Antonio SJ Musumeci
78050ed6b0 Special case O_TMPFILE in preload 2024-02-29 14:33:27 -06:00
trapexit
19ee44afe7
Merge pull request #1309 from trapexit/root-nodeid
Root nodeid
2024-02-25 18:29:58 -05:00
Antonio SJ Musumeci
a234e9446c Update README to remove unnecessary references to export-support for NFS 2024-02-25 17:27:08 -06:00
Antonio SJ Musumeci
951eb9540d Ensure lookups of FUSE_ROOT_ID always return generation=0 2024-02-25 17:14:15 -06:00
trapexit
85a936c95e
Merge pull request #1308 from trapexit/readme
Change mount type from fuse.mergerfs to mergerfs in README
2024-02-24 02:09:40 -05:00
Antonio SJ Musumeci
8210e63a66 Change mount type from fuse.mergerfs to mergerfs in README 2024-02-24 01:08:30 -06:00
trapexit
facdb66746
Merge pull request #1307 from trapexit/readme
Add NFS options to remote filesystems section of readme
2024-02-19 19:20:41 -06:00
Antonio SJ Musumeci
1916e54a24 Add NFS options to remote filesystems section of readme 2024-02-19 19:19:00 -06:00
trapexit
7fabe515f4
Merge pull request #1306 from trapexit/export-support
Add export-support option as possible workaround for NFS EIO issues
2024-02-19 19:00:54 -06:00
Antonio SJ Musumeci
0ca5d6aad0 Add export-support option as possible workaround for NFS EIO issues 2024-02-19 18:58:50 -06:00
trapexit
0c1aeb411d
Merge pull request #1305 from trapexit/lib-updates
Library updates
2024-02-18 17:56:39 -06:00
Antonio SJ Musumeci
17fdbf7f42 Update fuse_kernel.h 2024-02-18 17:50:34 -06:00
Antonio SJ Musumeci
27349e41ef Update fmt 2024-02-18 17:24:18 -06:00
Antonio SJ Musumeci
b3ce95c422 Update nonstd::optional 2024-02-18 17:24:18 -06:00
Antonio SJ Musumeci
cedc9f0f25 Update ghc::filesystem 2024-02-18 17:24:18 -06:00
trapexit
d68ad9ac01
Expand the preload docs (#1299) 2024-01-30 00:03:39 -06:00
trapexit
ae6c4f7c25
Rework mergerfs vs X section of readme (#1298) 2024-01-28 18:12:29 -06:00
trapexit
87475098a1
Add credit to nohajc for preload idea (#1295) 2024-01-22 12:52:51 -06:00
trapexit
d4dc0701d6
Create ld_preload to reopen files on underlying filesystem (#1294) 2024-01-22 12:42:55 -06:00
0x6d61726b
c1c2f075ee
Update README.md (#1283)
* Update README.md

Information added that mergerfs v2.35.0 and newer sets `allow_other` (but not 2.33.5, that is used by Debian 12.2)
2023-12-01 15:45:13 -06:00
trapexit
96d34f1eab
Merge pull request #1280 from trapexit/getpid
Fix user.mergerfs.pid
2023-11-11 19:48:28 -06:00
Antonio SJ Musumeci
f66fb7e2d4 Fix user.mergerfs.pid 2023-11-11 19:03:32 -06:00
trapexit
edb3368078
Merge pull request #1277 from trapexit/flushdefault
Set flush-on-close default to opened-for-write
2023-10-31 23:26:08 -05:00
Antonio SJ Musumeci
bd70928268 Set flush-on-close default to opened-for-write 2023-10-31 09:23:52 -05:00
trapexit
337aade02d
Merge pull request #1276 from trapexit/allowother
Only set allow_other when running as root
2023-10-29 02:54:51 -05:00
Antonio SJ Musumeci
d6a2f06797 Only set allow_other when running as root 2023-10-29 01:44:18 -05:00
trapexit
7890a4996c
Merge pull request #1275 from trapexit/noflush
Add flushonclose feature
2023-10-28 19:49:17 -05:00
Antonio SJ Musumeci
6aa6452d3e Add flushonclose feature 2023-10-28 19:47:23 -05:00
trapexit
7d6c8e9333
Merge pull request #1271 from trapexit/warn-root
Warn if not running as root
2023-10-22 00:45:41 -05:00
Antonio SJ Musumeci
a7069153bd Warn if not running as root 2023-10-22 00:43:19 -05:00
trapexit
5c71a75fdd
Merge pull request #1269 from trapexit/wyhash
Update wyhash to 4.2
2023-10-21 18:04:14 -05:00
Antonio SJ Musumeci
fd33df04a3 Update wyhash to 4.2 2023-10-21 18:03:05 -05:00
trapexit
a9ae36a3e4
Merge pull request #1263 from trapexit/pthread_getname_np
Remove use of pthread_getname_np to work with older musl versions
2023-10-14 01:20:00 -05:00
Antonio SJ Musumeci
569537df9e Remove use of pthread_getname_np to work with older musl versions 2023-10-14 01:15:29 -05:00
trapexit
8534ee7ceb
Merge pull request #1262 from trapexit/readdir-errs
Rework thread pool queue depth impl
2023-10-14 01:13:48 -05:00
Antonio SJ Musumeci
620cab2948 Rework thread pool queue depth impl 2023-10-14 00:58:10 -05:00
trapexit
8635456818
Merge pull request #1254 from trapexit/typo
Fix readdir doc typos
2023-09-23 14:54:25 -05:00
Antonio SJ Musumeci
0888f372aa Fix readdir doc typos 2023-09-23 14:53:41 -05:00
trapexit
e09b10c55b
Merge pull request #1249 from trapexit/tpfix
Fix thread pool destruction where threads don't explicitly exit themselves
2023-09-09 17:07:51 -05:00
Antonio SJ Musumeci
766b923116 Fix thread pool destruction where threads don't explicitly exit themselves 2023-09-09 16:48:47 -05:00
trapexit
dd7e9e2aa7
Merge pull request #1244 from trapexit/docs
Add some new questions to FAQ
2023-09-05 22:56:50 -05:00
Antonio SJ Musumeci
3fc0aa3809 Add some new questions to FAQ 2023-09-05 22:56:08 -05:00
trapexit
b1dcc94e98
Merge pull request #1242 from trapexit/debug-removal
Remove unneeded debug logging from thread pool
2023-09-04 18:40:38 -05:00
Antonio SJ Musumeci
6d2c99e487 Remove unneeded debug logging from thread pool 2023-09-04 18:39:43 -05:00
trapexit
9d9eacfe7b
Merge pull request #1241 from trapexit/version
Add website and license to version option
2023-09-04 16:02:24 -05:00
Antonio SJ Musumeci
b91cc1c191 Add website and license to version option 2023-09-04 15:57:47 -05:00
trapexit
6d2f26c60e
Merge pull request #1240 from trapexit/dynamic-threadpool
Rework thread pool, add ability to add/remove threads at runtime
2023-09-03 23:37:29 -05:00
Antonio SJ Musumeci
0a94bd7cfc Rework thread pool, add ability to add/remove threads at runtime 2023-09-03 23:36:03 -05:00
trapexit
211e6c7115
Merge pull request #1239 from trapexit/validation
Add proper input validation for readdir policy
2023-09-02 15:48:43 -05:00
Antonio SJ Musumeci
335ca55a6e Add proper input validation for readdir policy 2023-09-02 15:47:49 -05:00
trapexit
69de4de53f
Merge pull request #1238 from trapexit/boundedqueue
Change threadpool to use concurrentqueue
2023-09-02 00:47:26 -05:00
Antonio SJ Musumeci
76c8d48dbd Change threadpool to use concurrentqueue 2023-09-02 00:45:47 -05:00
trapexit
a927a15e9c
Merge pull request #1237 from trapexit/threadfix
Initialize readdir threadpool after daemonizing
2023-08-28 22:48:59 -05:00
Antonio SJ Musumeci
0c555e71a0 Initialize readdir threadpool after daemonizing 2023-08-28 22:47:04 -05:00
trapexit
82781b6ff8
Merge pull request #1235 from DavidFair/readme_direct_parallel
Docs: clarify parallel-direct-writes and cache.files
2023-08-26 18:52:57 -05:00
David Fairbrother
b545352712 Nit: cache.files=per-process grammar
Change which 'comm' name -> whose 'comm' name.
Whose implies possession, and the process possess the name we're
matching
2023-08-26 21:27:16 +01:00
David Fairbrother
3d05999db0 State cache.files per-process behaviour w/out match
This makes it clear, along with the previous commit, that per-process will allow
us to use parallel direct writes as they will mount with the equivalent
of cache.files=off (i.e. direct_io)
2023-08-26 21:24:34 +01:00
David Fairbrother
f4a8105a42 Clarify parallel direct writes conditions
Clarify that paralell direct can only be enabled where the kernel
version supports it, which is 6.2+.

State the two cache.files modes which can support parallel direct writes
in the description.
2023-08-26 21:22:37 +01:00
trapexit
004b616115
Merge pull request #1234 from trapexit/fixes
Misc fixes for older platforms
2023-08-22 08:13:56 -05:00
Antonio SJ Musumeci
8d7017273f Misc fixes for older platforms 2023-08-22 08:10:55 -05:00
trapexit
51b65cd126
Merge pull request #1233 from trapexit/atomic
Use relaxed memory order for atomic counters
2023-08-21 17:19:09 -05:00
Antonio SJ Musumeci
0ed03a1535 Use relaxed memory order for atomic counters 2023-08-21 15:43:03 -05:00
trapexit
b6d3c34d3f
Merge pull request #1232 from trapexit/wyhash
Update wyhash to final4
2023-08-21 00:20:04 -05:00
Antonio SJ Musumeci
fdecabfaab Update wyhash to final4 2023-08-21 00:18:41 -05:00
trapexit
3a1d8e03a1
Merge pull request #1231 from trapexit/readdir
Fix setting of ugids for concurrent readdir
2023-08-20 23:12:56 -05:00
Antonio SJ Musumeci
e586d2fd1e Fix setting of ugids for concurrent readdir 2023-08-20 23:06:05 -05:00
trapexit
e0087cd8a7
Merge pull request #1228 from trapexit/threading
Add thread names for easier debugging
2023-08-14 17:52:31 -05:00
Antonio SJ Musumeci
2377cb05b6 Add thread names for easier debugging 2023-08-14 17:51:41 -05:00
trapexit
a8ffbc84f6
Merge pull request #1227 from trapexit/gidcache
Add ability to invalidate gid cache on demand
2023-08-13 23:32:33 -05:00
Antonio SJ Musumeci
0aafdefc18 Add ability to invalidate gid cache on demand
SIGUSR2 or ioctl
2023-08-13 23:30:52 -05:00
trapexit
7221fded71
Merge pull request #1226 from feltcat/feltcat-patch-1
Fix a typo in README.md
2023-08-13 23:13:30 -05:00
feltcat
7a09f560f7
Fix a typo in README.md 2023-08-14 03:45:01 +00:00
trapexit
8b769dff7f
Merge pull request #1225 from trapexit/new-funcs
Add callbacks for newer functions
2023-08-13 17:46:09 -05:00
Antonio SJ Musumeci
6dcf6111af Add callbacks for newer functions
* setupmapping
* removemapping
* syncfs
* tmpfile
2023-08-13 17:38:13 -05:00
trapexit
9849bcd3cf
Merge pull request #1224 from trapexit/readdir
Add readdir policies
2023-08-11 00:05:28 -05:00
Antonio SJ Musumeci
c92a10021e Add readdir policies 2023-08-11 00:05:14 -05:00
trapexit
d817fa4e97
Merge pull request #1220 from trapexit/fix-logging
Fix logging pin-threads details
2023-07-30 23:14:16 -05:00
Antonio SJ Musumeci
eb141c4c4e Fix logging pin-threads details 2023-07-30 23:13:14 -05:00
trapexit
282ce08ddb
Merge pull request #1219 from trapexit/fuse-config
Move fuse thread args out of fuse session object
2023-07-30 22:56:27 -05:00
Antonio SJ Musumeci
51d97bb444 Move fuse thread args out of fuse session object 2023-07-30 22:52:43 -05:00
trapexit
539f2221a3
Merge pull request #1213 from trapexit/lib-updates
Lib updates
2023-07-15 18:51:43 -04:00
Antonio SJ Musumeci
2b1804d364 Add a DEPENDENCIES file to list dependencies
Mostly to remind myself which libs to update on occasion
2023-07-15 17:49:57 -05:00
Antonio SJ Musumeci
556c6522c0 Update fmt to v10.0.0 2023-07-15 17:47:36 -05:00
Antonio SJ Musumeci
543603bdfc Update ghc::filesystem to v1.5.14 2023-07-15 14:47:44 -05:00
trapexit
7a86ed6508
Merge pull request #1212 from trapexit/erofs
Create functions can set branches RO on EROFS
2023-07-13 22:34:29 -04:00
Antonio SJ Musumeci
707d298d7c Create functions can set branches RO on EROFS 2023-07-13 21:19:13 -05:00
trapexit
36a4b7a23a
Merge pull request #1209 from trapexit/o_direct
Align msg buffer memory to allow O_DIRECT to work
2023-07-09 19:39:52 -04:00
Antonio SJ Musumeci
22833bdfe2 Align msg buffer memory to allow O_DIRECT to work 2023-07-09 15:32:11 -05:00
trapexit
775c3cad90
Merge pull request #1208 from trapexit/syslog
Simplify syslog wrapper a bit
2023-07-06 00:15:57 -05:00
Antonio SJ Musumeci
fa537961c5 Simplify syslog wrapper a bit 2023-07-06 00:13:42 -05:00
trapexit
ee13810f3b
Merge pull request #1207 from trapexit/atomic
Fix build on older distros due to std::atomic definitions
2023-07-02 23:57:45 -05:00
Antonio SJ Musumeci
5d6c9cc56a Fix build on older distros due to std::atomic definitions
std::atomic_uint64_t missing in some older distros
2023-07-02 23:46:46 -05:00
trapexit
832903378e
Merge pull request #1206 from trapexit/write-errs
Fix error handling for cached writes
2023-06-29 22:51:34 -05:00
Antonio SJ Musumeci
2722f4f64d Fix error handling for cached writes 2023-06-29 22:50:24 -05:00
trapexit
7cdd12bda4
Merge pull request #1204 from trapexit/gc
Add manual GC triggering + configurable process queue depth
2023-06-26 23:26:47 -05:00
Antonio SJ Musumeci
5ab0fbcaee Add manual GC triggering + configurable process queue depth
Yes, these are unrelated changes but somehow ended up being
prototyped together and I'm too lazy to separate them.
2023-06-26 22:44:23 -05:00
trapexit
42836e0961
Merge pull request #1203 from trapexit/append-move
Fix move when in append mode + fix read/write direct_io vs cached behavior
2023-06-24 23:13:57 -05:00
Antonio SJ Musumeci
6a14a10e6c Fix read/write behavior and return value depending on direct_io
Also add parallel direct write option for 6.2+ kernels.
2023-06-24 23:06:14 -05:00
Antonio SJ Musumeci
82430e1079 Fix moveonenospc when file opened with append mode 2023-06-12 23:40:08 -05:00
trapexit
701f88de43
Merge pull request #1171 from trapexit/srcmounts
Make srcmounts readonly
2023-04-05 22:31:29 -04:00
Antonio SJ Musumeci
c72997f298 Make srcmounts readonly
All tools only read from srcmounts and the current setup had a bug
which caused branch mode and minfreespace to be stripped when using
config file.
2023-04-05 22:24:24 -04:00
trapexit
c681d6c2fe
Merge pull request #1170 from trapexit/fuse_destroy
Fix crash when exiting with open deleted files
2023-04-05 00:35:04 -04:00
Antonio SJ Musumeci
6bc3d77992 Fix crash when exiting with open deleted files 2023-04-05 00:32:30 -04:00
trapexit
c266bae96d
Merge pull request #1166 from trapexit/docs
Remove duplicate entries in docs
2023-04-01 14:41:33 -04:00
Antonio SJ Musumeci
cdcfef2ceb Remove duplicate entries in docs 2023-04-01 14:40:49 -04:00
trapexit
7a62a629b9
Merge pull request #1165 from trapexit/thread-defaults
Change default read-thread-count from -1 to 0 as documented
2023-03-31 13:38:08 -04:00
Antonio SJ Musumeci
0a64d74b4b Change default read-thread-count from -1 to 0 as documented 2023-03-31 12:54:57 -04:00
trapexit
26c8b5c642
Merge pull request #1161 from trapexit/fix
Workaround older gcc bug with namespacing std::hash
2023-03-28 21:57:51 -04:00
Antonio SJ Musumeci
26fd11cb4d Workaround older gcc bug with namespacing std::hash 2023-03-28 21:53:38 -04:00
trapexit
cdceade1ae
Merge pull request #1159 from trapexit/wait
More actively report to syslog when waiting for branches to mount
2023-03-28 19:03:50 -04:00
Antonio SJ Musumeci
eebd6e9eb4 Actively report to syslog when waiting for mounts 2023-03-28 19:01:21 -04:00
trapexit
9744eab819
Merge pull request #1156 from trapexit/options
Fix loading readonly / write once options from file
2023-03-19 23:41:15 -04:00
Antonio SJ Musumeci
1c5b0f2f5f Fix loading readonly / write once options from file 2023-03-19 23:40:32 -04:00
trapexit
d9033b7713
Merge pull request #1155 from trapexit/mover-scripts
Fix mover script link typo
2023-03-19 22:08:31 -04:00
Antonio SJ Musumeci
b1d11779f0 Fix mover script link typo 2023-03-19 22:07:03 -04:00
trapexit
be19b9ce71
Merge pull request #1154 from trapexit/mover-scripts
Move tiered cache mover scripts to files in tools dir
2023-03-19 22:03:31 -04:00
Antonio SJ Musumeci
9fcaf6a674 Move tiered cache mover scripts to files in tools dir 2023-03-19 01:23:19 -04:00
trapexit
2dd4b788ce
Merge pull request #1153 from trapexit/readme
Misc README updates
2023-03-18 21:48:16 -04:00
Antonio SJ Musumeci
5152c63480 Misc README updates 2023-03-18 21:47:37 -04:00
trapexit
bd02bfd54c
Merge pull request #1151 from kephir4eg/master
Fix config file parsing
2023-03-11 00:45:24 -05:00
Ilya Taranov
d04e04e89a Fix config file parsing 2023-03-10 20:55:20 -08:00
trapexit
10a9969a64
Merge pull request #1149 from trapexit/readahead
Add ability to set readahead of mergerfs and branches
2023-03-09 00:13:49 -05:00
Antonio SJ Musumeci
486c5d3734 Add ability to set readahead of mergerfs and branches 2023-03-09 00:12:57 -05:00
trapexit
55bd0ca25a
Merge pull request #1147 from trapexit/readme
Update README regarding why epmfs is default
2023-03-06 23:26:00 -05:00
Antonio SJ Musumeci
ee2855bb38 Update README regarding why epmfs is default 2023-03-06 23:25:42 -05:00
trapexit
65c004a309
Merge pull request #1146 from jonaswinkler/master
Fix typo in basic setup options
2023-03-06 09:26:21 -05:00
Jonas Winkler
a598f63235
Update README.md 2023-03-06 15:17:00 +01:00
trapexit
6e845b337a
Merge pull request #1145 from trapexit/readme
Lots of misc README updates
2023-03-05 01:43:08 -05:00
Antonio SJ Musumeci
e25fa1954e Lots of misc README updates 2023-03-05 01:42:42 -05:00
trapexit
b48d368130
Merge pull request #1143 from trapexit/rework-read
Rework fuse read to use same buffers as messages
2023-02-26 23:37:14 -05:00
Antonio SJ Musumeci
373d331f39 Rework fuse read to use same buffers as messages 2023-02-26 23:31:44 -05:00
trapexit
4a647beec1
Merge pull request #1142 from trapexit/remove-splice
Remove splicing features
2023-02-26 01:45:29 -05:00
Antonio SJ Musumeci
84592a9f13 Remove splicing features
After numerous tests it was found the splice features were at best
the same performance as standard IO and at worse actually slower.
To simplify the code all splice features are removed.
2023-02-26 01:42:58 -05:00
trapexit
09fbb80f8c
Merge pull request #1140 from trapexit/pinthreads
Add ability to pin read and processing threads
2023-02-20 22:45:54 -05:00
Antonio SJ Musumeci
34310170ac Add ability to pin read and processing threads 2023-02-19 17:52:29 -05:00
trapexit
e39ace0eba
Merge pull request #1139 from trapexit/per-process-page-cache
Add "per-process" file caching feature
2023-02-18 01:34:37 -05:00
Antonio SJ Musumeci
9effeb6869 Add "per-process" file caching feature
Allows chosing page caching based on process name.
2023-02-18 01:16:36 -05:00
trapexit
b51a5970b2
Merge pull request #1137 from trapexit/btrfs-ioctl
Return NOTTY for all btrfs ioctl calls
2023-02-11 10:25:09 -05:00
Antonio SJ Musumeci
2d9c915641 Return NOTTY for all btrfs ioctl calls
mergerfs tries to pass through ioctl calls but due to the complexity
of btrfs calls their is risk of segfaults. In the future it may be
required to whitelist all supported ioctl calls.
2023-02-11 10:07:55 -05:00
trapexit
737e59d232
Merge pull request #1133 from trapexit/lazy-umount
Add option to lazy umount target mount point
2023-02-02 22:12:17 -05:00
Antonio SJ Musumeci
9adddfc66d Add option to lazy umount target mount point 2023-02-02 21:20:23 -05:00
trapexit
9a6b7835f4
Merge pull request #1131 from trapexit/docs
Add more apps to section on sqlite3 mmap problems
2023-01-29 23:57:46 -05:00
Antonio SJ Musumeci
ac4e097511 Add more apps to section on sqlite3 mmap problems 2023-01-29 23:56:50 -05:00
trapexit
3d73c6a596
Merge pull request #1130 from trapexit/docs
Update README regarding requesting support and policy descriptions
2023-01-29 23:24:33 -05:00
Antonio SJ Musumeci
9670fb9704 Update README regarding requesting support and policy descriptions 2023-01-29 23:24:09 -05:00
trapexit
e2ece936e6
Merge pull request #1129 from trapexit/fuse-version
Remove FUSE_USE_VERSION, no longer used
2023-01-29 18:27:26 -05:00
Antonio SJ Musumeci
a4491169b0 Remove FUSE_USE_VERSION, no longer used 2023-01-29 17:04:08 -05:00
trapexit
0d566befba
Merge pull request #1128 from trapexit/checkbranches
Forbid adding mountpoint to branch list
2023-01-29 15:50:25 -05:00
Antonio SJ Musumeci
3e313cd605 Forbid adding mountpoint to branch list 2023-01-29 11:51:56 -05:00
trapexit
5bf2a2be59
Merge pull request #1127 from trapexit/bugfixes
Backport bug fixes from libfuse3
2023-01-28 01:17:50 -05:00
Antonio SJ Musumeci
7ed91c1668 Backport bug fixes from libfuse3 2023-01-28 01:17:07 -05:00
trapexit
041e3f50d5
Merge pull request #1126 from trapexit/removeallowother
Hard code setting of allow_other, ignore when set
2023-01-26 23:40:12 -05:00
Antonio SJ Musumeci
92ccfd3c89 Hard code setting of allow_other, ignore when set 2023-01-26 23:37:37 -05:00
trapexit
24f2d3c94d
Merge pull request #1125 from trapexit/scheduling-priority
Allow setting of scheduling priority
2023-01-25 23:42:20 -05:00
Antonio SJ Musumeci
a7113bb163 Allow setting of scheduling priority 2023-01-25 23:38:31 -05:00
trapexit
ec5ac0c517
Merge pull request #1124 from trapexit/builds
Update CirrusCI setup
2023-01-25 20:24:52 -05:00
Antonio SJ Musumeci
fdec3355a1 Update CirrusCI setup 2023-01-25 20:12:53 -05:00
trapexit
16e9ba2f19
Merge pull request #1123 from trapexit/wait
Add option to wait for branches to become new mounts
2023-01-25 19:51:58 -05:00
Antonio SJ Musumeci
939eb3996a Add option to wait for branches to become new mounts
branches-mount-timeout=UINT64 in seconds (default: 0)
2023-01-25 11:59:14 -05:00
trapexit
2d8d0f7ad6
Merge pull request #1120 from trapexit/nonempty
Remove 'nonempty' argument
2023-01-16 23:41:51 -05:00
Antonio SJ Musumeci
3ee93d4c56 Remove 'nonempty' argument
This makes it like all other filesystems and brings it into alignment
with libfuse3's behavior.
2023-01-16 23:33:36 -05:00
trapexit
0b2afda30e
Merge pull request #1119 from trapexit/useino
Remove use_ino option and make behavior same as if set
2023-01-16 16:53:30 -05:00
Antonio SJ Musumeci
d11807ef7c Remove use_ino option and make behavior same as if set 2023-01-16 16:21:44 -05:00
trapexit
3e725a66e3
Merge pull request #1118 from trapexit/msghandling
Add async message processing
2023-01-16 13:41:00 -05:00
Antonio SJ Musumeci
24423b8d2a Add async message processing 2023-01-16 13:15:53 -05:00
trapexit
c89fbde48d
Merge pull request #1116 from davidkaufman/patch-1
small grammar correction to README file
2023-01-13 13:47:07 -05:00
David Kaufman
b65e52d56b
small grammar correction to README file
sorry, i'm a grammar nerd with ocd :-)
2023-01-03 00:58:08 -05:00
trapexit
6c2db76b92
Merge pull request #1109 from trapexit/fixes
Fix regression testing for implemented functions
2022-12-11 14:44:54 -05:00
Antonio SJ Musumeci
094ad862e7 Fix regression testing for implemented functions 2022-12-11 14:44:19 -05:00
trapexit
e81b1a6b9d
Merge pull request #1107 from trapexit/32bitfixes
Fix printf for 32bit systems
2022-12-08 22:06:15 -05:00
Antonio SJ Musumeci
a6ca96fa08 Fix printf for 32bit systems 2022-12-08 22:04:15 -05:00
trapexit
a449829d5f
Merge pull request #1106 from trapexit/xattrfix
Fix reading of setxattr name
2022-12-08 18:40:57 -05:00
Antonio SJ Musumeci
d14427ad9e Fix reading of setxattr name 2022-12-08 18:40:08 -05:00
trapexit
ac1f4b4d52
Merge pull request #1105 from trapexit/ll
Misc cleanup
2022-11-27 23:29:53 -05:00
Antonio SJ Musumeci
ddf5e53aa4 Misc cleanup 2022-11-27 22:23:38 -06:00
trapexit
a2a12afb34
Merge pull request #1104 from trapexit/ll
Remove libfuse abstraction in prep for adding request data
2022-11-27 00:39:05 -05:00
Antonio SJ Musumeci
7606430188 Remove libfuse abstraction in prep for adding request data 2022-11-26 23:30:27 -06:00
trapexit
629806e896
Merge pull request #1093 from lgtm-migrator/codeql
Add CodeQL workflow for GitHub code scanning
2022-11-11 09:53:27 -05:00
LGTM Migrator
50fbf14e1e
Add CodeQL workflow for GitHub code scanning 2022-11-11 07:59:54 +00:00
trapexit
4a67bbdc71
Merge pull request #1092 from trapexit/cleanup
Remove write_buf, simplify FUSE msg dispatching
2022-11-10 23:24:25 -05:00
Antonio SJ Musumeci
dba9c4451a Remove write_buf, simplify FUSE msg dispatching 2022-11-10 22:43:02 -05:00
trapexit
fea499e220
Merge pull request #1091 from trapexit/cleanup
Remove unnecessary libfuse abstractions
2022-11-07 23:35:18 -05:00
Antonio SJ Musumeci
9d056d609f Remove unnecessary libfuse abstractions 2022-11-07 23:09:25 -05:00
trapexit
9a839dd8ba
Merge pull request #1089 from trapexit/32bit
Tweaks for 32bit systems
2022-11-05 23:37:19 -04:00
Antonio SJ Musumeci
32e2c9c48e Tweaks for 32bit systems 2022-11-05 23:28:10 -04:00
trapexit
83d7886a0a
Merge pull request #1087 from trapexit/kernelh
Update fuse_kernel.h
2022-11-03 23:29:22 -04:00
Antonio SJ Musumeci
316abba0ac Update fuse_kernel.h 2022-11-03 23:28:44 -04:00
trapexit
8001c58c36
Merge pull request #1085 from trapexit/symlinkify
Fix setting of stat vars for symlinkify
2022-10-31 19:47:36 -04:00
Antonio SJ Musumeci
3b0d7fb26e Fix setting of stat vars for symlinkify 2022-10-30 22:27:33 -04:00
trapexit
5d3c5002e0
Merge pull request #1058 from trapexit/docs
Support doc update
2022-08-08 14:09:22 -04:00
Antonio SJ Musumeci
9082285cc8 Support doc update 2022-08-08 13:40:43 -04:00
trapexit
d1762b2bac
Merge pull request #1057 from trapexit/cfgerrs
Error when given invalid policy names
2022-08-06 23:08:10 -04:00
Antonio SJ Musumeci
46ce28b149 Error when given invalid policy names 2022-08-06 23:01:23 -04:00
trapexit
faadeb75e0
Merge pull request #1045 from Gelma/master
Fix typos
2022-06-22 14:27:13 -04:00
Andrea Gelmini
338e559e53
Fix typos 2022-06-22 11:51:23 +02:00
trapexit
3db673410f
Merge pull request #1039 from trapexit/docs
Add details about usage of FUSE to docs
2022-05-23 12:49:06 -04:00
Antonio SJ Musumeci
77f098614f Add details about usage of FUSE to docs 2022-05-23 12:40:00 -04:00
trapexit
9589846e9a
Merge pull request #1032 from trapexit/support
Rework support section in readme
2022-04-25 17:44:16 -04:00
Antonio SJ Musumeci
e2dda3c1b1 Rework support section in readme 2022-04-25 17:42:31 -04:00
trapexit
d9ab18282f
Merge pull request #1031 from trapexit/root-parent
Return ENOENT when dotdot for root node requested
2022-04-12 23:18:57 -04:00
Antonio SJ Musumeci
14c2ff9ab8 Return ENOENT when dotdot for root node requested 2022-04-12 23:17:39 -04:00
trapexit
77e6f400b5
Merge pull request #1026 from trapexit/loglock
Lock less often during logging
2022-03-20 22:45:07 -04:00
Antonio SJ Musumeci
b95ff8ba3a Lock less often during logging 2022-03-20 22:34:55 -04:00
trapexit
4bf8738e5c
Merge pull request #1025 from trapexit/estale
Change ENOENT to ESTALE for looking up paths to handle rename race conditions
2022-03-20 12:19:00 -04:00
Antonio SJ Musumeci
3f060f4512 Change ENOENT to ESTALE for looking up paths to handle rename race conditions
As done in https://github.com/libfuse/libfuse/pull/636
2022-03-20 12:09:22 -04:00
trapexit
c4c35a9ad0
Merge pull request #1023 from trapexit/follow-symlink-fix
Fix query of attr during symlink
2022-03-19 17:01:11 -04:00
Antonio SJ Musumeci
c9a935835f Fix query of attr during symlink
Using getattr when follow-symlink is enabled causes invalid type to the kernel
if symlink pointed to non-symlink.
2022-03-19 16:18:46 -04:00
trapexit
015002ebd9
Merge pull request #1020 from trapexit/slab-maintenance
Rework node slab garbage collection to limit blocking work threads
2022-03-19 15:54:29 -04:00
Antonio SJ Musumeci
9ca10b2413 Rework node slab garbage collection to limit blocking work threads
Also remove debug mode from forcing foreground mode
2022-03-19 13:33:14 -04:00
trapexit
2d5c2c2b6e
Merge pull request #1007 from trapexit/trapexit-patch-1
Update bug_report.md
2022-01-18 21:16:22 -05:00
trapexit
e3ab739a56
Update bug_report.md 2022-01-18 21:15:59 -05:00
trapexit
c784d06029 Merge pull request #1005 from trapexit/readme-readahead
Update README.md regarding readahead
2022-01-15 17:39:31 -05:00
trapexit
58803f4845
Update README.md 2022-01-15 17:33:07 -05:00
trapexit
f159fe61f9
Merge pull request #997 from trapexit/link-getattr
Call FUSE getattr rather than syscall for extra logic
2021-12-18 17:21:19 -05:00
Antonio SJ Musumeci
c43b464d6c Call FUSE getattr rather than syscall for extra logic
While more efficient calling regular getattr (stat) leads to incorrect
information being returned and would not work correctly when using
symlinkify.
2021-12-18 17:07:23 -05:00
trapexit
34c684a4f5
Merge pull request #991 from trapexit/fix/symlink
Get attrs for link, not target
2021-12-16 19:35:18 -05:00
Antonio SJ Musumeci
e256c88e4c Get attrs for link, not target 2021-12-16 19:11:29 -05:00
trapexit
518b4a6b85
Merge pull request #984 from trapexit/disable-locks
Ensure server handling of locks is disabled
2021-11-27 00:02:55 -05:00
Antonio SJ Musumeci
ee8532c70d Ensure server handling of locks is disabled 2021-11-27 00:01:12 -05:00
trapexit
c58da1ab9c
Merge pull request #979 from trapexit/node-size
Remove embedded name in node struct
2021-11-01 22:46:09 -04:00
Antonio SJ Musumeci
68b3026264 Remove embedded name in node struct
The 32 byte array is below the average size so those 32 bytes are wasted a
large portion of the time.
2021-11-01 21:08:58 -04:00
trapexit
810c5a40f7
Merge pull request #978 from trapexit/debug2
Add new debug printing routines, fix ioctl cmd type
2021-10-27 22:31:58 -04:00
Antonio SJ Musumeci
18dead4d86 Add new debug printing routines 2021-10-27 22:12:10 -04:00
trapexit
2082357d3a
Merge pull request #977 from trapexit/readme
Readme
2021-10-25 21:58:01 -04:00
Antonio SJ Musumeci
68719da828 Remove ioctl runtime section, use getfattr instead of xattr 2021-10-25 21:57:30 -04:00
trapexit
31fd1ec82e
Merge pull request #975 from trapexit/sponsorship
Remove subscribestar from sponsor platforms
2021-10-15 23:30:33 -04:00
trapexit
c3845097ee
Remove subscribestar from sponsor platforms 2021-10-15 23:30:22 -04:00
trapexit
d76934ee9d
Merge pull request #972 from trapexit/log-node-info
Add option to log node memory usage metrics
2021-10-11 12:33:11 -04:00
Antonio SJ Musumeci
5f737cb7bf Add option to log node memory usage metrics 2021-10-11 11:57:16 -04:00
trapexit
50ede1ba97
Merge pull request #969 from trapexit/node-size
Reduce struct node size
2021-10-03 22:44:03 -04:00
Antonio SJ Musumeci
930dad31de Reduce struct node size
* Replace the stat values with a crc32b of them instead (for auto-cache)
* Replace char flag with bitfield
* Remove node generation. nodeid is an unsigned 64bit int. Would take 500K+ years
  to rollover at 1M nodes per second.
2021-10-03 22:15:34 -04:00
trapexit
88b91161e0
Merge pull request #968 from trapexit/fix
Fix regression from remember_node refactor
2021-09-30 22:14:51 -04:00
Antonio SJ Musumeci
8150957a01 Fix regression from remember_node refactor 2021-09-30 22:13:29 -04:00
trapexit
fee97efafb
Merge pull request #967 from trapexit/malloc-trim
Add malloc_trim configure test
2021-09-30 20:25:42 -04:00
trapexit
80856cf7ac
Merge pull request #966 from trapexit/libupdates
Update ghc::filesystem and nonstd::optional
2021-09-30 20:05:40 -04:00
Antonio SJ Musumeci
c929781d08 Add malloc_trim configure test 2021-09-30 20:00:40 -04:00
Antonio SJ Musumeci
313aa2a1d3 Update ghc::filesystem and nonstd::optional 2021-09-30 19:43:05 -04:00
trapexit
021ce3d97c
Merge pull request #964 from trapexit/fmp
Rework of allocation in libfuse
2021-09-19 17:31:39 -04:00
Antonio SJ Musumeci
4ea0de3ef2 Rework dirents buffer management 2021-09-19 16:48:03 -04:00
Antonio SJ Musumeci
6b5c484fbf Major rework of memory allocation using fixed mem pools 2021-09-19 16:48:03 -04:00
trapexit
b165332486
Merge pull request #959 from trapexit/readme
Add details on dropping caches before benchmarks
2021-09-03 07:22:21 -04:00
Antonio SJ Musumeci
f598d3bc38 Add details on dropping caches before benchmarks 2021-09-03 07:21:16 -04:00
trapexit
4daa9e4eb9
Merge pull request #957 from trapexit/cirrus-ci
Add new cirrus-ci targets
2021-08-29 14:25:17 -04:00
Antonio SJ Musumeci
122f9c1d5d Add new cirrus-ci targets 2021-08-29 13:56:56 -04:00
trapexit
2da5cda4b3
Merge pull request #956 from trapexit/mount-bsd
Remove usage printing regression in mount_bsd
2021-08-29 13:20:07 -04:00
Antonio SJ Musumeci
5263a65dcf Remove usage printing regression in mount_bsd 2021-08-29 13:09:38 -04:00
trapexit
1255d3d1b2
Merge pull request #955 from trapexit/mfs
Fix infinite loop in mfs action policy
2021-08-29 13:07:40 -04:00
Antonio SJ Musumeci
8def16a811 Fix infinite loop in mfs action policy 2021-08-29 12:33:52 -04:00
trapexit
7d1683b607
Merge pull request #954 from trapexit/libfuse-cleanup
Major cleanup of libfuse to remove unneeded features
2021-08-29 12:15:05 -04:00
Antonio SJ Musumeci
43a6d66e3c Major cleanup of libfuse to remove unneeded features
* Remove request interrupt code. Required tracking of all requests unnecesssarily.
* Remove all debugging printing. Have plans to do full replacement.
* Remove deprecated functions.
* Remove unneeded error checking.
* Remove "userdata" which was unused.
* Remove allow_root feature.
2021-08-29 00:05:30 -04:00
trapexit
8b33f9a766
Merge pull request #953 from trapexit/readme-chia
Update docs with Chia wallet address
2021-08-26 12:57:16 -04:00
Antonio SJ Musumeci
df721eb253 Update docs with Chia wallet address 2021-08-26 12:56:33 -04:00
trapexit
0547517a99
Merge pull request #951 from trapexit/readme
Add more clarity in what to provide when submitting bug reports
2021-08-22 13:12:03 -04:00
Antonio SJ Musumeci
54e85007a2 Add more clarity in what to provide when submitting bug reports or questions 2021-08-22 13:10:54 -04:00
trapexit
6e53f3b698
Merge pull request #945 from trapexit/readme
Update 'features' section of readme
2021-08-10 21:49:32 -04:00
Antonio SJ Musumeci
1aaf742c13 Update 'features' section of readme 2021-08-10 21:48:51 -04:00
trapexit
3754e20049
Merge pull request #944 from trapexit/trapexit-patch-1
tweak bug report template language
2021-08-09 21:10:16 -04:00
trapexit
b4c031d1f0
tweak bug report template language 2021-08-09 21:09:54 -04:00
trapexit
3b8d495c43
Merge pull request #940 from trapexit/ioctl-runtime-removal
Remove config ioctl calls
2021-08-03 17:02:01 -04:00
Antonio SJ Musumeci
61c2187c14 Remove config ioctl calls
While they were going to be the new way of interacting with the runtime config
I've decided to use toml based config for mergerfs v3. In that case all updates
will happen through the config file and ioctl will only be used to load/reload
the config rather than a key:value like API.
2021-08-02 16:56:20 -04:00
trapexit
192e4a4af8
Merge pull request #939 from trapexit/update-nonstd-optional
Update nonstd::optional to v3.4.0
2021-08-02 16:29:40 -04:00
trapexit
749f0290e9
Merge pull request #938 from trapexit/update-ghc-filesystem
Update ghc::filesystem to v1.5.8
2021-08-02 16:24:22 -04:00
Antonio SJ Musumeci
7013ff9aeb Update nonstd::optional to v3.4.0 2021-08-02 16:10:56 -04:00
Antonio SJ Musumeci
3ce0dc56e4 Update ghc::filesystem to v1.5.8 2021-08-02 16:06:43 -04:00
trapexit
8e47bf4946
Merge pull request #926 from trapexit/modzero
pfrd: fix mod by zero error when all branches are filtered
2021-06-25 09:45:01 -04:00
Antonio SJ Musumeci
098f353bf1 pfrd: fix mod by zero error when all branches are filtered 2021-06-25 09:17:16 -04:00
trapexit
859b4da3dc
Merge pull request #924 from trapexit/varinit-master
properly initialize fuse_buf in worker loop
2021-06-20 17:40:12 -04:00
Antonio SJ Musumeci
80f30999fa properly initialize fuse_buf in worker loop 2021-06-20 17:38:17 -04:00
trapexit
3fdd322a5c
Merge pull request #914 from trapexit/readme
mention bind-propagation and add link to hotio
2021-05-29 13:27:19 -04:00
trapexit
c40f42e57e
mention bind-propagation and add link to hotio 2021-05-29 13:26:54 -04:00
trapexit
18e87980a4
Merge pull request #913 from trapexit/readme
Update README.md
2021-05-29 13:07:54 -04:00
trapexit
44efbaabe6
Update README.md
Add FAQ entry regarding container runtimes
2021-05-29 13:07:09 -04:00
trapexit
a02f3a6856
Merge pull request #891 from trapexit/trapexit-patch-1
Update bug_report.md
2021-03-15 07:58:22 -04:00
trapexit
9573a053d6
Update bug_report.md
update the strace commands and make clear to use a recent release
2021-03-15 07:58:02 -04:00
trapexit
9a5d691619
Merge pull request #889 from trapexit/readme
README: update strace args and add question on snapraid
2021-03-11 15:37:37 -05:00
Antonio SJ Musumeci
495afeffb1 README: update strace args and add question on snapraid 2021-03-11 15:36:50 -05:00
trapexit
4acc1defe2
Merge pull request #888 from Gelma/typo
Fix typo
2021-03-06 17:49:40 -05:00
Andrea Gelmini
58b4eb9089 Fix typo 2021-03-06 23:38:33 +01:00
trapexit
ca4b4c6d35
Merge pull request #884 from trapexit/travis
remove travis-ci
2021-02-25 15:40:32 -05:00
Antonio SJ Musumeci
9a90609428 remove travis-ci 2021-02-25 15:40:00 -05:00
trapexit
3e691149f5
Merge pull request #883 from trapexit/link-symlink
new features: follow-symlinks, rename-exdev, link-exdev
2021-02-25 15:33:26 -05:00
Antonio SJ Musumeci
8adebc9489 new features: follow-symlinks, rename-exdev, link-exdev
* follow-symlinks: allows mergerfs to transparently follow symlinks
* link-exdev: in the event a link returns EXDEV create a symlink instead
* rename-exdev: in the event a rename returns EXDEV move the oldpath and
  create a symlink for the newpath
2021-02-11 23:24:08 -05:00
trapexit
50daf84ec0
Merge pull request #880 from trapexit/branch-parse-fix
fix parsing of relative branch paths
2021-02-11 19:37:38 -05:00
Antonio SJ Musumeci
d337574665 fix parsing of relative branch paths 2021-02-11 19:22:17 -05:00
trapexit
39d98f1eac
Merge pull request #878 from trapexit/readdir_rewind_fix
reset dentry buffer when rewind'ed
2021-02-09 20:21:59 -05:00
trapexit
cbea2ba91b
Merge branch 'master' into readdir_rewind_fix 2021-02-09 18:13:08 -05:00
Antonio SJ Musumeci
f6e37672b8 reset dentry buffer when rewind'ed 2021-02-09 18:09:28 -05:00
trapexit
55bd9a06b1
Merge pull request #876 from trapexit/readme
readme: update support section
2021-02-08 18:15:45 -05:00
Antonio SJ Musumeci
6a9f7e6afc readme: update support section 2021-02-08 17:55:49 -05:00
trapexit
f2158d3e66
Merge pull request #871 from trapexit/support
README: update support section
2021-01-23 18:54:42 -05:00
Antonio SJ Musumeci
3bc189cfc8 README: update support section 2021-01-23 18:54:06 -05:00
trapexit
d0c5ff7f87
Merge pull request #870 from trapexit/readme
README: add warning/clearity about caching script and hardlinks and cow
2021-01-23 17:19:59 -05:00
Antonio SJ Musumeci
dfb544fed8 README: add warning/clearity about caching script and hardlinks and cow 2021-01-23 17:18:07 -05:00
trapexit
ae893ca051
Merge pull request #865 from trapexit/config
config: rework global config, remove rwlock, make branches RCU like
2021-01-14 22:10:20 -05:00
Antonio SJ Musumeci
538467b86d config: rework global config, remove rwlock, make branches RCU like
Also added unit tests. Should have done separately but found a number of bugs.
2021-01-14 21:02:10 -05:00
trapexit
46de43d4ad
Merge pull request #860 from trapexit/funding
Update FUNDING.yml
2021-01-01 15:52:41 -05:00
trapexit
3808e2683e
Update FUNDING.yml 2021-01-01 15:52:15 -05:00
trapexit
52342a76c1
Merge pull request #858 from trapexit/docs
README: misc updates and tweaks
2020-12-29 19:36:30 -05:00
Antonio SJ Musumeci
e9e17baf5e README: misc updates and tweaks 2020-12-29 19:34:13 -05:00
trapexit
2e4c6c5fd1
Merge pull request #856 from trapexit/dirname
dirname should not return an empty string
2020-12-18 17:03:43 -05:00
Antonio SJ Musumeci
f50812a9ce dirname should not return an empty string 2020-12-18 16:04:17 -05:00
trapexit
861edff49a
Merge pull request #855 from trapexit/builds
update cirrus-ci builds
2020-12-17 20:18:16 -05:00
Antonio SJ Musumeci
5e08357f0e update cirrus-ci builds 2020-12-17 20:17:16 -05:00
trapexit
411ee36c90
Merge pull request #854 from trapexit/mspfix
msp policies stopped before root path
2020-12-17 20:14:54 -05:00
Antonio SJ Musumeci
44a98910ba msp policies stopped before root path 2020-12-17 19:55:49 -05:00
trapexit
8a335d8a6e
Merge pull request #851 from trapexit/fix
fix segv: zero out data structures
2020-12-13 16:56:55 -05:00
Antonio SJ Musumeci
3900543970 fix segv: zero out data structures 2020-12-13 13:40:04 -05:00
trapexit
2e34c7598a
Merge pull request #845 from trapexit/configfile
config: fix invalid error check when parsing config file
2020-11-28 21:49:51 -05:00
Antonio SJ Musumeci
7edd3c6cf3 config: fix invalid error check when parsing config file 2020-11-28 20:26:18 -05:00
trapexit
ddf0075938
Merge pull request #844 from trapexit/cleanup
general cleanup, slight memory reduction
2020-11-19 23:30:48 -05:00
Antonio SJ Musumeci
1b26f4908e general cleanup, slight memory reduction 2020-11-19 22:58:52 -05:00
trapexit
2d8fab534a
Merge pull request #843 from trapexit/policyfixes
msp policies: used wrong path to check existance
2020-11-19 20:34:51 -05:00
Antonio SJ Musumeci
c3fffefbc1 msp policies: used wrong path to check existance 2020-11-19 18:34:28 -05:00
trapexit
eaa2593a4b
Merge pull request #837 from renkoh/rsync-script-readme
Update percentage full expiring script
2020-10-03 01:05:54 -04:00
Ren Koh
7e583e3f48
use relative option for rsync 2020-10-03 14:45:51 +10:00
trapexit
2ad4891617
Merge pull request #835 from trapexit/readme
README.md: add details on per branch minfreespace
2020-09-29 18:51:30 -04:00
Antonio SJ Musumeci
8990e24c0f README.md: add details on per branch minfreespace 2020-09-29 18:50:25 -04:00
trapexit
88b80234c7
Merge pull request #834 from trapexit/readme
README.md: add details about error handling
2020-09-27 00:30:05 -04:00
Antonio SJ Musumeci
f6e37c57fe README.md: add details about error handling 2020-09-27 00:28:00 -04:00
trapexit
562295be90
Merge pull request #833 from trapexit/wyhash-fix
wyhash: use safety mode 1
2020-09-24 09:03:10 -04:00
Antonio SJ Musumeci
04844420dc wyhash: use safety mode 1
mode 0 is not intended for unaligned buffers
2020-09-24 08:45:34 -04:00
trapexit
9c352ac555
Merge pull request #832 from trapexit/rework-errors
rework some function error handling
2020-09-23 00:26:03 -04:00
Antonio SJ Musumeci
5a3184359d rework some function error handling
chmod, chown, removexattr, setxattr, truncate, utimens:
* if no errors: return 0
* if no successes: return first error
* if file acted on was the same as related search function: return its value
* return 0

rmdir, unlink:
* if no errors: return 0
* return first error
2020-09-23 00:01:25 -04:00
trapexit
24f03b04eb
Merge pull request #831 from trapexit/minfreespace-fix
properly return const ref from tofrom string wrapper
2020-09-20 11:18:24 -04:00
Antonio SJ Musumeci
610c75fa90 properly return const ref from tofrom string wrapper 2020-09-19 18:57:13 -04:00
trapexit
dbc4774e8e
Merge pull request #828 from trapexit/remove-old-issue-template
Delete issue_template.md
2020-09-13 10:30:02 -04:00
trapexit
73e8ed72cd
Delete issue_template.md 2020-09-13 10:29:45 -04:00
trapexit
e694585561
Merge pull request #827 from trapexit/bug_report
Update bug_report.md
2020-09-13 10:28:34 -04:00
trapexit
0b1af2b8ef
Update bug_report.md 2020-09-13 10:28:20 -04:00
trapexit
668ac4000a
Merge pull request #825 from trapexit/rv
option_parser: return 0 when requesting help or version
2020-09-10 22:16:03 -04:00
Antonio SJ Musumeci
767039c492 option_parser: return 0 when requesting help or version 2020-09-10 21:58:23 -04:00
trapexit
b1c6d4864f
Merge pull request #821 from trapexit/minfreespace
branches: add per branch minfreespace w/ original value as default
2020-09-04 21:26:38 -04:00
Antonio SJ Musumeci
fc3453932a branches: add per branch minfreespace w/ original value as default
example: /mnt/disk0=RW,1G:/mnt/disk1=RW,2G
2020-09-04 21:04:45 -04:00
trapexit
98c49b8001
Merge pull request #819 from trapexit/readme
README.md: fix typos
2020-08-30 22:24:39 -04:00
Antonio SJ Musumeci
27bd39f5ac README.md: fix typos 2020-08-30 22:23:16 -04:00
trapexit
9f84f29e12
Merge pull request #818 from trapexit/lchmod
optionally use lchmod depending on if on Linux or not (BSD)
2020-08-26 15:42:42 -04:00
Antonio SJ Musumeci
6311df774d optionally use lchmod depending on if on Linux or not (BSD) 2020-08-26 12:44:32 -04:00
trapexit
9424784fad
Merge pull request #817 from trapexit/readme
README.md: add note indicating only tagged releases are supported
2020-08-26 11:03:50 -04:00
Antonio SJ Musumeci
15fb751f65 README.md: add note indicating only tagged releases are supported 2020-08-26 11:02:56 -04:00
trapexit
3534fb1128
Merge pull request #815 from trapexit/policy-pfrd
add {,ep,msp}pfrd policies
2020-08-25 22:58:44 -04:00
Antonio SJ Musumeci
046844083f add {,ep,msp}pfrd policies
Percentage Free Random Distribution

Chooses a random branch based on the available space percentage free.

IE: if branch A has 1G free and branch B has 2G then B should be chosen
twice as often.
2020-08-25 22:19:01 -04:00
trapexit
7ff995631e
Merge pull request #814 from trapexit/cleanup
general cleanup
2020-08-18 19:42:49 -04:00
Antonio SJ Musumeci
8675fce04a add fedora builds to cirrus-ci 2020-08-18 19:28:36 -04:00
Antonio SJ Musumeci
7fd629ebf3 add #warning to make it more obvious what versions of functions are used 2020-08-18 19:28:36 -04:00
Antonio SJ Musumeci
2fe20b888e clean up and separate out fs_* files 2020-08-18 19:28:36 -04:00
Antonio SJ Musumeci
2696079601 break fs.hpp up into separate files 2020-08-18 19:28:36 -04:00
Antonio SJ Musumeci
ec15872a1f cleanup function signatures and definitions 2020-08-18 19:28:36 -04:00
Antonio SJ Musumeci
6cc6524997 change category to enum class 2020-08-18 19:28:36 -04:00
trapexit
4c711159df
Merge pull request #810 from trapexit/libfuse-cleanup
libfuse cleanup: add more header include guards
2020-08-08 19:16:51 -04:00
Antonio SJ Musumeci
7e173108fd libfuse cleanup: add more header include guards 2020-08-08 19:10:36 -04:00
trapexit
17925c4c93
Merge pull request #809 from trapexit/libfuse-cleanup
Libfuse cleanup
2020-08-08 19:00:43 -04:00
trapexit
90081f4e61
Merge pull request #808 from slashbeast/Makefiles-support-ar-cflags-cxxflags-ldflags-from-env
Makefiles fixes: support environmental passed $AR, $CFLAGS, $CXXFLAGS and $LDFLAGS
2020-08-08 16:30:09 -04:00
KARBOWSKI Piotr
f488debf96 libfuse/Makefile: support CXXFLAGS and LDFLAGS passed via environment 2020-08-08 22:04:14 +02:00
KARBOWSKI Piotr
678626ef82 Makefile: support CXXFLAGS and LDFLAGS passed via environment 2020-08-08 22:03:50 +02:00
KARBOWSKI Piotr
0bc6711a95 libfuse/Makefile: support $AR 2020-08-08 22:03:28 +02:00
Antonio SJ Musumeci
a925fbe59c libfuse cleanup: extern cplusplus cleanup 2020-08-08 14:25:44 -04:00
Antonio SJ Musumeci
dc1b698847 libfuse cleanup: remove single threaded 2020-08-07 16:38:24 -04:00
Antonio SJ Musumeci
3c761b708b libfuse cleanup: remove libfuse API compatibility 2020-08-07 16:38:24 -04:00
Antonio SJ Musumeci
3bfdd78434 libfuse cleanup: remove cuse 2020-08-07 16:38:24 -04:00
Antonio SJ Musumeci
5f12fb6a5f libfuse cleanup: remove unnecessary files 2020-08-07 16:38:24 -04:00
Antonio SJ Musumeci
f9b831eb1a libfuse cleanup: reindent 2020-08-07 16:38:24 -04:00
trapexit
da07bc9637
Merge pull request #807 from trapexit/readme
README.md: add XMR address
2020-08-07 16:28:40 -04:00
Antonio SJ Musumeci
badf7e1c60 README.md: add XMR address 2020-08-07 16:28:08 -04:00
trapexit
1f35b65725
Merge pull request #806 from trapexit/readme
README.md: update support section with Open Collective and LBC
2020-08-07 10:53:12 -04:00
Antonio SJ Musumeci
3b382624e5 README.md: update support section with Open Collective and LBC 2020-08-07 10:49:28 -04:00
trapexit
5f3a4cb0f1
Merge pull request #805 from trapexit/wyhash
change from fasthash64 to wyhash
2020-08-06 20:23:15 -04:00
Antonio SJ Musumeci
0371b047f9 change from fasthash64 to wyhash
wyhash has very good performance for small keys (our usecase) and
works on platforms with alignment concerns.

A user had an issue where fasthash64 lead to misaligned reads and
signal exceptions. wyhash does not have such issues and is faster.
2020-08-06 19:00:05 -04:00
trapexit
3f593d9c3b
Merge pull request #800 from robertbaker/patch-1
fix: add fakeroot needed for building
2020-08-05 21:07:35 -04:00
Robert Baker
1fe32e9cd5 fix: add fakeroot needed for building 2020-08-05 03:14:47 -07:00
trapexit
58a8f8326d
Merge pull request #798 from trapexit/inodecalc-32bit
inodecalc: add 32bit versions of hashs
2020-08-03 19:57:48 -04:00
Antonio SJ Musumeci
30d13b7f77 inodecalc: add 32bit versions of hashs 2020-08-03 19:42:06 -04:00
trapexit
124299e185
Merge pull request #797 from trapexit/getdents64
readdir: use getdents64 for compatibility with ARM64
2020-08-02 19:12:45 -04:00
Antonio SJ Musumeci
5989d41a86 readdir: use getdents64 for compatibility with ARM64 2020-08-02 18:43:09 -04:00
trapexit
c97102bc9d
Merge pull request #796 from trapexit/readme
README.md: move kernel bugs to wiki
2020-08-02 16:57:28 -04:00
Antonio SJ Musumeci
1d2a1ba31a README.md: move kernel bugs to wiki 2020-08-02 16:56:10 -04:00
trapexit
159c2366c7
Merge pull request #795 from trapexit/readme
README.md: update faq regarding Plex and page caching
2020-08-02 16:19:20 -04:00
Antonio SJ Musumeci
e639f3d375 README.md: update faq regarding Plex and page caching 2020-08-02 16:18:47 -04:00
trapexit
23f870d8f2
Merge pull request #794 from trapexit/github-create-new-style-issue-templates
Update issue templates
2020-08-01 00:08:15 -04:00
trapexit
173193df74 Update issue templates 2020-08-01 00:07:50 -04:00
trapexit
d1d21ead1f
Merge pull request #792 from trapexit/options
add missing options to usage
2020-07-30 17:13:15 -04:00
Antonio SJ Musumeci
0709b2e447 add missing options to usage 2020-07-30 16:55:18 -04:00
trapexit
50d967221e
Merge pull request #791 from trapexit/configcleanup
cleanup: move some config data structures to separate files
2020-07-29 21:56:29 -04:00
Antonio SJ Musumeci
15a0aedd25 cleanup: move some config data structures to separate files 2020-07-29 21:42:43 -04:00
trapexit
8052039c6f
Merge pull request #790 from trapexit/readme
README: change back to listing fuse.mergerfs for fstab fstype
2020-07-29 14:40:22 -04:00
Antonio SJ Musumeci
8afe72d371 README: change back to listing fuse.mergerfs for fstab fstype 2020-07-29 14:39:53 -04:00
trapexit
0682ebf103
Merge pull request #789 from trapexit/freebsd
freebsd: misc cleanups to get freebsd compiling
2020-07-29 14:04:04 -04:00
Antonio SJ Musumeci
a93bd9f7fa freebsd: misc cleanups to get freebsd compiling 2020-07-29 13:08:38 -04:00
trapexit
6f76080c6b
Merge pull request #787 from trapexit/nfshack
nfsopenhack: remove empty file check
2020-07-26 18:33:44 -04:00
Antonio SJ Musumeci
139e61efaa nfsopenhack: remove empty file check 2020-07-26 17:11:06 -04:00
trapexit
b50a128777
Merge pull request #786 from trapexit/gitnfs
NFS open/creat hack
2020-07-24 21:16:06 -04:00
Antonio SJ Musumeci
93218a343a NFS open/creat hack
A hack to work around non-POSIX NFS <-> FUSE behavior where it turns
an open(O_EXCL|O_CREAT,0444) into multiple calls that results in
EACCES.
2020-07-23 19:36:10 -04:00
trapexit
5a0568495b
Merge pull request #784 from trapexit/policy-mspmfs
policy: add "most shared path" policies
2020-07-21 18:40:27 -04:00
Antonio SJ Musumeci
3ec137c4ad policy: add "most shared path" policies
Like path preserving but walks back the path till a match is found. Should
cover the usecase where someone wants a "less strict" form of path
preservation.
2020-07-21 16:31:08 -04:00
trapexit
d4eecf3b56
Merge pull request #783 from Gelma/typo
Fix typos
2020-07-20 07:35:08 -04:00
Andrea Gelmini
3a6738475a Fix typos 2020-07-20 13:01:33 +02:00
Andrea Gelmini
468d42088a Removed duplicated include 2020-07-20 12:51:44 +02:00
trapexit
4a4db4be84
Merge pull request #782 from trapexit/moveonenospc-policy
moveonenospc: enhance the feature to allow using a policy
2020-07-15 21:24:17 -04:00
Antonio SJ Musumeci
08d267fc61 moveonenospc: enhance the feature to allow using a policy
Just like functions you can now set a policy for moveonfreenospc. This
allows for more flexibility.

For backwards compatibility moveonfreenospc=true is converted to
moveonfreenospc=mfs.

minfreespace does apply which is slightly different from original behavior.
2020-07-15 19:33:05 -04:00
trapexit
f2d4fbfdb2
Merge pull request #781 from trapexit/readdir-offset-fix
readdir: add dirent index array
2020-07-12 13:13:49 -04:00
Antonio SJ Musumeci
c4a85f5fad readdir: add dirent index array
This removes the risk of corrupted data being sent back to the kernel
should it use the offset from one opendir-readdir in another. In this case
it would at most skip dirents.

According to the standards the offset is only valid when used within
the opendir -> releasedir but NFS uses offsets across independent
calls.
2020-07-12 12:43:33 -04:00
trapexit
c3f4d2914f
Merge pull request #780 from trapexit/nopath
remove unnecessary libfuse flags nopath, nullpath_ok, and utime_omit_ok
2020-07-08 19:46:14 -04:00
Antonio SJ Musumeci
c0990644e8 remove unnecessary libfuse flags nopath, nullpath_ok, and utime_omit_ok 2020-07-08 19:25:23 -04:00
trapexit
b1f30b703f
Merge pull request #779 from trapexit/nfs-readdir
temporary fix for short readdirs on NFS
2020-07-08 14:25:37 -04:00
Antonio SJ Musumeci
62899565e6 temporary fix for short readdirs on NFS 2020-07-08 14:10:53 -04:00
trapexit
ddb435a44b
Merge pull request #777 from trapexit/dpkgfix
fix rpm spec and chmod in deb
2020-06-30 11:39:23 -04:00
Antonio SJ Musumeci
d699a97928 fix rpm spec and chmod in deb 2020-06-30 11:07:39 -04:00
trapexit
06660ca25e
Merge pull request #776 from trapexit/dpkgfix
debian: fix installing of fresh deb
2020-06-30 09:31:06 -04:00
Antonio SJ Musumeci
8ed3a1f36a debian: fix installing of fresh deb 2020-06-30 09:30:31 -04:00
trapexit
8948fc2935
Merge pull request #775 from trapexit/inode-calc
add 'inodecalc' option to allow selection of inode calculation algo
2020-06-28 20:52:36 -04:00
Antonio SJ Musumeci
b4397f7f2e add 'inodecalc' option to allow selection of inode calculation algo 2020-06-28 20:02:07 -04:00
trapexit
cb74573fc2
Merge pull request #774 from trapexit/readdir
additional readdir refactor cleanup
2020-06-27 23:33:00 -04:00
Antonio SJ Musumeci
dbdd3e22fc additional readdir refactor cleanup
Differences between readdir and getdents is minimal at best. Leaving code
for now to allow for possible expansion later.
2020-06-27 23:17:21 -04:00
trapexit
4160a8e2f8
Merge pull request #767 from trapexit/cirrus-ci
add Cirrus-CI
2020-06-18 22:47:54 -04:00
Antonio SJ Musumeci
afb07b170d add Cirrus-CI 2020-06-18 22:37:05 -04:00
trapexit
ebcf98ac2d
Merge pull request #766 from trapexit/ini
rework config management
2020-06-18 19:53:34 -04:00
Antonio SJ Musumeci
54c41c4994 rework config management
* Add standard way to do str2val and val2str conversion
* Add support for a config file
* Add support for reading and writing settings via ioctl
2020-06-18 18:54:25 -04:00
trapexit
8d989777f8
Merge pull request #763 from trapexit/install-test
Travis-CI: add installing of deb package
2020-06-11 12:53:21 -04:00
Antonio SJ Musumeci
a0c1c1a997 Travis-CI: add installing of deb package 2020-06-11 12:45:20 -04:00
trapexit
bed493e8dd
Merge pull request #758 from trapexit/readme
README: add terminology section and tweak some things
2020-05-25 11:57:32 -04:00
Antonio SJ Musumeci
add588fdea README: add terminology section and tweak some things 2020-05-25 11:56:38 -04:00
trapexit
a61d420224
Merge pull request #755 from trapexit/support
README: update support section
2020-05-18 23:26:56 -04:00
Antonio SJ Musumeci
eb78c512ee README: update support section 2020-05-18 23:26:09 -04:00
trapexit
ee5851bb1c
Merge pull request #754 from trapexit/deb-build
fix install location and setuid setting in deb pkgs
2020-05-13 19:52:55 -04:00
Antonio SJ Musumeci
c6bce81747 fix install location and setuid setting in deb pkgs 2020-05-13 19:37:17 -04:00
trapexit
e0bb4e407a
Merge pull request #749 from trapexit/docs
README.md: add human readable versions of some errno references
2020-05-06 18:48:41 -04:00
Antonio SJ Musumeci
aad2257387 README.md: add human readable versions of some errno references
Also some additional "why use mergerfs over X?"
2020-05-06 18:46:39 -04:00
trapexit
831dba3ef6
Merge pull request #741 from trapexit/docs
README.md: request users update to latest version before they submit …
2020-04-20 09:17:25 -04:00
Antonio SJ Musumeci
eff15c72a5 README.md: request users update to latest version before they submit report 2020-04-20 09:16:43 -04:00
trapexit
edb50e5411
Merge pull request #737 from trapexit/docs
add basic setup section
2020-04-05 12:46:04 -04:00
Antonio SJ Musumeci
7c37a69d25 add basic setup section 2020-04-05 12:29:20 -04:00
trapexit
be3499ee56
Merge pull request #730 from trapexit/readdir
fix getdent name length calculation
2020-03-13 14:13:10 -04:00
Antonio SJ Musumeci
698c4147fc fix getdent name length calculation 2020-03-12 23:45:20 -04:00
trapexit
b5fae4b356
Merge pull request #729 from trapexit/readme
README: update a number of sections and fix typos
2020-03-11 12:19:08 -04:00
Antonio SJ Musumeci
0888ee12a5 README: update a number of sections and fix typos 2020-03-11 12:16:26 -04:00
trapexit
7e8635b24b
Merge pull request #726 from trapexit/readme
README: add note regarding space calculations
2020-03-10 11:31:25 -04:00
Antonio SJ Musumeci
8ba1abafec README: add note regarding space calculations 2020-03-10 11:21:40 -04:00
trapexit
14d26ba434
Merge pull request #723 from trapexit/getdents
fix filename hashing error
2020-03-07 12:58:22 -05:00
Antonio SJ Musumeci
3a46ec9fab fix filename hashing error 2020-03-07 12:09:40 -05:00
trapexit
ada90eab57
Merge pull request #722 from trapexit/alpine
fix name length calculation for musc
2020-02-29 18:05:42 -05:00
Antonio SJ Musumeci
9b2634a1e5 fix name length calculation for musc 2020-02-29 17:15:29 -05:00
trapexit
4cade5685c
Merge pull request #720 from trapexit/readdir_plus
Readdir plus
2020-02-28 20:44:54 -05:00
Antonio SJ Musumeci
62873d2d3b use getdents64 on linux 2020-02-28 20:34:12 -05:00
Antonio SJ Musumeci
d119807adb restructure readdir, add readdir_plus
Does not enable READDIR_AUTO. Might add in the future.
2020-02-22 19:45:52 -05:00
trapexit
10e8bd9fa3
Merge pull request #716 from trapexit/mount
rework makefiles + install mount tools
2020-02-22 17:00:55 -05:00
Antonio SJ Musumeci
5ce428ca59 rework makefiles + install mount tools 2020-02-21 12:33:00 -05:00
trapexit
2f769e75c4
Merge pull request #711 from trapexit/inode
change inode conversion algo to reduce collision
2020-02-12 21:51:41 -05:00
Antonio SJ Musumeci
a646fe016d change inode conversion algo to reduce collision 2020-02-12 21:05:52 -05:00
trapexit
f45a52d621
Merge pull request #710 from trapexit/writeback-xattr
add cache.writeback to xattrs
2020-02-12 19:52:16 -05:00
Antonio SJ Musumeci
576ff3694e add cache.writeback to xattrs 2020-02-12 19:48:37 -05:00
trapexit
4cb866cee9
Merge pull request #707 from trapexit/writeback-cache
add writeback caching
2020-02-10 19:22:44 -05:00
trapexit
43ddff6ca9
Merge pull request #706 from trapexit/ctime
ctime
2020-02-10 19:13:35 -05:00
Antonio SJ Musumeci
bf4b39065b update fuse_kernel.h 2020-02-10 18:54:07 -05:00
Antonio SJ Musumeci
4b9f3de814 add ctime support 2020-02-10 18:39:15 -05:00
Antonio SJ Musumeci
903d39f968 add writeback caching 2020-02-09 21:08:53 -05:00
trapexit
e6c8fa3fad
Merge pull request #705 from trapexit/zfs
add links to ZFS comparison
2020-02-04 11:08:18 -05:00
Antonio SJ Musumeci
9952c58a4a add links to ZFS comparison 2020-02-04 11:06:51 -05:00
trapexit
be8bb5d2a7
Merge pull request #701 from trapexit/faq
add faq entry on files ending up on 1 branch
2020-01-24 20:13:07 -05:00
Antonio SJ Musumeci
66f0d9e649 add faq entry on files ending up on 1 branch 2020-01-24 20:12:24 -05:00
trapexit
7b355b279d
Merge pull request #700 from trapexit/changelog
python 2.6 fix
2020-01-22 16:49:07 -05:00
Antonio SJ Musumeci
0f2f78c5b8 python 2.6 fix 2020-01-22 16:48:46 -05:00
trapexit
eb57425315
Merge pull request #699 from trapexit/git2debcl
make git2debcl work on Python 2 & 3
2020-01-22 14:30:01 -05:00
Antonio SJ Musumeci
489ab23e89 make git2debcl work on Python 2 & 3 2020-01-22 11:56:40 -05:00
trapexit
4c55eb0cc0
Merge pull request #697 from trapexit/readme
add README segment on benchmarking
2020-01-20 22:27:29 -05:00
Antonio SJ Musumeci
389785265b add README segment on benchmarking 2020-01-20 22:26:20 -05:00
trapexit
a6717990a8
Merge pull request #694 from trapexit/readme
more FAQs
2020-01-19 22:27:29 -05:00
Antonio SJ Musumeci
f4b8efce20 more FAQs 2020-01-19 22:26:20 -05:00
trapexit
8cdb7174c4
Merge pull request #689 from trapexit/readme
fix typos and update FAQ regarding policy preference
2020-01-13 14:27:18 -05:00
Antonio SJ Musumeci
4625a3cf43 fix typos and update FAQ regarding policy preference 2020-01-13 14:26:45 -05:00
trapexit
55245e290a
Merge pull request #685 from trapexit/update-docs
update docs: openvz kernel bug and new support links
2019-12-10 23:22:34 -05:00
Antonio SJ Musumeci
322fa5778a update docs: openvz kernel bug and new support links 2019-12-10 23:21:45 -05:00
trapexit
5eb3c8cbef
add github sponsor and subscribestar to funding 2019-12-08 01:09:31 -05:00
trapexit
5d827566f6
Create FUNDING.yml 2019-12-02 07:19:49 -05:00
trapexit
6058ac0716
Merge pull request #677 from trapexit/moveonenospc
fix short writes on >2GB files when cloning file
2019-10-14 23:34:36 -04:00
Antonio SJ Musumeci
4d82ed9324 fix short writes on >2GB files when cloning file 2019-10-14 23:32:51 -04:00
trapexit
026dc5f750
Merge pull request #675 from trapexit/fuse_ino
improve nodeid generation
2019-09-30 23:34:53 -04:00
Antonio SJ Musumeci
08e1bef5a9 improve nodeid generation
* Change fuse_ino_t to uint64_t
* Change id generation to 64bit
* Randomize generation value (should help with NFS)
2019-09-30 23:28:45 -04:00
trapexit
b5f6cd70de
Merge pull request #669 from serkef/patch-1
Fix typo
2019-09-20 16:41:10 -04:00
Sergio Kef
58ab7f7fa8
Fix typo 2019-09-20 22:32:09 +02:00
trapexit
c46c41c740
Merge pull request #668 from trapexit/travis
update travis config to include bionic
2019-09-16 08:41:50 -04:00
Antonio SJ Musumeci
7a84555db8 update travis config to include bionic 2019-09-16 08:29:07 -04:00
trapexit
0b0f0a1b9e
Merge pull request #663 from trapexit/random
only return 1 branch for rand/eprand policies
2019-09-07 17:27:56 -04:00
Antonio SJ Musumeci
0fffabfbe3 only return 1 branch for rand/eprand policies 2019-09-07 17:25:06 -04:00
trapexit
6b3f703ba9
Merge pull request #662 from trapexit/unlink
initialize mutex to fix lockup
2019-09-07 15:14:10 -04:00
Antonio SJ Musumeci
50ad648ce4 initialize mutex to fix lockup 2019-09-07 14:10:36 -04:00
trapexit
2dbcd2b07a
Merge pull request #660 from trapexit/docs
add UPGRADE section
2019-09-03 21:43:47 -04:00
Antonio SJ Musumeci
752a15953a add UPGRADE section 2019-09-03 21:43:18 -04:00
trapexit
23d365f67b
Merge pull request #659 from zofrex/relink-mount-mergerfs
Force symlink creation (don't error if it already exists)
2019-08-31 13:46:13 -04:00
James Sanderson
f77d1d9929 Force symlink creation (don't error if it already exists) 2019-08-31 18:41:54 +01:00
trapexit
4204c807bc
Merge pull request #657 from trapexit/docs
update how it works
2019-08-20 20:16:03 -04:00
Antonio SJ Musumeci
e6a6ab967b update how it works 2019-08-20 20:13:25 -04:00
trapexit
52e4d60e7c
Merge pull request #655 from tnilanon/master
Update README.md
2019-08-15 06:22:39 -04:00
Tanachat Nilanon
38919add61
Update README.md
Fixed typo: changed ' to `
2019-08-14 23:57:56 -07:00
trapexit
a7244184bd
Merge pull request #653 from xlotlu/patch-1
fix some grammar and typos
2019-08-01 08:06:52 -04:00
Ionuț Ciocîrlan
86bda61aa7
fix some grammar and typos 2019-08-01 14:35:00 +03:00
trapexit
10e5829b8e
Merge pull request #643 from trapexit/ioctl_setuid
set uid & gid when calling ioctl
2019-06-17 17:09:16 -04:00
Antonio SJ Musumeci
4c4c27a93e set uid & gid when calling ioctl
Turns out certain ioctl calls check the effective user id (FS_IOC_SETFLAGS).
2019-06-17 13:37:15 -04:00
trapexit
72ac1fc0d1
Merge pull request #639 from trapexit/args
accept old arguments for backwards compatibility
2019-06-10 20:24:36 -04:00
Antonio SJ Musumeci
5ca928e436 accept old arguments for backwards compatibility 2019-06-10 20:20:41 -04:00
trapexit
5d013f4a18
Merge pull request #636 from trapexit/max_pages
allow setting of 'max_pages' (via 'fuse_msg_size')
2019-06-03 21:16:53 -04:00
Antonio SJ Musumeci
7cbd88ac81 allow setting of 'max_pages' (via 'fuse_msg_size')
Linux 4.20 and above allow setting the number of pages per FUSE message
upto 256 (4K * 256 = 1MiB). This can greatly increase read and write
speeds depending on the workload.
2019-06-03 21:01:19 -04:00
trapexit
24af276542
Merge pull request #635 from trapexit/copy_file_range
add copy_file_range support
2019-06-03 08:31:22 -04:00
Antonio SJ Musumeci
8cb7195c3e add copy_file_range support 2019-06-03 07:12:05 -04:00
trapexit
c8e178bf71
Merge pull request #633 from trapexit/cache.files
add file caching across opens and runtime control
2019-05-30 00:28:28 -04:00
Antonio SJ Musumeci
529a953e30 add file caching across opens and runtime control 2019-05-30 00:10:08 -04:00
trapexit
02b657edff
Merge pull request #632 from trapexit/async-read
jmake async_read optional again
2019-05-28 17:10:17 -04:00
Antonio SJ Musumeci
ddf6a2f105 make async_read optional again 2019-05-28 15:57:50 -04:00
trapexit
40a4762cac
Merge pull request #630 from trapexit/cache-dir
add readdir caching
2019-05-23 22:26:19 -04:00
Antonio SJ Musumeci
2323c16316 add readdir caching 2019-05-23 22:11:33 -04:00
trapexit
bac4b33ef8
Merge pull request #629 from trapexit/cache-symlink
add symlink caching
2019-05-22 19:50:49 -04:00
Antonio SJ Musumeci
1baa706d37 add symlink caching 2019-05-22 19:25:38 -04:00
trapexit
9e3331dab4
Merge pull request #628 from trapexit/hide-cleanup
fix for unlink race condition
2019-05-21 23:09:13 -04:00
Antonio SJ Musumeci
61cded5b34 fix for unlink race condition 2019-05-21 22:57:02 -04:00
trapexit
060cae6270
Merge pull request #627 from trapexit/symlink
fix mount.mergerfs generation
2019-05-20 08:18:21 -04:00
Antonio SJ Musumeci
229d8517c0 fix mount.mergerfs generation 2019-05-20 08:17:06 -04:00
trapexit
cc9381f578
Merge pull request #624 from trapexit/parallel_dirops
ensure parallel dirops is enabled if capable
2019-05-20 00:37:56 -04:00
Antonio SJ Musumeci
5f2221155c ensure parallel dirops is enabled if capable 2019-05-20 00:36:42 -04:00
trapexit
7da8dd6b7a
Merge pull request #623 from trapexit/async_dio
ensure async_aio is enabled if capable
2019-05-20 00:22:06 -04:00
Antonio SJ Musumeci
2b019b84b0 ensure async_aio is enabled if capable 2019-05-20 00:18:56 -04:00
trapexit
741c559df1
Merge pull request #622 from trapexit/rename
ensure marking open files renamed over as hidden
2019-05-19 23:43:24 -04:00
Antonio SJ Musumeci
3a66a68edb ensure marking open files renamed over as hidden 2019-05-19 23:25:46 -04:00
trapexit
af1c0d78e8
Merge pull request #621 from trapexit/posix-acl
add support for POSIX ACLs
2019-05-19 18:26:49 -04:00
Antonio SJ Musumeci
80d56ac94e add support for POSIX ACLs 2019-05-19 18:17:55 -04:00
trapexit
41881f9d05
Merge pull request #620 from trapexit/flock
remove 'remote' flock support
2019-05-19 17:40:03 -04:00
Antonio SJ Musumeci
1ca70521a4 remove 'remote' flock support 2019-05-19 17:34:56 -04:00
trapexit
ee0d87d712
Merge pull request #619 from trapexit/hiddenfiles
fix renaming over open unlinked file
2019-05-16 14:49:38 -04:00
Antonio SJ Musumeci
c21aa34221 fix renaming over open unlinked file 2019-05-16 14:40:30 -04:00
trapexit
1ad79067e4
Merge pull request #617 from trapexit/docs
update support section of README
2019-05-12 23:58:28 -04:00
Antonio SJ Musumeci
810871d2df update support section of README 2019-05-12 23:57:15 -04:00
trapexit
6404939156
Merge pull request #615 from trapexit/fsname
fix setting of fsname
2019-05-12 14:30:37 -04:00
Antonio SJ Musumeci
e052446713 fix setting of fsname 2019-05-12 14:07:21 -04:00
trapexit
5e16851c79
Merge pull request #611 from trapexit/man
tweak docs
2019-05-10 12:03:22 -04:00
Antonio SJ Musumeci
5883020784 tweak docs 2019-05-10 11:54:41 -04:00
trapexit
726c1c850c
Merge pull request #610 from trapexit/tests
create integration tests
2019-05-05 17:50:08 -04:00
Antonio SJ Musumeci
374580a85d create integration tests 2019-05-04 17:16:52 -04:00
trapexit
4293cb7253
Merge pull request #609 from trapexit/make
cleanup and rework build system
2019-05-03 18:49:45 -04:00
Antonio SJ Musumeci
825fcf7f35 cleanup and rework build system 2019-05-03 09:42:15 -04:00
trapexit
85e2a3e71b
Merge pull request #605 from trapexit/man
add reference to 32bit mmap kernel bug
2019-04-23 20:02:01 -04:00
Antonio SJ Musumeci
3288d834a9 add reference to 32bit mmap kernel bug 2019-04-23 20:01:36 -04:00
trapexit
209dc2252a
Merge pull request #603 from trapexit/backcompat
fix outarg size to accomidate newer fuse_kernel.h on older platforms
2019-04-16 22:23:03 -04:00
Antonio SJ Musumeci
df0d0552b2 fix outarg size calculation to accomidate newer fuse_kernel.h on older platforms 2019-04-16 22:13:32 -04:00
trapexit
05f33c84e4
Merge pull request #601 from trapexit/hidden
remove .fuse_hidden file creation
2019-04-14 19:52:19 -04:00
Antonio SJ Musumeci
6ecc618d83 remove .fuse_hidden file creation
addresses #521

mergerfs is written using libfuse's high level API. The HLAPI forces a certain
behavior with regard to unlinking or rename overwriting of open files. It
renames the file to .fuse_hiddenXXXXXX and when incoming requests refer
to the unlinked file it will use path based calls and use that path.

This behavior leads to rmdirs failing or some software noticing
the .fuse_hidden files.

This patch changes the HLAPI and removes entirely the .fuse_hidden behavior.

See the README for more.
2019-04-13 21:41:51 -04:00
trapexit
46be946672
Merge pull request #599 from trapexit/clonefile
fall back to other file copy methods in clonefile
2019-04-13 15:15:37 -04:00
Antonio SJ Musumeci
2a075ead92 fall back to other file copy methods in clonefile 2019-04-13 15:08:13 -04:00
trapexit
8bd09628ef
Merge pull request #593 from trapexit/outbuf
ioctl: don't set outbufsz when not needed
2019-03-20 10:30:56 -04:00
Antonio SJ Musumeci
b69819e4b2 ioctl: don't set outbufsz when not needed 2019-03-20 10:18:55 -04:00
trapexit
2ca0cb0fbf
Merge pull request #592 from trapexit/tarball
makefile: remove superclean dependency from tarball
2019-03-12 23:24:41 -04:00
Antonio SJ Musumeci
61d764d0fd makefile: remove superclean dependency from tarball 2019-03-12 23:24:17 -04:00
trapexit
8b007ada61
Merge pull request #591 from trapexit/parallel-deb
parallel deb building
2019-03-12 23:14:06 -04:00
Antonio SJ Musumeci
b0b265b8e5 parallel deb building 2019-03-12 23:11:27 -04:00
trapexit
cab7033d5b
Merge pull request #589 from trapexit/make
rework makefiles for better manage parallel builds
2019-03-10 19:39:08 -04:00
Antonio SJ Musumeci
1be9900733 rework makefiles for better manage parallel builds 2019-03-10 19:29:35 -04:00
trapexit
3c2a9cd4f8
Merge pull request #586 from trapexit/man
replace {attr,entry,negative}_timeout references
2019-02-23 01:40:08 -05:00
Antonio SJ Musumeci
38037feab7 replace {attr,entry,negative}_timeout references 2019-02-23 01:39:28 -05:00
trapexit
99d44cfc5d
Merge pull request #585 from trapexit/debfix
fix building of deb pkg
2019-02-23 01:35:59 -05:00
Antonio SJ Musumeci
2af0dcd273 fix building of deb pkg 2019-02-23 01:35:22 -05:00
trapexit
d9f430fda8
Merge pull request #584 from trapexit/timeouts
make attr, entry, negative_entry cache timeouts runtime configurable
2019-02-23 01:24:45 -05:00
Antonio SJ Musumeci
0918dfd117 make attr, entry, negative_entry cache timeouts runtime configurable 2019-02-23 01:03:20 -05:00
trapexit
a64c7c97ad
Merge pull request #583 from trapexit/libfuse
replace libfuse's autoconf with makefile and ecfd
2019-02-18 21:46:10 -05:00
Antonio SJ Musumeci
95c0cc741d replace libfuse's autoconf with makefile 2019-02-18 21:36:32 -05:00
trapexit
8b0342067c
Merge pull request #582 from trapexit/discord
add discord server to docs
2019-02-17 14:55:56 -05:00
Antonio SJ Musumeci
1d48dba0b7 add discord server to docs 2019-02-17 14:46:50 -05:00
trapexit
e8622fdd64
Merge pull request #581 from trapexit/ioctl
fix FS_IOC_{GET,SET}{FLAGS,VERSION} ioctl calls
2019-02-17 13:11:57 -05:00
Antonio SJ Musumeci
7bf607bb6b fix FS_IOC_{GET,SET}{FLAGS,VERSION} ioctl calls 2019-02-17 11:48:19 -05:00
trapexit
a80f9a0b29
Merge pull request #580 from trapexit/freebsd
misc fixes for FreeBSD
2019-02-06 23:43:16 -05:00
Antonio SJ Musumeci
940c323251 misc fixes for FreeBSD 2019-02-06 23:20:28 -05:00
trapexit
babe8bcf47
Merge pull request #579 from trapexit/freebsd
remove O_LARGEFILE
2019-02-06 21:14:50 -05:00
Antonio SJ Musumeci
5ab7d2dd72 remove O_LARGEFILE 2019-02-06 21:06:11 -05:00
trapexit
401502579b
Merge pull request #577 from trapexit/modules
remove libfuse modules
2019-02-03 19:56:45 -05:00
Antonio SJ Musumeci
65d3bfe84d remove libfuse modules 2019-02-03 19:49:11 -05:00
trapexit
cfd5d31338
Merge pull request #575 from trapexit/cleanup
general code cleanup
2019-01-31 23:50:40 -05:00
Antonio SJ Musumeci
9d9ee7b71d general code cleanup 2019-01-31 22:47:09 -05:00
trapexit
5a1a60742e
Merge pull request #574 from trapexit/opts
remove `defaults`, hard code atomic_o_trunc, big_writes, and default_…
2019-01-30 22:53:35 -05:00
Antonio SJ Musumeci
c5b2415daf remove defaults, hard code atomic_o_trunc, big_writes, and default_permissions
`defaults` is a value used by all filesystems and isn't passed through to
mergerfs when mounting via the fstab or the mount command. This led
to inconsistent application of options. atomic_o_trunc, big_writes, and
default_permissions should be enabled all the time anyway and splice_*
can lead to issues so they are not always enabled.
2019-01-30 22:46:21 -05:00
trapexit
a0bb2f8480
Merge pull request #568 from trapexit/docs
fix <> escaping in argument list
2019-01-24 11:16:55 -05:00
Antonio SJ Musumeci
f4a06cae18 fix <> escaping in argument list 2019-01-24 11:15:55 -05:00
trapexit
21d690a210
Merge pull request #567 from trapexit/statfs_cache
add statfs cache
2019-01-23 23:11:17 -05:00
Antonio SJ Musumeci
5be7e007ce add statfs cache 2019-01-23 23:06:07 -05:00
trapexit
f42bd8666e
Merge pull request #565 from trapexit/open_cache
add policy cache for 'open'
2019-01-22 22:50:25 -05:00
Antonio SJ Musumeci
7a057daa0c add policy cache for 'open'
A fusepath -> basepath cache for `open` to limit the overhead of FUSE in 'open, read/write, close' patterns (such as Transmission).
2019-01-22 09:21:15 -05:00
trapexit
8e0aa1d9a6
Merge pull request #564 from trapexit/nfs
add mention of noforget argument for NFS exports
2019-01-21 18:42:19 -05:00
Antonio SJ Musumeci
a13b822543 add mention of noforget argument for NFS exports 2019-01-21 18:41:19 -05:00
trapexit
40319081e0
Merge pull request #563 from trapexit/ioctl
make ioctl on directories use open policy
2019-01-18 22:58:13 -05:00
Antonio SJ Musumeci
9fd3b968fc make ioctl on directories use open policy 2019-01-18 22:41:52 -05:00
trapexit
24a7973955
Merge pull request #559 from trapexit/docs
clarify descriptions regarding funcitons and those without policies
2019-01-15 10:26:46 -05:00
Antonio SJ Musumeci
a57c680cc8 clarify descriptions regarding funcitons and those without policies 2019-01-15 10:18:57 -05:00
trapexit
11be067895
Merge pull request #558 from trapexit/docs
add more info on different caching techniques
2019-01-15 09:51:09 -05:00
Antonio SJ Musumeci
3a1213435f add more info on different caching techniques 2019-01-15 09:39:39 -05:00
trapexit
56f7df028b
Merge pull request #556 from trapexit/direct
set direct_io per open/create, now runtime configurable
2019-01-11 15:36:39 -05:00
Antonio SJ Musumeci
87b2795f2b set direct_io per open/create, now runtime configurable 2019-01-11 15:23:14 -05:00
trapexit
c36bc5320d
Merge pull request #555 from trapexit/docs
misc doc updates
2019-01-09 11:31:40 -05:00
Antonio SJ Musumeci
7eefb58ff7 misc doc updates 2019-01-09 11:25:06 -05:00
trapexit
6a247501e1
Merge pull request #552 from trapexit/enospc
update README regarding valid ENOSPC errors
2019-01-07 09:26:35 -05:00
Antonio SJ Musumeci
0b5a0d1228 update README regarding valid ENOSPC errors 2019-01-07 09:20:34 -05:00
trapexit
8686eadcf4
Merge pull request #550 from trapexit/mv_warning
mention mv quirk in known issues
2019-01-06 13:24:51 -05:00
Antonio SJ Musumeci
aa56e12040 mention mv quirk in known issues 2019-01-06 13:24:12 -05:00
trapexit
adcbf0eef0
Merge pull request #549 from trapexit/cow
optimize link_cow eligibility check
2019-01-04 10:53:19 -05:00
Antonio SJ Musumeci
10f7f8bdea optimize link_cow eligibility check 2019-01-04 10:21:28 -05:00
trapexit
90e422c113
Merge pull request #544 from trapexit/newest
check minfreespace on newest policy create
2018-12-12 15:56:58 -05:00
Antonio SJ Musumeci
dfa1c1ad6f check minfreespace on newest policy create 2018-12-12 15:53:53 -05:00
trapexit
bd792757e0
Merge pull request #543 from trapexit/docs
misc README updates
2018-12-12 15:52:18 -05:00
Antonio SJ Musumeci
40969402e8 misc README updates 2018-12-12 15:48:53 -05:00
trapexit
fee9a449ba
Merge pull request #539 from trapexit/makefile_cleanup
general cleanup of makefile, add static & lto building
2018-12-02 15:34:14 -05:00
Antonio SJ Musumeci
6de8e4471c general cleanup of makefile, add static & lto building 2018-12-02 15:30:15 -05:00
trapexit
f0f64f8ed1
Merge pull request #537 from trapexit/alpine
fix building on alpine w/ musl
2018-11-28 19:40:53 -05:00
Antonio SJ Musumeci
6ae68465cf fix building on alpine w/ musl 2018-11-28 17:08:40 -05:00
trapexit
3c1f19e85a
Merge pull request #534 from trapexit/xattr
change xattr setting notsup to nosys
2018-11-19 23:32:07 -05:00
trapexit
2a8a6b8fe0
Merge pull request #533 from trapexit/truncate
fix indexing of truncate targets
2018-11-19 23:31:12 -05:00
Antonio SJ Musumeci
7d9458fdd1 change xattr setting notsup to nosys 2018-11-19 23:30:39 -05:00
Antonio SJ Musumeci
43b676a6e2 fix indexing of truncate targets 2018-11-19 23:25:16 -05:00
trapexit
606d9c4d3f
Merge pull request #531 from trapexit/o_path
fix building on platforms without O_PATH
2018-11-06 08:15:02 -05:00
Antonio SJ Musumeci
c46134c03a fix building on platforms without O_PATH 2018-11-06 07:59:28 -05:00
trapexit
0abb2a960c
Merge pull request #530 from trapexit/dedup
optimize readdir file dedup
2018-11-06 00:12:49 -05:00
Antonio SJ Musumeci
3631ab7df2 optimize readdir file dedup
Use fasthash64 to hash filenames to uint64_t and store in khash
set. Significantly reduces malloc/free'ing and memory usage.
2018-11-06 00:05:30 -05:00
trapexit
b8b3ab06a7
Merge pull request #529 from trapexit/statvfs
add ability to change statfs behavior
2018-11-05 21:38:41 -05:00
Antonio SJ Musumeci
680f8194f9 add ability to change statfs behavior 2018-11-05 21:33:27 -05:00
trapexit
3d33428a4e
Merge pull request #528 from trapexit/nc
rename NW (no write) to NC (no create)
2018-11-01 23:38:14 -04:00
Antonio SJ Musumeci
7524e57262 rename NW (no write) to NC (no create) 2018-11-01 23:37:45 -04:00
trapexit
1195e66a8a
Merge pull request #527 from trapexit/branch_tagging
add tagging branches RW/RO/NW
2018-11-01 23:22:59 -04:00
Antonio SJ Musumeci
b55ebba4ed add tagging branches RW/RO/NW
This allows users to tag a branch as readonly or not for writing regardless
of how the filesystem is mounted. Should simplify deployments and offer
more flexibility.
2018-11-01 23:13:49 -04:00
trapexit
8dd0dc11ee
Merge pull request #525 from trapexit/docs
misc updates to docs
2018-10-31 10:28:01 -04:00
Antonio SJ Musumeci
8eacb008b3 misc updates to docs 2018-10-31 10:22:40 -04:00
trapexit
9c16ab6999
Merge pull request #520 from trapexit/cleanups
misc cleanups
2018-10-24 22:47:28 -04:00
Antonio SJ Musumeci
9e0ab1f518 misc cleanups 2018-10-24 22:38:36 -04:00
trapexit
47bf58eae9
Merge pull request #517 from trapexit/cleanup
policy return cleanup
2018-10-15 19:19:37 -04:00
Antonio SJ Musumeci
8a48b74cb4 policy return cleanup 2018-10-15 19:03:02 -04:00
trapexit
570c93ec2c
Merge pull request #516 from trapexit/clone
add FICLONE and copy_file_range to clonefile
2018-10-12 10:42:26 -04:00
Antonio SJ Musumeci
85026d5780 add FICLONE and copy_file_range to clonefile
If available FICLONE and copy_file_range will be tried in addition to sendfile
when copying data between two files. The fallback is a tradition read/write
loop. On systems that support these it should improve performance.
2018-10-12 10:18:49 -04:00
trapexit
bb2e6eb605
Merge pull request #515 from trapexit/xattr.h
remove libattr dependency
2018-10-09 14:00:50 -04:00
Antonio SJ Musumeci
1885a82cce remove libattr dependency 2018-10-09 13:50:45 -04:00
trapexit
602a37b231
Merge pull request #514 from trapexit/runtime_xattr
add ability to turn on/off xattr support at runtime
2018-10-09 08:52:55 -04:00
Antonio SJ Musumeci
65f482e483 add ability to turn on/off xattr support at runtime 2018-10-09 08:41:31 -04:00
trapexit
6ee44e451c
Merge pull request #513 from trapexit/errno
fix building on certain platforms
2018-10-09 08:25:05 -04:00
Antonio SJ Musumeci
8d1a1564bf fix building on certain platforms 2018-10-09 08:23:37 -04:00
trapexit
4af9248eba
Merge pull request #509 from trapexit/cow
add link_cow feature
2018-10-06 22:48:01 -04:00
Antonio SJ Musumeci
93f7d7d927 add link_cow feature
When enabled if a regular file is opened which has a link count > 1 it will
copy the file to a temporary file and rename over the original. Effectively
breaking the link. This behavior is similar to cow-shell and other LD_PRELOAD
based "CoW" solutions.
2018-10-06 22:05:05 -04:00
trapexit
19a7d43b31
Merge pull request #506 from trapexit/literal_glob
keep literal when glob fails
2018-10-01 17:12:40 -04:00
Antonio SJ Musumeci
9afefef032 keep literal when glob fails 2018-10-01 16:56:40 -04:00
trapexit
8c3462caf2
Merge pull request #505 from trapexit/depends
add fuse to debian pkg dependency
2018-09-30 23:46:18 -04:00
Antonio SJ Musumeci
340f3c85c9 add fuse to debian pkg dependency 2018-09-30 23:45:46 -04:00
trapexit
ff04098319
Merge pull request #504 from trapexit/disable_security.capabilities
add security_capability option
2018-09-30 23:34:07 -04:00
Antonio SJ Musumeci
f8563369bc add security_capability option 2018-09-30 23:30:53 -04:00
trapexit
4152769182
Merge pull request #499 from trapexit/docs
add comment regarding tar error
2018-09-06 08:28:40 -04:00
Antonio SJ Musumeci
057eafef7f add comment regarding tar error 2018-09-06 08:28:21 -04:00
trapexit
c7e93720ff
Merge pull request #496 from trapexit/doc-updates
tweak docs, add FAQ regarding vendoring of libfuse
2018-08-20 13:40:41 -04:00
Antonio SJ Musumeci
587ab62583 tweak docs, add FAQ regarding vendoring of libfuse 2018-08-20 13:40:01 -04:00
trapexit
a894360402
Merge pull request #495 from ahippo/external-fuse
Option for building with system libfuse
2018-08-20 12:05:37 -04:00
Andrey Mazo
756d4ff0ff
Makefile: option for building with system libfuse
Add INTERNAL_FUSE variable to control linking against
bundled libfuse vs external/system libfuse.
If external libfuse is requested,
`pkg-config` is used to obtain CFLAGS/LIBS/LDFLAGS and
to check that the provided external libfuse is >= 2.9.7.

This might hopefully get mergerfs closer to inclusion into distros.

Link: https://github.com/trapexit/mergerfs/issues/431
Link: https://bugs.gentoo.org/587956#c6
2018-08-20 00:05:58 +03:00
Andrey Mazo
ec6adaa376
options: move "-o threads=" help text to libfuse/
Parsing of and acting upon "-o threads" option is done in the bundled `libfuse/`,
so move the corresponding help text there too.
This make help text consistent with behavior
when building against system libfuse,
which doesn't support this option.
2018-08-19 21:04:35 +03:00
trapexit
dee2c3e23b
Merge pull request #494 from trapexit/hardlinks
add FAQ entry on hard links
2018-08-18 22:10:54 -04:00
Antonio SJ Musumeci
fc52f89ddc add FAQ entry on hard links 2018-08-18 22:10:23 -04:00
trapexit
fdbafa63ba
Merge pull request #493 from ahippo/ldflags
Makefile: don't touch LDFLAGS
2018-08-13 07:18:58 -04:00
Andrey Mazo
e987ff46c2
Makefile: don't touch LDFLAGS
These are more like LIBS rather than LDFLAGS.
They are used just in one place,
so simply put them inline.

Also, use LDFLAGS provided by the user during actual link.

This helps users pass their own LDFLAGS.
For example, this is important on Gentoo,
where LDFLAGS='-Wl,-O1 -Wl,--as-needed' is passed by default.
2018-08-13 06:02:29 +03:00
trapexit
b1ecc58114
Merge pull request #491 from trapexit/inode_docs
add details regarding use_ino
2018-07-25 17:29:06 -04:00
Antonio SJ Musumeci
39d5ab8e83 add details regarding use_ino 2018-07-25 17:28:36 -04:00
trapexit
4b1f9afe1e
Merge pull request #482 from trapexit/docs
change examples to use /mnt rather than /tmp
2018-05-04 08:59:27 -04:00
Antonio SJ Musumeci
c005463111 change examples to use /mnt rather than /tmp 2018-05-04 09:00:27 -04:00
trapexit
50384f4e86
Merge pull request #475 from trapexit/version
fix version.hpp creation, again
2018-03-24 06:53:35 -07:00
Antonio SJ Musumeci
73e8867400 fix version.hpp creation, again 2018-03-24 09:51:25 -04:00
trapexit
0545da67ff
Merge pull request #474 from trapexit/version
fix versioning with tarball building
2018-03-16 23:27:04 -04:00
Antonio SJ Musumeci
24e690b995 fix versioning with tarball building 2018-03-16 23:26:29 -04:00
trapexit
89200a0ab8
Merge pull request #473 from trapexit/version
version bumps and calculation fixes
2018-03-09 21:14:44 -05:00
Antonio SJ Musumeci
e521833cec bump change date on readme and rebuild man 2018-03-09 21:12:52 -05:00
Antonio SJ Musumeci
737d941941 bump builtin libfuse version 2018-03-09 21:10:09 -05:00
Antonio SJ Musumeci
9830e29945 fix version generation 2018-03-09 21:06:00 -05:00
trapexit
6418b00ac3
Merge pull request #472 from trapexit/clonepathperms
ignore clonepath metadata errors. fixes #470
2018-03-08 16:56:33 -05:00
Antonio SJ Musumeci
cfe9c28a10 ignore clonepath metadata errors. fixes #470 2018-03-08 16:55:35 -05:00
trapexit
aa6e4c1865
Merge pull request #471 from trapexit/clonepath
stop clonepath at base directory. fixes #467
2018-03-08 16:48:53 -05:00
Antonio SJ Musumeci
f48c16d162 stop clonepath at base directory. fixes #467 2018-03-07 18:46:32 -05:00
trapexit
62ae871d51
Merge pull request #469 from trapexit/hard_remove
add hard_remove details and comment on unionfs
2018-03-03 13:25:15 -05:00
trapexit
906702de77
add hard_remove details and comment on unionfs 2018-03-03 13:24:49 -05:00
trapexit
db27a91a58
Merge pull request #461 from agsimmons/master
Remove duplicate word in README
2018-01-18 15:41:57 -05:00
Andrew Simmons
b4a003c5a8
Remove duplicate word in README 2018-01-18 15:38:16 -05:00
trapexit
b48054fa2c
add XRP to support list 2017-12-21 09:47:53 -05:00
trapexit
d8f05ac8ae
add BCH, ETH, & LTC donation addresses 2017-12-20 22:11:26 -05:00
trapexit
8843ace757
Merge pull request #454 from trapexit/faq
add explination in FAQ about what mergerfs is / is not
2017-11-15 16:40:24 -05:00
Antonio SJ Musumeci
7d93d5917e add explination in FAQ about what mergerfs is / is not 2017-11-15 16:39:25 -05:00
trapexit
8846a135bc
Merge pull request #452 from trapexit/faq
faq answer on epmfs
2017-11-07 14:49:38 -05:00
Antonio SJ Musumeci
7207e7fdd6 faq answer on epmfs 2017-11-07 14:48:38 -05:00
trapexit
a8e6128034
Merge pull request #451 from trapexit/faq
update FAQ and misc tweaks
2017-11-07 09:00:29 -05:00
Antonio SJ Musumeci
f72bb1e1ed update FAQ and misc tweaks 2017-11-07 08:59:49 -05:00
trapexit
cf5d28ea4a
Merge pull request #450 from trapexit/support
add support info and how mergerfs works section
2017-11-05 13:44:40 -05:00
Antonio SJ Musumeci
bd14f33c31 add support info and how mergerfs works section 2017-11-05 13:43:33 -05:00
trapexit
73561c1861
Merge pull request #449 from trapexit/issue-template
Create issue_template.md
2017-11-05 12:10:15 -05:00
trapexit
43d50ca471
Create issue_template.md 2017-11-05 12:09:53 -05:00
trapexit
8ea0b395b2 Merge pull request #445 from trapexit/setreuid
call 32bit versions of set/geteuid on 32bit platforms
2017-10-17 22:23:27 -04:00
Antonio SJ Musumeci
1d6d22727c call 32bit versions of set/geteuid on 32bit platforms 2017-10-17 22:21:29 -04:00
Antonio SJ Musumeci
b3c10f5bdf Merge pull request #435 from trapexit/man
rebuild manpage
2017-08-06 14:43:03 -04:00
Antonio SJ Musumeci
821d1b6964 rebuild manpage 2017-08-06 14:42:35 -04:00
Antonio SJ Musumeci
6067478e00 Merge pull request #434 from trapexit/makefile
fixup makefile
2017-08-06 14:41:11 -04:00
Antonio SJ Musumeci
ebe737e995 fixup makefile 2017-08-06 14:39:56 -04:00
Antonio SJ Musumeci
e2a9509896 Merge pull request #433 from trapexit/doc-update
misc updates to docs
2017-08-06 14:34:14 -04:00
Antonio SJ Musumeci
9104f25c09 misc updates to docs 2017-08-06 14:33:59 -04:00
Antonio SJ Musumeci
713c911264 Merge pull request #429 from trapexit/support
expand support section of readme
2017-07-30 16:53:26 -04:00
Antonio SJ Musumeci
c1d85ef825 expand support section of readme 2017-07-30 16:52:29 -04:00
Antonio SJ Musumeci
43eaf29df5 Merge pull request #428 from trapexit/cacheinfo
add info on creating a caching behavior
2017-07-23 19:59:26 -04:00
Antonio SJ Musumeci
cc1f07ef39 add info on creating a caching behavior 2017-07-23 19:59:11 -04:00
Antonio SJ Musumeci
c35a4dadee Merge pull request #424 from trapexit/threading
Threading
2017-07-03 00:02:35 -04:00
Antonio SJ Musumeci
75ed37a11a add setting of thread pool size 2017-07-02 23:50:39 -04:00
Antonio SJ Musumeci
8043829815 fixed threads 2017-07-01 23:29:47 -04:00
Antonio SJ Musumeci
deb70c7a4f Merge pull request #423 from trapexit/khash
improve khash performance
2017-07-01 11:54:39 -04:00
Antonio SJ Musumeci
0708110ec1 improve khash performance 2017-07-01 11:53:35 -04:00
Antonio SJ Musumeci
dae637925b Merge pull request #422 from trapexit/pragma
use pragma once in headers
2017-06-30 11:53:31 -04:00
Antonio SJ Musumeci
a7b126cb48 use pragma once in headers 2017-06-30 11:38:34 -04:00
Antonio SJ Musumeci
d66774d3f3 Merge pull request #421 from trapexit/ignorepponrename
add 'ignore path preserving on rename' feature
2017-06-30 00:02:08 -04:00
Antonio SJ Musumeci
a2bddec8c7 add 'ignore path preserving on rename' feature 2017-06-30 00:01:00 -04:00
Antonio SJ Musumeci
b95fbd76ec Merge pull request #420 from trapexit/mkstemp-movefile
use temp files (then rename) when moving files for moveonenospc
2017-06-28 21:18:59 -04:00
Antonio SJ Musumeci
aea2b40dda use temp files (then rename) when moving files for moveonenospc 2017-06-28 21:17:47 -04:00
Antonio SJ Musumeci
fa3ff40218 Merge pull request #418 from trapexit/fix
use fusepath from fileinfo. closes #417
2017-06-24 17:04:37 -04:00
Antonio SJ Musumeci
bfd410def2 use fusepath from fileinfo. closes #417 2017-06-24 17:03:41 -04:00
Antonio SJ Musumeci
721bd4d337 Merge pull request #416 from trapexit/time
add time.h to fix compiling on some platforms
2017-06-15 19:36:31 -04:00
Antonio SJ Musumeci
7296d3d90d add time.h to fix compiling on some platforms 2017-06-15 19:35:28 -04:00
Antonio SJ Musumeci
a7cddefcc9 Merge pull request #415 from trapexit/static
add libfuse 2.9.7 to repo and build against libfuse.a
2017-06-02 16:14:54 -04:00
Antonio SJ Musumeci
de0985c135 add libfuse 2.9.7 to repo and build against libfuse.a 2017-06-02 11:25:25 -04:00
Antonio SJ Musumeci
986f230ba7 Merge pull request #412 from trapexit/benchmark
add nullrw feature to facilitate benchmarking
2017-05-26 19:51:28 -04:00
Antonio SJ Musumeci
87c2f2f9dc add nullrw feature to facilitate benchmarking 2017-05-26 18:11:18 -04:00
Antonio SJ Musumeci
63f84b255f Merge pull request #409 from trapexit/ro-symlinks
symlinkify: file -> symlink-to-original-file after timeout
2017-05-05 00:47:24 -04:00
Antonio SJ Musumeci
6a7675f2bf symlinkify: file -> symlink-to-original-file after timeout 2017-05-05 00:14:04 -04:00
Antonio SJ Musumeci
25ce9938c6 Merge pull request #405 from trapexit/runtime-drop
make dropcacheonclose runtime configurable
2017-04-21 17:00:12 -04:00
Antonio SJ Musumeci
8ba3a08f40 make dropcacheonclose runtime configurable 2017-04-21 16:58:39 -04:00
Antonio SJ Musumeci
23dbe48324 Merge pull request #403 from trapexit/copyfile
better handle incomplete reads/writes in copying files
2017-04-13 13:21:34 -04:00
Antonio SJ Musumeci
ccaa458739 better handle incomplete reads/writes in copying files 2017-04-13 12:55:34 -04:00
Antonio SJ Musumeci
f95b07f83b Merge pull request #402 from trapexit/nopath
enable nopath and nullpath_ok
2017-04-12 14:39:44 -04:00
Antonio SJ Musumeci
162b99e6b8 enable nopath and nullpath_ok 2017-04-12 13:52:06 -04:00
Antonio SJ Musumeci
3c8afc1bb0 Merge pull request #400 from trapexit/movefile-tweak
tweak movefile behavior
2017-04-11 15:25:07 -04:00
Antonio SJ Musumeci
f15437c713 tweak movefile behavior 2017-04-11 15:24:09 -04:00
Antonio SJ Musumeci
d9be1c4841 Merge pull request #399 from trapexit/travis
add more travis build targets
2017-04-11 10:07:35 -04:00
Antonio SJ Musumeci
5f3aa6eee5 add more travis build targets 2017-04-11 10:00:37 -04:00
Antonio SJ Musumeci
1089af9077 Merge pull request #398 from trapexit/fadvise
hide fs::fadvise as it's not used directly
2017-04-11 09:59:00 -04:00
Antonio SJ Musumeci
2fbeb67dd9 hide fs::fadvise as it's not used directly 2017-04-11 09:42:33 -04:00
Antonio SJ Musumeci
c4ad239171 Merge pull request #397 from trapexit/fadvise
support older libfuse without utime_omit_ok flag
2017-04-11 09:32:36 -04:00
Antonio SJ Musumeci
8b976ab3c1 support older libfuse without utime_omit_ok flag 2017-04-11 09:23:40 -04:00
Antonio SJ Musumeci
1499ccf3fb Merge pull request #396 from trapexit/fadvise
fadvise cleanup
2017-04-11 09:03:12 -04:00
Antonio SJ Musumeci
1a1fa06aa3 fadvise cleanup 2017-04-11 09:02:05 -04:00
Antonio SJ Musumeci
e3e764ecae Merge pull request #395 from trapexit/utime-omit
enable utime_omit_ok flag
2017-04-10 21:38:54 -04:00
Antonio SJ Musumeci
617195d71e enable utime_omit_ok flag 2017-04-10 21:36:56 -04:00
Antonio SJ Musumeci
8cfb1cbee4 Merge pull request #394 from trapexit/getgrouplist
work around getgrouplist signature difference on osx
2017-04-08 10:24:26 -04:00
Antonio SJ Musumeci
be3eb7e3ed work around getgrouplist signature difference on osx 2017-04-07 16:23:18 -04:00
Antonio SJ Musumeci
1c3b72de09 Merge pull request #393 from trapexit/inode
handle 32bit and 64bit inode recalculation
2017-04-07 10:47:49 -04:00
Antonio SJ Musumeci
0600734942 handle 32bit and 64bit inode recalculation 2017-04-07 09:47:19 -04:00
Antonio SJ Musumeci
e6dc8c2cb3 Merge pull request #392 from trapexit/fadvise
restructure fadvise
2017-04-07 00:22:12 -04:00
Antonio SJ Musumeci
9d0798dbfb restructure fadvise 2017-04-07 00:12:57 -04:00
Antonio SJ Musumeci
581356a0c3 Merge pull request #391 from trapexit/fallocate
restructure fallocate abstraction
2017-04-06 23:40:41 -04:00
Antonio SJ Musumeci
e2acffe55b restructure fallocate abstraction 2017-04-06 23:35:31 -04:00
Antonio SJ Musumeci
998966e6e6 Merge pull request #390 from trapexit/futimesat
abstract futimesat
2017-04-06 23:21:41 -04:00
Antonio SJ Musumeci
42d454ac27 abstract futimesat 2017-04-06 23:13:02 -04:00
Antonio SJ Musumeci
ad6062b9a8 Merge pull request #389 from trapexit/stattime
abstract access to highres atime/mtime
2017-04-06 22:22:48 -04:00
Antonio SJ Musumeci
0b2bf17cd7 abstract access to highres atime/mtime 2017-04-06 22:16:17 -04:00
Antonio SJ Musumeci
292b850e07 Merge pull request #388 from trapexit/types
use correct integer types
2017-04-06 21:35:52 -04:00
Antonio SJ Musumeci
e20d566f96 use correct integer types 2017-04-06 21:29:39 -04:00
Antonio SJ Musumeci
776ff3e3f1 Merge pull request #387 from trapexit/cppfind
use compiler's preprocessor rather than cpp explicitly
2017-04-06 21:15:02 -04:00
Antonio SJ Musumeci
1539aca3d8 use compiler's preprocessor rather than cpp explicitly 2017-04-06 21:08:55 -04:00
Antonio SJ Musumeci
3244314310 Merge pull request #386 from trapexit/travis-ci
setup travis-ci
2017-04-04 08:41:32 -04:00
Antonio SJ Musumeci
9d799ffc9f setup travis-ci 2017-04-04 08:32:36 -04:00
Antonio SJ Musumeci
9486bc9b21 Merge pull request #385 from trapexit/clone-errors
make fs::attr return ENOTSUP on EINVAL #381
2017-04-04 06:57:42 -04:00
Antonio SJ Musumeci
c043ef95a3 make fs::attr return ENOTSUP on EINVAL #381 2017-04-03 21:11:20 -04:00
Antonio SJ Musumeci
3728e39655 Merge pull request #383 from trapexit/docs
explicitly define path preservation, better explain move issues
2017-04-03 14:36:07 -04:00
Antonio SJ Musumeci
215f129a2a explicitly define path preservation, better explain move issues 2017-04-03 14:35:08 -04:00
Antonio SJ Musumeci
af9a71f84c Merge pull request #382 from trapexit/docs
fix incorrect section header syntax
2017-04-03 12:06:26 -04:00
Antonio SJ Musumeci
bb4ec913c6 fix incorrect section header syntax 2017-04-03 12:05:51 -04:00
Antonio SJ Musumeci
38e5815ba7 Merge pull request #379 from trapexit/docs
add info on inodes running out to faq on filled drives
2017-03-13 13:43:22 -04:00
Antonio SJ Musumeci
cf2cb54e2a add info on inodes running out to faq on filled drives 2017-03-13 13:42:46 -04:00
Antonio SJ Musumeci
b7269e9963 Merge pull request #378 from trapexit/docs
try to clarify how path preserving policies work and other tweaks to docs
2017-03-11 15:08:46 -05:00
Antonio SJ Musumeci
94ebccc6ed try to clarify how path preserving policies work and other tweaks to docs 2017-03-11 15:07:48 -05:00
Antonio SJ Musumeci
09dabc7b4c Merge pull request #376 from trapexit/docs
update docs to include dropcacheonclose and warn about directory mtime
2017-02-18 20:06:54 -05:00
Antonio SJ Musumeci
4e7e74d6f0 update docs to include dropcacheonclose and warn about directory mtime 2017-02-18 20:05:06 -05:00
Antonio SJ Musumeci
dca6cb4826 Merge pull request #374 from trapexit/flush-cache-on-close
add option to drop file caches before closing files
2017-02-18 16:59:49 -05:00
Antonio SJ Musumeci
6aa62d03ff add option to drop file caches before closing files 2017-02-18 16:06:29 -05:00
Antonio SJ Musumeci
3a89491507 Merge pull request #372 from trapexit/apply-but-check
check metadata on chown/chmod errors when cloning
2017-02-15 23:32:38 -05:00
Antonio SJ Musumeci
492d895632 check metadata on chown/chmod errors when cloning 2017-02-15 09:08:27 -05:00
Antonio SJ Musumeci
899670bc93 Merge pull request #365 from trapexit/docs
misc document updates
2017-01-31 19:24:48 -05:00
Antonio SJ Musumeci
9cc9bb9de2 misc document updates 2017-01-31 19:10:54 -05:00
Antonio SJ Musumeci
c25974de68 Merge pull request #362 from trapexit/docs
update documentation, focus on explaining double caching & direct_io
2017-01-19 12:01:10 -05:00
Antonio SJ Musumeci
16e7c72e99 update documentation, focus on explaining double caching & direct_io 2017-01-19 11:49:52 -05:00
Antonio SJ Musumeci
011febcb91 Merge pull request #361 from trapexit/cleanup
Cleanup
2017-01-18 23:30:30 -05:00
Antonio SJ Musumeci
a60d815e92 add ifndefs to all headers 2017-01-17 11:45:44 -05:00
Antonio SJ Musumeci
e93c946198 limit need to explicitly call .c_str() 2017-01-17 11:45:44 -05:00
Antonio SJ Musumeci
7b4e1ea36d remove clone command 2017-01-17 11:45:44 -05:00
Antonio SJ Musumeci
726b88e039 restructure error calculation 2017-01-17 11:45:43 -05:00
Antonio SJ Musumeci
078e4bab49 Merge pull request #360 from trapexit/posix-acl
check for system.posix_acl_default before setting umask
2017-01-16 23:21:51 -05:00
Antonio SJ Musumeci
d67d5dec77 check for system.posix_acl_default before setting umask 2017-01-16 12:19:58 -05:00
Antonio SJ Musumeci
10a9918d20 Merge pull request #352 from trapexit/directio
use different read and write functions when using direct_io
2016-12-20 17:08:20 -05:00
Antonio SJ Musumeci
1aa76a54c2 use different read and write functions when using direct_io 2016-12-20 17:06:34 -05:00
Antonio SJ Musumeci
437067b5e0 Merge pull request #351 from trapexit/inode
compute inode in readdir
2016-12-16 11:16:59 -05:00
Antonio SJ Musumeci
67b48fcb3a compute inode in readdir 2016-12-16 10:57:24 -05:00
Antonio SJ Musumeci
ea403b4f5a Merge pull request #350 from trapexit/versionfile
only remove src/version.hpp if git repo and git available
2016-12-14 21:42:58 -05:00
Antonio SJ Musumeci
b1459c6cdc only remove src/version.hpp if git repo and git available 2016-12-14 21:42:43 -05:00
Antonio SJ Musumeci
953bca02fc Merge pull request #349 from trapexit/inode
support setting of inodes (using use_ino option)
2016-12-14 18:55:15 -05:00
Antonio SJ Musumeci
c8fa51c81a support setting of inodes (using use_ino option)
creates a 64bit inode value from the underlying device value + original inode

final_ino = orig_ino | (dev << 32)

not perfect but given few filesystems use 64bit inodes nor is st_dev more than 16bit usually it should be fine
2016-12-14 18:53:21 -05:00
Antonio SJ Musumeci
365e153ae7 Merge pull request #348 from trapexit/readdir-set
replace std::set with klib's khash to increase readdir performance
2016-12-14 17:29:13 -05:00
Antonio SJ Musumeci
822204ff34 replace std::set with klib's khash to increase readdir performance 2016-12-14 17:24:48 -05:00
Antonio SJ Musumeci
9a261a7864 Merge pull request #341 from trapexit/docs
note that mergerfs should be run as root
2016-12-06 17:04:51 -05:00
Antonio SJ Musumeci
5f7a168d0b note that mergerfs should be run as root 2016-12-06 17:04:10 -05:00
Antonio SJ Musumeci
aa71116928 Merge pull request #340 from trapexit/clonepath-errors
return clonepath errors
2016-12-06 16:54:39 -05:00
Antonio SJ Musumeci
35075bb0cd return clonepath errors
currently the error is ignored and it was expected the primary call would
fail. problem is it returns confusing errors as a result. (eg ENOENT vs EPERM)
2016-12-06 16:48:52 -05:00
Antonio SJ Musumeci
05d81dbc23 update manpage 2016-11-15 23:35:06 -05:00
Antonio SJ Musumeci
00235c15bf Merge pull request #336 from trapexit/sigfpe
ignore filesystems which return zeros for statfs. closes #335
2016-11-15 23:27:49 -05:00
Antonio SJ Musumeci
3c5351af93 ignore filesystems which return zeros for statfs. closes #335 2016-11-15 23:27:17 -05:00
Antonio SJ Musumeci
12b9fc1750 Merge pull request #334 from trapexit/freebsd
changes to allow compiling on FreeBSD
2016-11-01 15:47:37 -04:00
Antonio SJ Musumeci
3d2283f10f clang cpp doesn't like grep exiting early 2016-10-31 09:39:10 -04:00
Antonio SJ Musumeci
192bb9c57e remove usage of -D from install 2016-10-28 22:04:15 -04:00
Antonio SJ Musumeci
157dae0d2f define O_LARGEFILE and O_NOATIME if needed 2016-10-28 22:04:15 -04:00
Antonio SJ Musumeci
00c814dc58 consolidate and simplify utime 2016-10-28 22:04:09 -04:00
Antonio SJ Musumeci
6d6fb45a3b check if fdatasync is available and return ENOSYS if not 2016-10-27 16:59:04 -04:00
Antonio SJ Musumeci
f954be60a4 Merge pull request #333 from yatesco/patch-1
minor correction of spelling mistake
2016-10-24 17:18:36 -04:00
Colin Yates
897f20bff8 minor correction of spelling mistake
:%s/cateogry/category/g
2016-10-24 09:32:41 +01:00
Antonio SJ Musumeci
c7c5b07389 Merge pull request #330 from trapexit/cleanup
further abstraction of system calls
2016-10-20 16:52:32 -04:00
Antonio SJ Musumeci
d0b6cd1f38 further abstraction of system calls 2016-10-20 16:51:49 -04:00
Antonio SJ Musumeci
1ad05d7783 Merge pull request #329 from trapexit/namespace
wrap most posix filesystem functions
2016-10-19 17:10:31 -04:00
Antonio SJ Musumeci
1dc7bff6e6 wrap most posix filesystem functions 2016-10-19 16:58:52 -04:00
Antonio SJ Musumeci
18d684cd16 Merge pull request #328 from trapexit/flock
add flock
2016-10-19 12:17:23 -04:00
Antonio SJ Musumeci
8f594e17d7 add flock 2016-10-19 11:58:44 -04:00
Antonio SJ Musumeci
77269a8bac Merge pull request #327 from trapexit/mhddfs
add some more explination to the FAQ
2016-10-19 09:39:25 -04:00
Antonio SJ Musumeci
cd90193deb add some more explination to the FAQ 2016-10-19 09:38:48 -04:00
Antonio SJ Musumeci
35fca6364f Merge pull request #325 from trapexit/readme
add mergerfs.ctl and scorch to tooling section
2016-10-14 13:27:18 -04:00
Antonio SJ Musumeci
cd71af8c5b add mergerfs.ctl and scorch to tooling section 2016-10-13 11:02:20 -04:00
Antonio SJ Musumeci
a7f26d3769 Merge pull request #324 from trapexit/edquota
add EDQUOT to errors which trigger moveonenospc
2016-10-07 10:27:31 -04:00
Antonio SJ Musumeci
3fb7f8919a add EDQUOT to errors which trigger moveonenospc 2016-10-06 13:54:57 -04:00
Antonio SJ Musumeci
abc4ed4d9f Merge pull request #321 from trapexit/manpage
update manpage
2016-09-19 17:07:42 -04:00
Antonio SJ Musumeci
dfa82699b9 update manpage 2016-09-19 17:07:41 -04:00
Antonio SJ Musumeci
b8beeaceb3 Merge pull request #320 from trapexit/setgroups-arm
use SYS_setgroup32 syscall if available. closes #319
2016-09-19 17:05:10 -04:00
Antonio SJ Musumeci
d9a79062b8 use SYS_setgroup32 syscall if available. closes #319 2016-09-19 17:04:11 -04:00
Antonio SJ Musumeci
a22b79c416 Merge pull request #318 from trapexit/pagecache-bug
add information about page cache kernel panic bug
2016-09-14 11:20:25 -04:00
Antonio SJ Musumeci
b1f2e94a2f add information about page cache kernel panic bug
https://lkml.org/lkml/2016/9/14/527
2016-09-14 11:20:13 -04:00
Antonio SJ Musumeci
2ebd386b5b Merge pull request #317 from trapexit/manpage
recreate manpage
2016-09-14 08:50:51 -04:00
Antonio SJ Musumeci
a8cd9b710e recreate manpage 2016-09-14 08:50:42 -04:00
Antonio SJ Musumeci
12d2cf7464 Merge pull request #316 from trapexit/debian-kfreebsd
small tweaks to build on Debian kFreeBSD
2016-09-14 08:36:25 -04:00
Antonio SJ Musumeci
7e423cd9ce small tweaks to build on Debian kFreeBSD 2016-09-14 08:36:06 -04:00
Antonio SJ Musumeci
fa3218cb72 Merge pull request #315 from trapexit/futimes
fix futimes version of utimes wrapper
2016-09-13 21:36:58 -04:00
Antonio SJ Musumeci
0395e7c776 fix futimes version of utimes wrapper 2016-09-13 21:30:45 -04:00
Antonio SJ Musumeci
a575cf76c2 Merge pull request #314 from trapexit/fadvise
fix #define typo
2016-09-13 17:40:28 -04:00
Antonio SJ Musumeci
93923177ee fix #define typo 2016-09-13 17:40:23 -04:00
Antonio SJ Musumeci
51858114b2 Merge pull request #313 from trapexit/fadvise
abstract posix_fadvise
2016-09-13 17:36:49 -04:00
Antonio SJ Musumeci
1513c92cbc abstract posix_fadvise 2016-09-13 17:36:28 -04:00
Antonio SJ Musumeci
7824586f76 Merge pull request #309 from jfreax/patch-1
Fix minor typo
2016-09-03 22:24:31 -04:00
Jens Dieskau
158dda9f23 Fix minor typo 2016-09-03 22:33:36 +02:00
Antonio SJ Musumeci
577bc67fa7 Merge pull request #305 from trapexit/ugid
rename include cpp files to have icpp extension
2016-08-26 14:44:43 -04:00
Antonio SJ Musumeci
1a698e5ef5 rename include cpp files to have icpp extension 2016-08-26 14:41:56 -04:00
Antonio SJ Musumeci
a0885e33dc Merge pull request #304 from trapexit/freebsd
fix some build issues with Debian/kFreeBSD
2016-08-26 13:10:41 -04:00
Antonio SJ Musumeci
2ee6b4f581 include sys/types.h to pick up ssize_t 2016-08-26 13:09:15 -04:00
Antonio SJ Musumeci
709dda5069 support systems without ENODATA 2016-08-26 12:59:32 -04:00
Antonio SJ Musumeci
f0f8e527b4 Merge pull request #301 from trapexit/time
make futimes crossplatform
2016-08-07 14:46:43 -04:00
Antonio SJ Musumeci
49474f01ca make futimes crossplatform 2016-08-07 14:42:54 -04:00
Antonio SJ Musumeci
9e8b309a90 Merge pull request #300 from trapexit/fuseversion
bump FUSE_USE_VERSION to 29
2016-08-04 17:15:37 -04:00
Antonio SJ Musumeci
f7547d7cf5 Merge pull request #299 from trapexit/realpath
use dynamic buffer for realpath
2016-08-04 17:14:09 -04:00
Antonio SJ Musumeci
bb02ab2cba Merge pull request #298 from trapexit/fssendfile
split sendfile wrapper into separate files
2016-08-04 17:13:28 -04:00
Antonio SJ Musumeci
fb1432e14e Merge pull request #297 from trapexit/fsattr
make fs_attr compile on unsupported platforms
2016-08-04 17:12:33 -04:00
Antonio SJ Musumeci
34d38cb0fb split sendfile wrapper into separate files 2016-08-04 17:11:23 -04:00
Antonio SJ Musumeci
192a9d54d1 make fs_attr compile on unsupported platforms 2016-08-04 17:10:02 -04:00
Antonio SJ Musumeci
40574bd138 use dynamic buffer for realpath 2016-08-04 14:52:27 -04:00
Antonio SJ Musumeci
064fd5560f bump FUSE_USE_VERSION to 29 2016-08-04 14:02:59 -04:00
Antonio SJ Musumeci
073d1b6f6f Merge pull request #296 from trapexit/fallocate
add osx version of fallocate
2016-08-02 23:46:21 -04:00
Antonio SJ Musumeci
45f757dc60 add osx version of fallocate 2016-08-02 17:14:45 -04:00
Antonio SJ Musumeci
939b4a0fe5 Merge pull request #294 from trapexit/eprand
add epall and eprand policies
2016-08-02 11:29:20 -04:00
Antonio SJ Musumeci
0fceb8e0a3 add epall and eprand policies 2016-08-01 16:08:02 -04:00
Antonio SJ Musumeci
34662da806 Merge pull request #293 from trapexit/faccessat
replace nonstandard eaccess with POSIX.1-2008 faccessat
2016-07-29 12:48:08 -04:00
Antonio SJ Musumeci
7634eb1440 replace nonstandard eaccess with POSIX.1-2008 faccessat 2016-07-29 12:39:44 -04:00
Antonio SJ Musumeci
08cd5f89ff Merge pull request #291 from trapexit/typo
fix typo and clarify feature
2016-07-26 09:09:31 -04:00
Antonio SJ Musumeci
47f184a944 fix typo and clarify feature 2016-07-26 09:09:10 -04:00
Antonio SJ Musumeci
920f7fd049 Merge pull request #290 from trapexit/epff
add existing path first found policy. closes #289
2016-07-11 20:50:32 -04:00
Antonio SJ Musumeci
a93ab6c2f5 add existing path first found policy. closes #289 2016-07-11 20:42:56 -04:00
Antonio SJ Musumeci
a375f33eb4 Merge pull request #288 from trapexit/uint64_t
move size calculations to use uint64_t. fixes #287
2016-07-11 09:14:14 -04:00
Antonio SJ Musumeci
1e7b84f7fd Merge pull request #285 from waldyrious/patch-1
add license title
2016-07-11 09:13:36 -04:00
Antonio SJ Musumeci
43cbd9c670 move size calculations to use uint64_t. fixes #287 2016-07-11 09:04:47 -04:00
Waldir Pimenta
9f36eada14 add license title
It's not strictly required, but it's useful metadata, and part of the recommended license template text (see http://choosealicense.com/licenses/isc/ and https://opensource.org/licenses/isc-license)
2016-07-01 00:28:12 +01:00
Antonio SJ Musumeci
30cdfa64b8 reiterate path preserving policies 2016-06-07 20:51:18 -04:00
Antonio SJ Musumeci
81e9544f7d Merge pull request #281 from trapexit/update-man
update man page
2016-05-19 17:30:07 -04:00
Antonio SJ Musumeci
3cb2045ebb update man page 2016-05-19 17:28:37 -04:00
Antonio SJ Musumeci
652440fd8c Merge pull request #280 from trapexit/mmapbug
update info on mmap bug and when it was fixed
2016-05-17 16:09:38 -04:00
Antonio SJ Musumeci
6dc6fde641 update info on mmap bug and when it was fixed 2016-05-17 16:09:22 -04:00
Antonio SJ Musumeci
66fdcc4ef7 Merge pull request #279 from trapexit/fallocate
rework fallocate logic
2016-05-11 13:23:33 -04:00
Antonio SJ Musumeci
cb35a374ac rework fallocate logic 2016-05-11 13:19:44 -04:00
Antonio SJ Musumeci
68210d9252 Merge pull request #278 from trapexit/ioctl-dir
fix ioctl on directories
2016-05-11 13:12:50 -04:00
Antonio SJ Musumeci
23b8e4582e fix ioctl on directories 2016-05-11 11:22:00 -04:00
Antonio SJ Musumeci
13511ea72a Merge pull request #275 from trapexit/updateman
update man page
2016-05-07 15:19:34 -04:00
Antonio SJ Musumeci
3a50344cb9 update man page 2016-05-07 15:18:48 -04:00
Antonio SJ Musumeci
9f27ad448a Merge pull request #274 from trapexit/lus
add least used space and existing path, least used space policies
2016-05-07 15:17:58 -04:00
Antonio SJ Musumeci
be6341e6f0 create eplus (existing path, least used space) policy. closes #273 2016-05-07 15:15:51 -04:00
Antonio SJ Musumeci
f7d3e8bf47 create lus (least used space) policy. closes #273 2016-05-07 14:59:42 -04:00
Antonio SJ Musumeci
e541cdb755 Merge pull request #272 from trapexit/faq-direct-reads
faq update on direct writes
2016-05-03 11:44:24 -04:00
Antonio SJ Musumeci
74ed1b09ee faq update on direct writes 2016-05-03 11:44:04 -04:00
Antonio SJ Musumeci
9987111fa4 Merge pull request #271 from trapexit/fstabdocs
clean up information regarding fstab
2016-04-27 07:13:28 -04:00
Antonio SJ Musumeci
d0414d7c78 clean up information regarding fstab 2016-04-27 07:13:05 -04:00
Antonio SJ Musumeci
8f6a7ba79a Merge pull request #270 from trapexit/fsname
add fsname to readme
2016-04-25 16:58:27 -04:00
Antonio SJ Musumeci
ef8d8f306e add fsname to readme 2016-04-25 16:58:18 -04:00
Antonio SJ Musumeci
1de01684e0 Merge pull request #269 from trapexit/createcatdesc
further tweak language regarding policies wrt create category
2016-04-13 13:06:49 -04:00
Antonio SJ Musumeci
cd15b7a66a further tweak language regarding policies wrt create category 2016-04-13 13:06:35 -04:00
Antonio SJ Musumeci
6b88258d81 Merge pull request #268 from trapexit/policy-desc
make policy descriptions more explicit
2016-04-13 12:46:26 -04:00
Antonio SJ Musumeci
8643d35ebf make policy descriptions more explicit 2016-04-13 12:45:49 -04:00
Antonio SJ Musumeci
b7d7ace9bf Merge pull request #266 from trapexit/tweakreadme
tweak doc language
2016-04-06 14:57:21 -04:00
Antonio SJ Musumeci
1cfe1c3715 tweak doc language 2016-04-06 14:57:02 -04:00
Antonio SJ Musumeci
63b02b327b Merge pull request #265 from trapexit/mmap-bug
add details of mmap cache bug
2016-04-03 16:57:06 -04:00
Antonio SJ Musumeci
dbb13ef7ad add details of mmap cache bug 2016-04-03 16:56:47 -04:00
Antonio SJ Musumeci
6aec6c939a Merge pull request #263 from trapexit/dualmount
add dual mount suggestion to mmap problem
2016-03-15 16:45:06 -04:00
Antonio SJ Musumeci
90ca14afff add dual mount suggestion to mmap problem 2016-03-15 16:44:49 -04:00
Antonio SJ Musumeci
c7328293a0 Merge pull request #262 from trapexit/mmap-direct_io
add details regarding rtorrent, mmap, and direct_io
2016-03-15 08:25:06 -04:00
Antonio SJ Musumeci
cfaf812c62 add details regarding rtorrent, mmap, and direct_io 2016-03-15 08:24:35 -04:00
Antonio SJ Musumeci
47fb6e29c6 Merge pull request #259 from trapexit/dedup-tool
update readme to include mergerfs.dedup
2016-03-11 18:03:33 -05:00
Antonio SJ Musumeci
0c6c69e02e update readme to include mergerfs.dedup 2016-03-11 18:03:22 -05:00
Antonio SJ Musumeci
4b6cfdc68a Merge pull request #258 from trapexit/tarball-url
change tar.gz build url
2016-03-11 16:55:26 -05:00
Antonio SJ Musumeci
309cfee52b change tar.gz build url 2016-03-11 16:55:10 -05:00
Antonio SJ Musumeci
9b3c085cf3 Merge pull request #257 from trapexit/man
tweak man page creation
2016-03-10 18:43:12 -05:00
Antonio SJ Musumeci
382ca876ca tweak man page creation 2016-03-10 18:42:32 -05:00
Antonio SJ Musumeci
93acfb015c Merge pull request #256 from trapexit/xattr
properly check errors of xattr. closes #255
2016-03-10 18:38:05 -05:00
Antonio SJ Musumeci
070ed08caa properly check errors of xattr. closes #255 2016-03-10 18:37:09 -05:00
Antonio SJ Musumeci
5d44161e77 Merge pull request #251 from trapexit/man
update precompiled man page
2016-03-06 02:23:47 -05:00
Antonio SJ Musumeci
6492fda483 update precompiled man page 2016-03-06 02:22:58 -05:00
Antonio SJ Musumeci
447fd8b2fb Merge pull request #250 from trapexit/rename
fix rename failing on non-path preserving policies
2016-03-06 02:22:23 -05:00
Antonio SJ Musumeci
2061211894 fix rename failing on non-path preserving policies 2016-03-06 02:21:23 -05:00
Antonio SJ Musumeci
5030d5a5b4 Merge pull request #249 from trapexit/clarify-rename
clarify that rename uses the create policy to make decisions
2016-03-04 20:33:10 -05:00
Antonio SJ Musumeci
4928944167 clarify that rename uses the create policy to make decisions 2016-03-04 20:32:52 -05:00
Antonio SJ Musumeci
6957cf39d1 Merge pull request #247 from trapexit/epmfs
re-add minfreespace check to epmfs policy
2016-03-04 13:56:15 -05:00
Antonio SJ Musumeci
12cf57dc5a re-add minfreespace check to epmfs policy 2016-03-04 13:52:31 -05:00
Antonio SJ Musumeci
26c2ebc843 Merge pull request #245 from trapexit/readme
change tooling names and add guide link
2016-03-03 10:47:45 -05:00
Antonio SJ Musumeci
59b08a5bc3 change tooling names and add guide link 2016-03-03 10:46:53 -05:00
Antonio SJ Musumeci
8ac3518725 Merge pull request #244 from trapexit/gitdebcl
fix building of platform specific deb packages
2016-03-01 00:19:59 -05:00
Antonio SJ Musumeci
f4a4cc5812 fix building of platform specific deb packages 2016-03-01 00:19:05 -05:00
Antonio SJ Musumeci
b93783ede0 Merge pull request #243 from trapexit/git2dbcl
fix printing of versions with no changes
2016-02-29 23:56:29 -05:00
Antonio SJ Musumeci
ef4c583b3f fix printing of versions with no changes 2016-02-29 23:55:36 -05:00
Antonio SJ Musumeci
6d049c16d1 Merge pull request #242 from trapexit/statvfs
clearly separate usage of statvfs from stat for file existance
2016-02-29 23:11:00 -05:00
Antonio SJ Musumeci
4ecf3c5797 clearly separate usage of statvfs from stat for file existance
Used statvfs to also check for existance vs lstat. On dead symlinks
this resulted in ENOENT making certain functions fail.

closes #239
2016-02-29 23:04:59 -05:00
Antonio SJ Musumeci
4a63c000ca Merge pull request #241 from trapexit/policy-ff
add minfreespace checks to policy ff's create and remove fwfs
2016-02-29 18:15:12 -05:00
Antonio SJ Musumeci
779143f4b6 add minfreespace checks to policy ff's create and remove fwfs
fwfs is now covered by ff with the minfreespace and readonly checks
2016-02-29 18:06:59 -05:00
Antonio SJ Musumeci
ccd3b5d2d0 Merge pull request #240 from trapexit/readme
update readme with minfreespace and readonly details
2016-02-29 15:15:10 -05:00
Antonio SJ Musumeci
4d7148cdd1 update readme with minfreespace and readonly details 2016-02-29 15:14:31 -05:00
Antonio SJ Musumeci
98a051b161 Merge pull request #238 from trapexit/policy-all
add readonly and minfreespace filters to all policy for creates. clos…
2016-02-29 10:55:55 -05:00
Antonio SJ Musumeci
14886a27f4 add readonly and minfreespace filters to all policy for creates. closes #236 2016-02-29 10:15:53 -05:00
Antonio SJ Musumeci
81b9918f6b Merge pull request #237 from trapexit/renamefix 2016-02-26 17:18:39 -05:00
Antonio SJ Musumeci
9819cf6133 fix clonepath being called on wrong source 2016-02-26 17:16:09 -05:00
Antonio SJ Musumeci
c5e584fa5a Merge pull request #235 from trapexit/changeloger
fix creation of changelog
2016-02-25 17:53:24 -05:00
Antonio SJ Musumeci
c56b488c8d fix creation of changelog 2016-02-25 17:52:47 -05:00
Antonio SJ Musumeci
cd50a0b0c8 Merge pull request #234 from trapexit/renametweaks
normalize error handling in rename policy
2016-02-24 17:11:58 -05:00
Antonio SJ Musumeci
e593927095 normalize error handling in rename policy 2016-02-24 17:10:56 -05:00
Antonio SJ Musumeci
12251cf7c2 Merge pull request #233 from trapexit/ffopt
ff policy tweaks
2016-02-24 13:02:24 -05:00
Antonio SJ Musumeci
7c85cd906a ff policy tweaks 2016-02-24 12:40:02 -05:00
Antonio SJ Musumeci
32c4b1ad1c Merge pull request #232 from trapexit/version
override standard libfuse version flag
2016-02-24 08:39:56 -05:00
Antonio SJ Musumeci
5cf3bb7c98 override standard libfuse version flag 2016-02-24 06:36:33 -05:00
Antonio SJ Musumeci
3f8a6525b3 Merge pull request #231 from trapexit/fstweaks
minor tweaks to filesystem utility functions
2016-02-23 12:35:42 -05:00
Antonio SJ Musumeci
25a039942c minor tweaks to filesystem utility functions 2016-02-23 12:28:20 -05:00
Antonio SJ Musumeci
400537d711 Merge pull request #230 from trapexit/findonfs
use stat/2 rather than statvfs/2 to find file drive
2016-02-23 12:07:31 -05:00
Antonio SJ Musumeci
792c9b9808 use stat/2 rather than statvfs/2 to find file drive 2016-02-23 12:06:16 -05:00
Antonio SJ Musumeci
476a8a50ea Merge pull request #228 from trapexit/readme
update / tweak readme
2016-02-21 18:31:02 -05:00
Antonio SJ Musumeci
a698a8a545 update / tweak readme 2016-02-21 18:30:25 -05:00
Antonio SJ Musumeci
5b06bb24fb Merge pull request #227 from trapexit/policy-cleanup
remove unnecessary policies
2016-02-21 18:25:11 -05:00
Antonio SJ Musumeci
d4ec341c4f remove unnecessary policies 2016-02-21 18:24:15 -05:00
Antonio SJ Musumeci
1bbe3a8879 Merge pull request #226 from trapexit/readonly
ignore drives mounted as readonly from create policies. closes #224
2016-02-21 14:35:53 -05:00
Antonio SJ Musumeci
5813d1e477 ignore drives mounted as readonly from create policies. closes #224 2016-02-21 14:34:40 -05:00
Antonio SJ Musumeci
81e77216fc Merge pull request #225 from trapexit/eplfs-readme
add eplfs info to readme
2016-02-18 13:32:44 -05:00
Antonio SJ Musumeci
a4e60d7471 add eplfs info to readme 2016-02-18 13:32:30 -05:00
Antonio SJ Musumeci
8edb7c1e1c Merge pull request #223 from trapexit/statvfs
use stat.st_dev to uniquely identify mounts for statfs. closes #213
2016-02-15 22:57:35 -05:00
Antonio SJ Musumeci
f3e75a0544 use stat.st_dev to uniquely identify mounts for statfs. closes #213 2016-02-15 22:55:47 -05:00
Antonio SJ Musumeci
eed2bbf913 Merge pull request #222 from trapexit/policy
simplify policies
2016-02-15 02:14:48 -05:00
Antonio SJ Musumeci
b3248a8f78 simplify policies 2016-02-15 02:06:58 -05:00
Antonio SJ Musumeci
fc100006f9 Merge pull request #220 from trapexit/eplfs
add existing path, least free space policy. closes #216
2016-02-12 10:08:15 -05:00
Antonio SJ Musumeci
7bf1ca45e4 add existing path, least free space policy. closes #216 2016-02-12 10:06:41 -05:00
Antonio SJ Musumeci
c568a6d356 Merge pull request #219 from trapexit/pathmake
use references to srcmounts rather than copies
2016-02-11 21:14:45 -05:00
Antonio SJ Musumeci
6086620e23 use references to srcmounts rather than copies 2016-02-11 21:09:31 -05:00
Antonio SJ Musumeci
f7c37d2974 Merge pull request #218 from trapexit/why-mergerfs
add some "why mergerfs instead of X" sections to the FAQ
2016-02-11 15:51:55 -05:00
Antonio SJ Musumeci
3a51ceb327 add some "why mergerfs instead of X" sections to the FAQ 2016-02-11 15:51:22 -05:00
Antonio SJ Musumeci
f510e539ab Merge pull request #215 from trapexit/trashdirs
add section to readme about trash directories
2016-02-11 15:08:28 -05:00
Antonio SJ Musumeci
681f3d7492 add section to readme about trash directories 2016-02-11 15:07:55 -05:00
Antonio SJ Musumeci
a7c1b88bfe Merge pull request #212 from trapexit/libfuse-crashes
add information on fixing libfuse crashes
2016-02-01 09:47:14 -05:00
Antonio SJ Musumeci
0bac344c8b add information on fixing libfuse crashes 2016-02-01 09:45:40 -05:00
Antonio SJ Musumeci
40e41e472d Merge pull request #211 from trapexit/rpmspec
remove sbin from rpm spec file
2016-01-25 09:43:07 -05:00
Antonio SJ Musumeci
840f9b8593 remove sbin from rpm spec file 2016-01-25 09:42:27 -05:00
Antonio SJ Musumeci
1160868243 Merge pull request #210 from trapexit/statvfs
fix statvfs drive dedup. closes #209
2016-01-22 10:16:01 -05:00
Antonio SJ Musumeci
f779f82ed6 fix statvfs drive dedup. closes #209 2016-01-22 10:15:24 -05:00
Antonio SJ Musumeci
a629e60f5c Merge pull request #208 from trapexit/remove-clone
remove clone test tool
2016-01-21 14:55:15 -05:00
Antonio SJ Musumeci
3e20adb109 remove clone test tool 2016-01-21 14:48:12 -05:00
Antonio SJ Musumeci
1931e263be Merge pull request #207 from trapexit/update-man
update the precompiled man page
2016-01-21 12:49:44 -05:00
Antonio SJ Musumeci
e285bde962 update the precompiled man page 2016-01-21 12:49:04 -05:00
Antonio SJ Musumeci
d058a366ee Merge pull request #206 from trapexit/readme-tweaks
general tweaks to readme
2016-01-21 12:47:50 -05:00
Antonio SJ Musumeci
853769bd7c general tweaks to readme 2016-01-21 12:47:13 -05:00
Antonio SJ Musumeci
a3e693c30e Merge pull request #205 from trapexit/symlink
make symlink function like mknod/mkdir. closes #204
2016-01-20 17:56:03 -05:00
Antonio SJ Musumeci
ea325755a7 make symlink function like mknod/mkdir. closes #204 2016-01-20 17:55:20 -05:00
Antonio SJ Musumeci
091cc230d8 Merge pull request #203 from trapexit/mknod-fix
fix indexing of mknod targets. closes #202
2016-01-20 17:27:19 -05:00
Antonio SJ Musumeci
1d1694bbb5 fix indexing of mknod targets. closes #202 2016-01-20 17:24:50 -05:00
Antonio SJ Musumeci
8287f7f119 Merge pull request #201 from trapexit/remove-warning
remove incorrect warning about race condition with mkdir/mknod
2016-01-20 17:08:04 -05:00
Antonio SJ Musumeci
93397ea170 remove incorrect warning about race condition with mkdir/mknod 2016-01-20 17:07:33 -05:00
Antonio SJ Musumeci
da6d9b8eab Merge pull request #200 from trapexit/statfs
dedup based on full statvfs struct rather than fsid. closes #183
2016-01-20 16:45:58 -05:00
Antonio SJ Musumeci
25265f4e85 dedup based on full statvfs struct rather than fsid. closes #183 2016-01-20 16:44:05 -05:00
Antonio SJ Musumeci
d4caecacbd Merge pull request #199 from trapexit/remove-tools
remove tooling from repo. closes #198
2016-01-19 16:32:46 -05:00
Antonio SJ Musumeci
de776b7cf0 remove tooling from repo. closes #198 2016-01-19 16:29:51 -05:00
Antonio SJ Musumeci
02c1ce5181 Merge pull request #197 from trapexit/link
have link act similar to rename
2016-01-19 16:14:06 -05:00
Antonio SJ Musumeci
62f8fc524e have link act similar to rename
closes #193
2016-01-19 16:08:02 -05:00
Antonio SJ Musumeci
2fe465a29c Merge pull request #196 from trapexit/license
move from MIT to ISC license. closes #194
2016-01-14 16:57:43 -05:00
Antonio SJ Musumeci
242af777be move from MIT to ISC license. closes #194 2016-01-14 16:56:38 -05:00
Antonio SJ Musumeci
fe7d841500 Merge pull request #195 from trapexit/rv
all action functions return success should at least one succeed
2016-01-14 08:26:16 -05:00
Antonio SJ Musumeci
4c77ac4d24 all action functions return success should at least one succeed. closes #189 2016-01-14 07:58:57 -05:00
Antonio SJ Musumeci
f905116c3d Merge pull request #192 from trapexit/manpage
update man page
2016-01-12 23:37:10 -05:00
Antonio SJ Musumeci
b811522474 update man page 2016-01-12 23:36:32 -05:00
Antonio SJ Musumeci
9b80d6905b Merge pull request #191 from trapexit/srcmounts
replace srcpoints with srcmounts
2016-01-12 16:28:27 -05:00
Antonio SJ Musumeci
8a5c5240f2 replace srcpoints with srcmounts 2016-01-12 16:27:47 -05:00
Antonio SJ Musumeci
8257a1f765 Merge pull request #190 from trapexit/rename
rework rename algo to minimize likelihood of EXDEV being returned. cl…
2016-01-12 16:24:08 -05:00
Antonio SJ Musumeci
a3e6a0352d rework rename algo to minimize likelihood of EXDEV being returned. closes #187 2016-01-12 16:23:12 -05:00
Antonio SJ Musumeci
47dc59bff2 Merge pull request #185 from trapexit/policy_template
change to using template for policy class
2015-12-29 16:23:10 -05:00
Antonio SJ Musumeci
eb6d1a1bc2 change to using template for policy class 2015-12-29 16:14:37 -05:00
Antonio SJ Musumeci
fbc2cd95cd Merge pull request #180 from trapexit/nonbash
Nonbash
2015-12-14 23:51:26 -05:00
Antonio SJ Musumeci
55c4a32614 add artifacts to gitignore 2015-12-14 23:50:35 -05:00
Antonio SJ Musumeci
51ae7d1980 change make to work with non-bash shells 2015-12-14 23:50:02 -05:00
Antonio SJ Musumeci
4adeb6348b Merge pull request #179 from trapexit/fix-noxattr
fix building without xattr
2015-12-14 19:02:05 -05:00
Antonio SJ Musumeci
c731b7035c fix building without xattr 2015-12-14 18:48:04 -05:00
Antonio SJ Musumeci
0165fb24d4 Merge pull request #177 from trapexit/xattr-pid
add mergerfs pid to xattrs
2015-12-07 23:57:24 -05:00
Antonio SJ Musumeci
9e24796429 add mergerfs pid to xattrs 2015-12-07 21:20:12 -05:00
Antonio SJ Musumeci
2d71229fe9 Merge pull request #172 from trapexit/setgroups
use SYS_setgroups rather than setgroups on linux
2015-10-29 23:38:45 -04:00
Antonio SJ Musumeci
5e880bddba use SYS_setgroups rather than setgroups 2015-10-29 23:20:37 -04:00
Antonio SJ Musumeci
af24bdb426 Merge pull request #171 from trapexit/support
add support section to readme and manpage
2015-10-29 15:27:56 -04:00
Antonio SJ Musumeci
8a651b0372 add support section to readme and manpage 2015-10-29 15:27:05 -04:00
Antonio SJ Musumeci
762a04242f Merge pull request #169 from trapexit/scan-check-cleanup
fix misc issues flagged by clang scan-build
2015-10-22 18:08:41 -04:00
Antonio SJ Musumeci
8cd747e673 Merge pull request #168 from trapexit/debversion
include distro and codename in deb package versions
2015-10-22 18:06:40 -04:00
Antonio SJ Musumeci
93cedabe9c fix misc issues flagged by clang scan-build 2015-10-22 18:06:11 -04:00
Antonio SJ Musumeci
fd4ce1b5fa include distro and codename in deb package versions 2015-10-22 18:05:16 -04:00
Antonio SJ Musumeci
f3a6876362 remove pandoc from build requirements 2015-10-18 00:15:28 -04:00
Antonio SJ Musumeci
61dbb85f35 Merge pull request #165 from trapexit/manpage
remove manpage from root directory
2015-10-17 22:08:46 -04:00
Antonio SJ Musumeci
30c29c9fae remove manpage from root directory 2015-10-17 22:07:40 -04:00
Antonio SJ Musumeci
10eb05a14b Merge pull request #164 from trapexit/manpage
if pandoc doesn't exist copy premade version
2015-10-17 21:38:52 -04:00
Antonio SJ Musumeci
8ed11a0e8f if pandoc doesn't exist copy premade version 2015-10-17 21:38:15 -04:00
Antonio SJ Musumeci
74f2a88ed2 Merge pull request #163 from trapexit/manpage
offer prebuilt manpage for platforms without easy access to pandoc
2015-10-16 18:57:27 -04:00
Antonio SJ Musumeci
46c8361fa9 offer prebuilt manpage for platforms without easy access to pandoc 2015-10-16 18:50:51 -04:00
Antonio SJ Musumeci
02df44129d update info on Samba client EXDEV issue 2015-10-16 08:30:54 -04:00
Antonio SJ Musumeci
fe7960974d fix typo 2015-10-14 08:07:05 -04:00
Antonio SJ Musumeci
873c4a9840 add link to gvfs-fuse patch 2015-10-14 06:48:40 -04:00
Antonio SJ Musumeci
4df9b2e6f1 add documentation on SMB client EXDEV / EIO issue 2015-10-14 00:27:26 -04:00
Antonio SJ Musumeci
e84c458cad Merge pull request #162 from trapexit/intsizes
fix minor integer casting issues
2015-10-13 23:34:18 -04:00
Antonio SJ Musumeci
1c7de2d83e fix minor integer casting issues 2015-10-13 23:33:33 -04:00
Antonio SJ Musumeci
a10de2aaf9 update build dependencies for Fedora 2015-10-13 09:07:38 -04:00
Antonio SJ Musumeci
f83cdc215f Merge pull request #160 from trapexit/rpm
add sbin directory to rpm spec
2015-10-13 07:14:23 -04:00
Antonio SJ Musumeci
3d7d2cf80a add sbin directory to rpm spec 2015-10-13 07:13:17 -04:00
Antonio SJ Musumeci
5d5428fbb3 Merge pull request #159 from trapexit/git2dbcl
enhance git2debcl to work with older python releases
2015-10-13 00:21:14 -04:00
Antonio SJ Musumeci
5489952aa8 enhance git2debcl to work with older python releases 2015-10-13 00:20:47 -04:00
Antonio SJ Musumeci
280309ad6d Merge pull request #158 from trapexit/fusedep
set rpm dependency to fuse
2015-10-12 23:52:16 -04:00
Antonio SJ Musumeci
068fbc0269 set rpm dependency to fuse 2015-10-12 23:51:52 -04:00
Antonio SJ Musumeci
6709791156 Merge pull request #157 from trapexit/mount.mergerfs
create mount.mergerfs symlink. closes #149
2015-10-12 23:45:04 -04:00
Antonio SJ Musumeci
5a76c41236 create mount.mergerfs symlink. closes #149 2015-10-12 23:43:17 -04:00
Antonio SJ Musumeci
3ccc94a560 Merge pull request #156 from trapexit/cisms
misc fixes to compile on older platforms
2015-10-12 19:52:34 -04:00
Antonio SJ Musumeci
58446f9124 misc fixes to compile on older platforms 2015-10-12 19:51:57 -04:00
Antonio SJ Musumeci
ce2ec89964 Merge pull request #155 from trapexit/gidcache
rewrite gid cache system
2015-10-11 15:07:24 -04:00
Antonio SJ Musumeci
40f569be37 rewrite gid cache system
Uses fixed storage so as to not require C++11 local thread storage or memory allocation.
2015-10-11 15:01:57 -04:00
Antonio SJ Musumeci
db85a7d3f2 Merge pull request #152 from trapexit/fsck
audit (and fix) file permissions and ownership. closes #148
2015-10-06 00:38:22 -04:00
Antonio SJ Musumeci
f6d396c30d audit (and fix) file permissions and ownership. closes #148 2015-10-06 00:37:03 -04:00
Antonio SJ Musumeci
95e6ebf607 Merge pull request #151 from trapexit/uint32
remove usage of UINT32_MAX macro
2015-10-01 23:37:46 -04:00
Antonio SJ Musumeci
53e3284b26 remove usage of UINT32_MAX macro 2015-10-01 10:26:12 -04:00
Antonio SJ Musumeci
746bb68a0c Merge pull request #147 from trapexit/usage
provide usage text and version info. closes #146
2015-09-29 07:30:02 -04:00
Antonio SJ Musumeci
09ffc8c903 provide usage text and version info. closes #146 2015-09-29 07:29:10 -04:00
Antonio SJ Musumeci
f844daa76c Merge pull request #145 from trapexit/debswap
swap deb and unsigned-deb make tagets. closes #140
2015-09-26 14:14:04 -04:00
Antonio SJ Musumeci
c289dafadc swap deb and unsigned-deb make tagets. closes #140 2015-09-26 14:12:10 -04:00
Antonio SJ Musumeci
2e538068ef Merge pull request #144 from trapexit/enospc
move on enospc when writing feature. closes #141
2015-09-25 15:41:24 -04:00
Antonio SJ Musumeci
5808ab7795 move on enospc when writing feature. closes #141
This feature mimics the standard mhddfs behavior but is more thorough.
If a write fails and the errno is set to ENOSPC then mergerfs will (if
the feature is enabled) attempt to move the file to the drive with
the most free space but only if it has enough room for the file plus
the amount to be written. If that transfer is successful it will then
unlink the original file and attempt the previously failed write again.

The copy includes copying the path and file including the acls, owners,
attributes, extended attributes, and timestamps.
2015-09-25 15:14:17 -04:00
Antonio SJ Musumeci
4e5578de9c make note about escaping glob tokens more explicit 2015-09-25 13:48:03 -04:00
Antonio SJ Musumeci
4b375faf12 include rpm-build in Fedora dependencies 2015-09-24 17:59:49 -04:00
Antonio SJ Musumeci
9542e6340b include link to release page in readme 2015-09-24 15:07:39 -04:00
Antonio SJ Musumeci
de583b70f7 clean up options listing 2015-09-23 16:42:36 -04:00
Antonio SJ Musumeci
8bf0f755e1 create summary feature section
And tweak intro.
2015-09-22 12:46:47 -04:00
Antonio SJ Musumeci
5850fbe3f1 bump README date 2015-09-14 22:45:45 -04:00
Antonio SJ Musumeci
1cc1b1f746 Merge pull request #139 from trapexit/setxattr-cleanup
cleanup controlfile manipulation
2015-09-14 22:42:06 -04:00
Antonio SJ Musumeci
a960a7ef46 cleanup controlfile manipulation 2015-09-14 22:40:49 -04:00
Antonio SJ Musumeci
9afd0654b7 Merge pull request #138 from trapexit/defaults
include default_permissions in default arguments
2015-09-14 22:13:37 -04:00
Antonio SJ Musumeci
e0cf97261c include default_permissions in default arguments
closes #130
2015-09-14 22:12:24 -04:00
Antonio SJ Musumeci
1782910437 Merge pull request #137 from trapexit/setgroups-docs
change README regarding setgroups cache and new rwlock ugid fallback
2015-09-14 19:34:22 -04:00
Antonio SJ Musumeci
f4e3f28153 change README regarding setgroups cache and new rwlock ugid fallback 2015-09-14 19:33:30 -04:00
Antonio SJ Musumeci
6a96d3b69b Merge pull request #136 from trapexit/typo
fix typo in README
2015-09-14 19:06:37 -04:00
Antonio SJ Musumeci
08c0c2dfae fix typo in README. closes #134 2015-09-14 19:05:42 -04:00
Antonio SJ Musumeci
ad5380d69e Merge pull request #135 from trapexit/op-ugid
make changing credentials opportunistic + per thread setgroups cache
2015-09-14 19:01:23 -04:00
Antonio SJ Musumeci
3163258a33 make changing credentials opportunistic + per thread setgroups cache
closes #129,#131
2015-09-14 19:00:07 -04:00
Antonio SJ Musumeci
b194272e39 add notes on permissions and errors to readme 2015-09-08 18:06:32 -04:00
Antonio SJ Musumeci
c131310c55 include known issues section to readme 2015-09-07 19:58:10 -04:00
Antonio SJ Musumeci
8323e16ad2 Merge pull request #126 from trapexit/realpathize
realpath'ize all source mount points. closes #117
2015-09-06 18:25:21 -04:00
Antonio SJ Musumeci
ce9352987c realpath'ize all source mount points. closes #117 2015-09-06 18:24:36 -04:00
Antonio SJ Musumeci
accd2d4ae0 Merge pull request #125 from trapexit/xattr-minfreespace
fix non-suffixed setxattr of user.mergerfs.minfreespace
2015-09-06 12:07:43 -04:00
Antonio SJ Musumeci
2d899479c3 fix non-suffixed setxattr of user.mergerfs.minfreespace 2015-09-05 23:08:11 -04:00
Antonio SJ Musumeci
803b2ae999 Merge pull request #122 from trapexit/clean-version
remove version.hpp on clean
2015-09-05 22:30:49 -04:00
Antonio SJ Musumeci
e98b801c9d remove version.hpp on clean 2015-09-05 22:29:28 -04:00
Antonio SJ Musumeci
27cf7f8148 Merge pull request #121 from trapexit/xattr-version
add user.mergerfs.version xattr
2015-09-05 21:55:43 -04:00
Antonio SJ Musumeci
b22528bac4 add user.mergerfs.version xattr 2015-09-05 21:48:15 -04:00
Antonio SJ Musumeci
adf983c8c3 Merge pull request #120 from trapexit/policies-xattr
add user.mergerfs.policies xattr
2015-09-05 20:04:12 -04:00
Antonio SJ Musumeci
e377d54c93 add user.mergerfs.policies xattr 2015-09-05 19:49:08 -04:00
Antonio SJ Musumeci
7bee6230ba Merge pull request #119 from trapexit/rpm
add building of rpm
2015-09-05 18:44:14 -04:00
Antonio SJ Musumeci
08d07b71e1 add building of rpm 2015-09-05 18:41:18 -04:00
Antonio SJ Musumeci
ce2462042f Merge pull request #118 from trapexit/basic-fedora-build
add basic instructions for building on Fedora
2015-09-05 16:35:40 -04:00
Antonio SJ Musumeci
305f190f09 add basic instructions for building on Fedora 2015-09-05 16:34:59 -04:00
Antonio SJ Musumeci
d89735abf6 Merge pull request #114 from trapexit/xattr
refactor and simplify getxattr for user.mergerfs.\*
2015-09-03 17:24:57 -04:00
Antonio SJ Musumeci
8178bf518c refactor and simplify getxattr for user.mergerfs.\* 2015-09-03 16:56:54 -04:00
Antonio SJ Musumeci
22d254e8df Merge pull request #113 from trapexit/git2dbcl
use correct variable for finding version
2015-09-02 08:02:26 -04:00
Antonio SJ Musumeci
aea5e440d7 use correct variable for finding version 2015-09-02 08:02:12 -04:00
Antonio SJ Musumeci
908a2f61f7 Merge pull request #112 from trapexit/epmfs+minfreespace
add minfreespace check to epmfs create policy
2015-09-01 22:37:45 -04:00
Antonio SJ Musumeci
bc77b0fd2a add minfreespace check to epmfs create policy 2015-09-01 22:28:35 -04:00
Antonio SJ Musumeci
4141181243 Merge pull request #111 from trapexit/rename
rework rename
2015-09-01 18:35:22 -04:00
Antonio SJ Musumeci
1f1e481075 rework rename
Return EXDEV if directories of tragets differ. If the old and new path exist in the same directory first rename each old found by the policy and then unlink/rmdir any new on a drive which didn't rename. The unlink/rmdir will occur only if there were no rename errors. Any failures of unlink/rmdir are ignored. The last rename error is returned.
2015-09-01 18:32:31 -04:00
Antonio SJ Musumeci
6b5b7c38f4 Merge pull request #109 from trapexit/einval
forgot to add einval to policy
2015-08-30 17:08:58 -04:00
Antonio SJ Musumeci
7a93198d4a forgot to add einval to policy 2015-08-30 17:08:24 -04:00
Antonio SJ Musumeci
fd26793305 Merge pull request #108 from trapexit/error-policies
create errno policies for simulating errors. closes #107
2015-08-27 22:52:20 -04:00
Antonio SJ Musumeci
bbc75f6ff1 create errno policies for simulating errors. closes #107 2015-08-27 22:38:23 -04:00
Antonio SJ Musumeci
cac5f1b827 Merge pull request #106 from trapexit/epmfs-fix
fix epmfs failing to pick the existing path. closes #102
2015-08-24 15:52:47 -04:00
Antonio SJ Musumeci
126df0fbf1 fix epmfs failing to pick the existing path. closes #102 2015-08-24 15:51:17 -04:00
Antonio SJ Musumeci
2cc9b42c9c Merge pull request #101 from trapexit/buildupdate
enhance deb building
2015-08-07 21:05:52 -04:00
Antonio SJ Musumeci
ab68ac0cb1 enhance deb building 2015-08-07 21:03:39 -04:00
Antonio SJ Musumeci
f3a3609998 Merge pull request #100 from trapexit/readme
format README better for man pages
2015-08-07 21:02:28 -04:00
Antonio SJ Musumeci
e73ea33e9c format README better for man pages 2015-08-07 20:59:43 -04:00
Antonio SJ Musumeci
c2164457bc Merge pull request #97 from trapexit/option-docs
update README regarding options
2015-08-05 12:30:14 -04:00
Antonio SJ Musumeci
95192511b1 update README regarding options 2015-08-05 12:29:53 -04:00
Antonio SJ Musumeci
7775d6830c Merge pull request #96 from trapexit/epmfs-fix
remove unused variable
2015-08-05 12:00:03 -04:00
Antonio SJ Musumeci
8767db971a remove unused variable 2015-08-05 11:59:39 -04:00
Antonio SJ Musumeci
838c081b8c Merge pull request #94 from trapexit/config-cleanup
config get and struct naming cleanup
2015-08-05 11:51:33 -04:00
Antonio SJ Musumeci
ac41bc43f3 Merge pull request #95 from trapexit/flags
move requesting of FUSE flags to init from cli args
2015-08-05 11:50:54 -04:00
Antonio SJ Musumeci
267f2d291c move requesting of FUSE flags to init from cli args 2015-08-05 11:50:21 -04:00
Antonio SJ Musumeci
f130d07fd8 config get and struct naming cleanup 2015-08-05 09:28:53 -04:00
Antonio SJ Musumeci
81dbafdc19 Merge pull request #93 from trapexit/ioctlfixes
passthrough ioctl args without processing. closes #90
2015-08-05 09:23:23 -04:00
Antonio SJ Musumeci
52d80299b5 passthrough ioctl args without processing. closes #90 2015-08-05 09:18:34 -04:00
Antonio SJ Musumeci
416cb4a084 Merge pull request #92 from trapexit/timecompare
use gte rather than gt for mtime comparisons. fixes #91
2015-08-04 14:09:20 -04:00
Antonio SJ Musumeci
c60d03831f use gte rather than gt for mtime comparisons. fixes #91 2015-08-04 14:03:44 -04:00
Antonio SJ Musumeci
ac03e08d31 Merge pull request #89 from trapexit/openpath
add creation of full path for open
2015-07-16 16:58:14 -04:00
Antonio SJ Musumeci
80b2c35175 add creation of full path for open 2015-07-16 16:57:01 -04:00
Antonio SJ Musumeci
f8f63cdbd1 Merge pull request #87 from trapexit/namespaces
change fuse functions to use the fuse namespace
2015-07-15 10:54:23 -04:00
Antonio SJ Musumeci
983fa9100d change fuse functions to use the fuse namespace 2015-07-15 10:53:13 -04:00
Antonio SJ Musumeci
efadd2c8d8 Merge pull request #86 from trapexit/readdir-cleanup
remove unused readdir function
2015-07-15 10:51:43 -04:00
Antonio SJ Musumeci
c505ec0cdb Merge pull request #85 from trapexit/pthread_getugid_np
use pthread_getugid_np instead of gete{u,g}id on OSX. fixes #84
2015-07-15 10:51:20 -04:00
Antonio SJ Musumeci
e5359ebd05 remove unused readdir function 2015-07-15 10:50:25 -04:00
Antonio SJ Musumeci
f00cd1467e use pthread_getugid_np instead of gete{u,g}id on OSX. fixes #84 2015-07-15 10:39:47 -04:00
Antonio SJ Musumeci
e4be3aac2a Merge pull request #83 from trapexit/enotsup
ignore ENOTSUP errors when cloning paths. fixes #82
2015-07-13 12:21:48 -04:00
Antonio SJ Musumeci
4d605388a4 ignore ENOTSUP errors when cloning paths. fixes #82 2015-07-13 12:20:19 -04:00
Antonio SJ Musumeci
2ee3d4eec2 Merge pull request #81 from trapexit/num
add str to size_t conversion code
2015-07-05 21:03:34 -04:00
Antonio SJ Musumeci
aafc1e9394 add str to size_t conversion code 2015-07-05 21:02:42 -04:00
Antonio SJ Musumeci
eebfe456f6 Merge pull request #80 from trapexit/minfreespace-xattr
add minfreespace to xattr interface
2015-07-05 20:01:12 -04:00
Antonio SJ Musumeci
b3109ac506 add minfreespace to xattr interface 2015-07-05 19:36:23 -04:00
Antonio SJ Musumeci
54484f35fc Merge pull request #79 from trapexit/readme
Readme
2015-07-03 10:51:29 -04:00
Antonio SJ Musumeci
d079856e09 add info on lfs and fwfs policies and minfreespace option 2015-07-03 10:49:18 -04:00
Antonio SJ Musumeci
c101430b98 rework category -> fuse function table 2015-07-03 10:49:18 -04:00
Antonio SJ Musumeci
1d798ad285 Merge pull request #78 from trapexit/typed-policies
Typed policies
2015-07-03 10:47:02 -04:00
Antonio SJ Musumeci
b2cd79154a stop auto calculating and storing fullpath in policies 2015-07-03 10:40:47 -04:00
Antonio SJ Musumeci
0c60701b29 create different policies based on category of use 2015-07-03 08:53:36 -04:00
Antonio SJ Musumeci
51b6d3f647 add category to policies so as to distinguish between creates and searches 2015-07-03 08:51:19 -04:00
Antonio SJ Musumeci
a5bf48c8ae Merge pull request #77 from trapexit/paths
Paths
2015-06-23 22:30:35 -04:00
Antonio SJ Musumeci
6ca43893ea separate policies into individual modules 2015-06-23 22:27:01 -04:00
Antonio SJ Musumeci
3c8f12281f move policy function type from fs to policy 2015-06-23 00:24:14 -04:00
Antonio SJ Musumeci
2bd44568a1 move Path object to separate file 2015-06-22 23:22:51 -04:00
Antonio SJ Musumeci
23cca83742 Merge pull request #76 from trapexit/lfs
create lfs policy. closes #73
2015-06-22 11:27:58 -04:00
Antonio SJ Musumeci
8e5b79647b create lfs policy. closes #73 2015-06-22 11:06:36 -04:00
Antonio SJ Musumeci
9ea4bf2828 Merge pull request #75 from trapexit/fwfs
first w/ free space policy. closes #72
2015-06-22 11:03:49 -04:00
Antonio SJ Musumeci
58167c3636 first w/ free space policy. closes #72 2015-06-22 10:53:39 -04:00
Antonio SJ Musumeci
6578b93190 Merge pull request #74 from trapexit/minfreespace
create minfreespace option. closes #71
2015-06-22 10:19:03 -04:00
Antonio SJ Musumeci
ccb22c1fbe create minfreespace option. closes #71 2015-06-22 09:59:16 -04:00
Antonio SJ Musumeci
ad7ce487bb fix readme typos and misc formatting 2015-06-05 20:13:24 -04:00
Antonio SJ Musumeci
fd2ba50cad Merge pull request #70 from trapexit/readme
Readme
2015-06-05 19:53:14 -04:00
Antonio SJ Musumeci
fe0f442c3d add Tips and FAQ section to readme 2015-06-05 19:52:31 -04:00
Antonio SJ Musumeci
1879c9c4a9 update readme with defaults option info 2015-06-04 23:19:49 -04:00
Antonio SJ Musumeci
247bac76eb Merge pull request #69 from trapexit/getxattr
fix calling of lgetxattr. closes #68
2015-06-04 21:46:44 -04:00
Antonio SJ Musumeci
45b73e53be fix calling of lgetxattr. closes #68 2015-06-04 09:31:43 -04:00
Antonio SJ Musumeci
ffc90f52bc Merge pull request #67 from trapexit/priority
attempt to set priority to -10 on startup. closes #65
2015-03-17 20:40:35 -04:00
Antonio SJ Musumeci
5fb277529f attempt to set priority to -10 on startup. closes #65 2015-03-17 20:39:20 -04:00
Antonio SJ Musumeci
7552ad6781 Merge pull request #66 from trapexit/pseudo-file-permissions
restrict who can setxattr the pseudo file. closes #64
2015-03-13 20:45:25 -04:00
Antonio SJ Musumeci
4b204b8fba restrict who can setxattr the pseudo file. closes #64 2015-03-13 20:31:02 -04:00
Antonio SJ Musumeci
4ea49fcfbb Merge pull request #63 from trapexit/defaults
provide 'defaults' option. closes #58
2015-03-11 18:23:57 -04:00
Antonio SJ Musumeci
33c837a560 provide 'defaults' option. closes #58 2015-03-11 18:21:28 -04:00
Antonio SJ Musumeci
3725387132 Merge pull request #62 from trapexit/subtype
set FUSE subtype to 'mergerfs'. closes #59
2015-03-11 14:08:11 -04:00
Antonio SJ Musumeci
951b22b671 set FUSE subtype to 'mergerfs'. closes #59 2015-03-11 14:00:47 -04:00
Antonio SJ Musumeci
0a0e8fdefc Merge pull request #61 from trapexit/docs
add default policies for categories and description of `all`
2015-03-10 18:53:40 -04:00
Antonio SJ Musumeci
74c334c372 add default policies for categories and description of all 2015-03-10 18:53:06 -04:00
Antonio SJ Musumeci
711261bb02 Merge pull request #60 from trapexit/options
match cli options to xattrs
2015-03-10 18:45:11 -04:00
Antonio SJ Musumeci
08366a35be match cli options to xattrs 2015-03-10 18:44:45 -04:00
Antonio SJ Musumeci
8b41dca91a Merge pull request #57 from trapexit/remove-fileinfo
remove FileInfo and keep only file descriptor
2015-03-05 22:16:49 -05:00
Antonio SJ Musumeci
91671d7364 remove FileInfo and keep only file descriptor 2015-03-05 22:15:54 -05:00
Antonio SJ Musumeci
15b2c8be1b Merge pull request #56 from trapexit/revert-all-policy-removal
revert removal of 'all' policy and relevant behavior. closes #54
2015-03-05 21:07:05 -05:00
Antonio SJ Musumeci
c022741ffb revert removal of 'all' policy and relevant behavior. closes #54 2015-03-05 21:01:22 -05:00
Antonio SJ Musumeci
a359c88173 Merge pull request #55 from trapexit/policyperfunc
per FUSE function policies. closes #52, #53
2015-03-05 20:42:18 -05:00
Antonio SJ Musumeci
12f393a55e per FUSE function policies. closes #52, #53 2015-02-23 20:02:50 -05:00
Antonio SJ Musumeci
e0f0bb53f7 Merge pull request #51 from trapexit/rlimits
Try RLIMIT_INFINITY first, then cur = max, then loop and try to increase...
2015-02-17 11:48:55 -05:00
Antonio SJ Musumeci
283a2b2285 Try RLIMIT_INFINITY first, then cur = max, then loop and try to increase till error. closes #50 2015-02-17 11:46:54 -05:00
Antonio SJ Musumeci
dba9e00adc Merge pull request #49 from trapexit/clonefdleak
close file after getting ioc flags. closes #48
2015-02-17 00:36:25 -05:00
Antonio SJ Musumeci
1a1c9db37b close file after getting ioc flags. closes #48 2015-02-17 00:28:27 -05:00
Antonio SJ Musumeci
f3f5a18ef5 Merge pull request #47 from trapexit/getxattr_all
add user.mergerfs.allpaths and user.mergerfs.relpath to getxattr
2015-02-07 18:49:36 -05:00
Antonio SJ Musumeci
d30cae217b add user.mergerfs.allpaths and user.mergerfs.relpath to getxattr 2015-02-07 18:27:47 -05:00
Antonio SJ Musumeci
dbe630c37d Merge pull request #46 from trapexit/action-search-merge
merge action and search category
2015-02-05 19:59:04 -05:00
Antonio SJ Musumeci
2e95c6e78e merge action and search category 2015-02-05 18:23:01 -05:00
Antonio SJ Musumeci
58ec83dcd8 Merge pull request #45 from trapexit/remove_all
Remove 'all' policy and simplify logic
2015-02-03 18:03:44 -05:00
Antonio SJ Musumeci
b411c63df1 Remove 'all' policy and simplify logic 2015-02-02 23:59:45 -05:00
Antonio SJ Musumeci
1f61a662ad Merge pull request #44 from trapexit/platformdefines
use standard platform macros. closes #43
2015-02-02 21:32:23 -05:00
Antonio SJ Musumeci
1f90203025 use standard platform macros. closes #43 2015-02-02 21:30:31 -05:00
Antonio SJ Musumeci
805bc2d2e6 Merge pull request #42 from trapexit/clonepath
clonepath fixes
2015-01-29 14:54:13 -05:00
Antonio SJ Musumeci
c2cbb93c25 elevate privileges when calling clonepath. closes #41 2015-01-29 14:28:38 -05:00
Antonio SJ Musumeci
6276ce9779 handle EEXIST while cloning a path. closes #40 2015-01-29 14:28:38 -05:00
Antonio SJ Musumeci
d1f3bd82e8 add clonepath tool 2015-01-29 14:28:34 -05:00
Antonio SJ Musumeci
031b87f674 slight refactoring 2015-01-27 16:08:13 -05:00
Antonio SJ Musumeci
233c216e66 Merge pull request #39 from trapexit/truncate_mount_list
remove longest common prefix from fsname. closes #38
2015-01-22 16:33:34 -05:00
Antonio SJ Musumeci
5dd072962b remove longest common prefix from fsname. closes #38 2015-01-22 16:30:12 -05:00
Antonio SJ Musumeci
90b0fcd5f5 Merge pull request #35 from trapexit/dttoif
provide stat to readdir filler. closes #32
2014-11-10 21:11:17 -05:00
Antonio SJ Musumeci
66563aa142 Merge pull request #34 from trapexit/byref
pass const strings by reference. closes #33
2014-11-10 21:10:31 -05:00
Antonio SJ Musumeci
6c3ff01a0a pass const strings by reference. closes #33 2014-11-10 21:01:20 -05:00
Antonio SJ Musumeci
d7ede20abe provide stat to readdir filler. closes #32 2014-11-10 07:41:15 -05:00
Antonio SJ Musumeci
19051925db Merge pull request #31 from trapexit/compat
support RHEL6. closes #29
2014-11-04 13:57:34 -05:00
Antonio SJ Musumeci
613b996296 support RHEL6. closes #29 2014-11-04 13:52:04 -05:00
Antonio SJ Musumeci
39c750b368 Merge branch 'no-merges' 2014-09-29 19:30:12 -04:00
Antonio SJ Musumeci
47522a25cc exclude merges in the debian changelog. closes #28 2014-09-26 22:51:33 -04:00
Antonio SJ Musumeci
6c31efc964 Merge branch 'dirioctl' 2014-09-26 18:33:51 -04:00
Antonio SJ Musumeci
075d62d647 add support for ioctl on directories. closes #27 2014-09-26 18:33:20 -04:00
Antonio SJ Musumeci
cfe7609bcd find functions now return errors. closes #24 2014-08-23 11:44:40 -04:00
Antonio SJ Musumeci
8f35406000 use lstat to confirm file existance instead of eaccess. closes #25 2014-08-22 17:54:38 -04:00
Antonio SJ Musumeci
4ea1adbf96 use f_frsize rather than f_bsize for mfs calculations. closes #26 2014-08-22 17:06:59 -04:00
Antonio SJ Musumeci
15f88494e4 add custom git log to debian changelog script 2014-08-14 21:54:22 -04:00
Antonio SJ Musumeci
7e9ccd0317 support runtime setting of srcmounts. closes #12 2014-08-08 10:20:27 -04:00
Antonio SJ Musumeci
992e05e897 update docs for xattr features 2014-07-31 17:27:43 -04:00
Antonio SJ Musumeci
b82db46e29 getxattr for user.mergerfs.{base,full}path returns the source paths. closes #23 2014-07-30 15:26:49 -04:00
Antonio SJ Musumeci
7b0d703f00 only allow manipulation of runtime settings via xattrs. closes #22 2014-07-29 09:26:11 -04:00
Antonio SJ Musumeci
45cec2d301 use int instead of long for ioctl. fixes #21 2014-07-22 07:07:25 -04:00
Antonio SJ Musumeci
2295714548 on ENOENT try cloning the dest path to source drive. closes #20 2014-07-07 21:54:38 -04:00
1142 changed files with 154108 additions and 6871 deletions

2
.github/FUNDING.yml vendored Normal file
View file

@ -0,0 +1,2 @@
github: [trapexit]
custom: ['https://github.com/trapexit/support']

77
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View file

@ -0,0 +1,77 @@
---
name: Bug report
about: For the reporting of behavior not as described
title: ''
labels: bug, investigating
assignees: ''
---
See also https://trapexit.github.io/mergerfs/latest/support
**Describe the bug**
A clear and concise description of the unexpected behavior.
**Please be sure to use latest release of mergerfs to ensure the issue
still exists. Not your distro's latest but the latest official
release. Support will NOT be provided for old versions.**
The `master` branch is **not** to be considered production ready. Feel
free to file bug reports but do so indicating clearly that you are
testing unreleased code.
**To Reproduce**
Provide steps to reproduce the behavior. List **all** steps to
reproduce. **All** settings. The version of all software involved.
Please simplify the reproduction as much as possible.
* Unless it is dependenat on multiple branches, use a single branch
* Reproduce with standard tooling if possible
(touch,truncate,rm,rmdir,ln,etc.) Having to install 3rd party
software will make debugging more difficult.
**Expected behavior**
A clear and concise description of the expected behavior.
**Workarounds already tested**
Please list all workarounds attempted and why they were ruled out as
options.
**System information:**
* Attach output from
[mergerfs.collect-info](https://trapexit.github.io/mergerfs/latest/tooling/#mergerfscollect-info)
tool.
* Alternatively:
* OS: `lsb_release -a`
* kernel version: `uname -a`
* mergerfs version: `mergerfs --version`
* mergerfs settings / arguments: from fstab, systemd unit, command
line, OMV plugin, etc.
* List of drives, filesystems, & sizes:
* `df -h`
* `lsblk -o NAME,FSTYPE,FSSIZE,SIZE,MOUNTPOINTS,RM,RO,ROTA`
* All information about the relevant paths and files: permissions,
ownership, etc.
* All information about the application making the requests:
version, uid/gid
* Is mergerfs running within a container or used with container
technologies?
* Are the client apps using mergerfs running in a container?
* A strace of the application having a problem:
* `strace -fvTtt -s 256 -o /tmp/app.strace.txt <cmd>`
* `strace -fvTtt -s 256 -o /tmp/app.strace.txt -p <appPID>`
* strace of mergerfs while app tried to do it's thing:
* `strace -fvTtt -s 256 -p <mergerfsPID> -o /tmp/mergerfs.strace.txt`
**Additional context**
Add any other context about the problem here.

View file

@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: feature, investigating
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is.
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

10
.github/ISSUE_TEMPLATE/question.md vendored Normal file
View file

@ -0,0 +1,10 @@
---
name: Question
about: When you're looking for information or general support
title: ''
labels: investigating, question
assignees: ''
---
For general questions and support please use [GitHub Discussions](https://github.com/trapexit/mergerfs/discussions) or [Discord](https://discord.gg/MpAr69V).

20
.gitignore vendored
View file

@ -11,3 +11,23 @@
*.lai
*.la
*.a
# build artifacts
mergerfs
build/
src/version.hpp
VERSION
# Debian files
debian/files
debian/changelog
debian/debhelper-build-stamp
debian/mergerfs.debhelper.log
debian/mergerfs.substvars
# RPM files
rpmbuild/
# mkdocs files
mkdocs/venv
__pycache__/

17
DEPENDENCIES Normal file
View file

@ -0,0 +1,17 @@
## Libraries
### included in repo
* libfuse: https://github.com/libfuse/libfuse (heavily modified fork of v2.x)
* rapidhash: https://github.com/Nicoshev/rapidhash
* fmt: https://github.com/fmtlib/fmt
* concurrentqueue: https://github.com/cameron314/concurrentqueue
* scope_guard: https://github.com/Neargye/scope_guard
* subprocess: https://github.com/arun11299/cpp-subprocess
* CLI11: https://github.com/CLIUtils/CLI11
* string-lite: https://github.com/martinmoene/string-lite
* boost
* download boost
* ./bootstrap.sh
* ./b2 tools/bcp
* ./dist/bin/bcp unordered/concurrent_flat_map.hpp <target_dir>

30
LICENSE
View file

@ -1,23 +1,17 @@
/*
The MIT License (MIT)
ISC License
Copyright (c) 2014 Antonio SJ Musumeci <trapexit@spawn.link>
Copyright (c) 2026, Antonio SJ Musumeci <trapexit@spawn.link>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/

470
Makefile
View file

@ -1,145 +1,409 @@
# The MIT License (MIT)
# Copyright (c) 2025, Antonio SJ Musumeci <trapexit@spawn.link>
#
# Copyright (c) 2014 Antonio SJ Musumeci <trapexit@spawn.link>
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
PKGCONFIG = $(shell which pkg-config)
GIT = $(shell which git)
TAR = $(shell which tar)
MKDIR = $(shell which mkdir)
TOUCH = $(shell which touch)
CP = $(shell which cp)
RM = $(shell which rm)
FIND = $(shell which find)
INSTALL = $(shell which install)
MKTEMP = $(shell which mktemp)
STRIP = $(shell which strip)
PANDOC = $(shell which pandoc)
$(info mergerfs MAKEFLAGS: $(MAKEFLAGS))
ifeq ($(PKGCONFIG),"")
$(error "pkg-config not installed"
ifeq ($(shell id -u),0)
FAKEROOT ?=
endif
ifeq ($(PANDOC),"")
$(warning "pandoc does not appear available: manpage won't be buildable")
CP ?= cp
FAKEROOT ?= fakeroot
FIND ?= find
GIT ?= git
GIT2DEBCL ?= buildtools/git2debcl
INSTALL ?= install
LN ?= ln
MKDIR ?= mkdir
MKTEMP ?= mktemp
MV ?= mv
RM ?= rm
RPMBUILD ?= rpmbuild
RPMBUILD_FLAGS ?=
SED ?= sed
STRIP ?= strip
TAR ?= tar
TOUCH ?= touch
BUILDDIR := build
GITHUB_REPO ?= "https://github.com/trapexit/mergerfs"
DEFAULT_TARGET := debian:13.amd64
ifndef GIT_REPO
ifneq ($(shell $(GIT) --version 2> /dev/null),)
ifeq ($(shell test -e .git; echo $$?),0)
GIT_REPO = 1
endif
endif
endif
XATTR_AVAILABLE = $(shell test ! -e /usr/include/attr/xattr.h; echo $$?)
USE_XATTR ?= 1
FUSE_AVAILABLE = $(shell ! pkg-config --exists fuse; echo $$?)
ifeq ($(FUSE_AVAILABLE),0)
FUSE_AVAILABLE = $(shell test ! -e /usr/include/fuse.h; echo $$?)
ifdef SANITIZE
ifeq ($(SANITIZE),1)
override SANITIZE := -fsanitize=address,undefined,leak
else ifeq ($(filter -fsanitize=%,$(SANITIZE)),)
override SANITIZE := -fsanitize=$(SANITIZE)
endif
endif
ifeq ($(FUSE_AVAILABLE),0)
$(error "FUSE development package doesn't appear available")
COMMON_OPT_FLAGS += \
-fstack-protector-strong \
-Wextra \
-Wno-unused-parameter
DEBUG_OPT_FLAGS += \
-O0 \
-g3 \
-fno-omit-frame-pointer \
$(SANITIZE)
ifdef RELEASE
OPT_FLAGS := -O3 $(COMMON_OPT_FLAGS)
else
OPT_FLAGS ?= $(DEBUG_OPT_FLAGS) $(COMMON_OPT_FLAGS)
endif
OPTS = -O2
SRC = $(wildcard src/*.cpp)
OBJ = $(SRC:src/%.cpp=obj/%.o)
DEPS = $(OBJ:obj/%.o=obj/%.d)
TARGET = mergerfs
MANPAGE = $(TARGET).1
CFLAGS = -g -Wall \
$(OPTS) \
$(shell $(PKGCONFIG) fuse --cflags) \
-DFUSE_USE_VERSION=26 \
-MMD
LDFLAGS = $(shell $(PKGCONFIG) fuse --libs)
BINDIR = $(PREFIX)/usr/bin
MANDIR = $(PREFIX)/usr/share/man/man1
INSTALLTARGET = $(DESTDIR)/$(BINDIR)/$(TARGET)
MANTARGET = $(DESTDIR)/$(MANDIR)/$(MANPAGE)
ifeq ($(XATTR_AVAILABLE),0)
$(warning "xattr not available: disabling")
CFLAGS += -DWITHOUT_XATTR
ifdef STATIC
STATIC_FLAGS := -static
else
STATIC_FLAGS :=
endif
KERNEL = $(shell uname -s)
ifeq ($(KERNEL),Linux)
CFLAGS += -DLINUX
endif
ifeq ($(KERNEL),Darwin)
CFLAGS += -DOSX
ifdef LTO
LTO_FLAGS := -flto
else
LTO_FLAGS :=
endif
all: $(TARGET)
SRC := $(wildcard src/*.cpp)
OBJS := $(SRC:src/%.cpp=build/.objs/%.cpp.o)
DEPS := $(SRC:src/%.cpp=build/.objs/%.cpp.d)
TESTS := $(wildcard tests/*.cpp)
TESTS_OBJS := $(filter-out build/.objs/mergerfs.cpp.o,$(OBJS))
TESTS_OBJS += $(TESTS:tests/%.cpp=build/.test_objs/%.cpp.o)
TESTS_DEPS := $(TESTS:tests/%.cpp=build/.test_objs/%.cpp.d)
TESTS_DEPS += $(DEPS)
MANPAGE := mergerfs.1
CPPFLAGS ?=
override CPPFLAGS += \
-D_FILE_OFFSET_BITS=64 \
-DBOOST_UNORDERED_DISABLE_PARALLEL_ALGORITHMS
CFLAGS ?= \
$(OPT_FLAGS) \
-Wall \
-Wno-unused-result \
-pipe
override CFLAGS += \
-MMD \
-MP
CXXFLAGS ?= \
$(OPT_FLAGS) \
$(STATIC_FLAGS) \
$(LTO_FLAGS) \
-Wall \
-Wpessimizing-move \
-Werror=pessimizing-move \
-Wredundant-move \
-Werror=redundant-move \
-Wno-unused-result \
-pipe
override CXXFLAGS += \
-std=c++20 \
-MMD \
-MP
override INC_FLAGS := \
-Isrc \
-Ivendored \
-Ivendored/libfuse/include
override MFS_FLAGS := \
-DUSE_XATTR=$(USE_XATTR)
override TESTS_FLAGS := \
-Isrc \
-Ivendored \
-Ivendored/acutest \
-DTESTS
LIBFUSE := vendored/libfuse/$(BUILDDIR)/libfuse.a
LDFLAGS ?=
LDLIBS := \
-lrt \
-pthread
override LDLIBS += \
$(LIBFUSE)
ifeq ($(CXX),g++)
GCC_VERSION := $(shell $(CXX) -dumpversion | cut -f1 -d.)
ifeq ($(shell test $(GCC_VERSION) -lt 9; echo $$?),0)
override LDLIBS += -lstdc++fs
endif
endif
# https://www.gnu.org/prep/standards/html_node/Directory-Variables.html
DESTDIR ?=
PREFIX ?= /usr/local
EXEC_PREFIX ?= $(PREFIX)
DATAROOTDIR ?= $(PREFIX)/share
DATADIR ?= $(DATAROOTDIR)
BINDIR ?= $(EXEC_PREFIX)/bin
SBINDIR ?= $(EXEC_PREFIX)/sbin
LIBDIR ?= $(EXEC_PREFIX)/lib
MANDIR ?= $(DATAROOTDIR)/man
MAN1DIR ?= $(MANDIR)/man1
INSTALLBINDIR ?= $(DESTDIR)$(BINDIR)
INSTALLSBINDIR ?= $(DESTDIR)$(SBINDIR)
INSTALLLIBDIR ?= $(DESTDIR)$(LIBDIR)/mergerfs
INSTALLMAN1DIR ?= $(DESTDIR)$(MAN1DIR)
.PHONY: all
all: libfuse $(BUILDDIR)/mergerfs $(BUILDDIR)/fsck.mergerfs $(BUILDDIR)/mergerfs.collect-info
.PHONY: help
help:
@echo "usage: make"
@echo "make XATTR_AVAILABLE=0 - to build program without xattrs functionality (auto discovered otherwise)"
@echo "usage: make ARG\n"
@echo "USE_XATTR=0 - build program without xattrs functionality"
@echo "STATIC=1 - build static binary"
@echo "LTO=1 - build with link time optimization"
@echo "SANITIZE=1 - build with sanitizers (address,undefined,leak)"
@echo "SANITIZE=list - build with custom sanitizers (comma separated)"
@echo "CLEANUP=1 - cleanup images between release build process"
@echo "PKGDIR=/dir/ - location for release build pkgs"
@echo "GITREF=gitref - gitref to use for release builds"
$(TARGET): obj/obj-stamp $(OBJ)
$(CXX) $(CFLAGS) $(OBJ) -o $@ $(LDFLAGS)
$(BUILDDIR)/mergerfs: $(LIBFUSE) src/version.hpp $(OBJS)
$(CXX) $(CXXFLAGS) $(INC_FLAGS) $(MFS_FLAGS) $(CPPFLAGS) $(OBJS) -o $@ $(LDFLAGS) $(LDLIBS)
$(BUILDDIR)/fsck.mergerfs: $(BUILDDIR)/mergerfs
$(LN) -sf "mergerfs" $@
$(BUILDDIR)/mergerfs.collect-info: $(BUILDDIR)/mergerfs
$(LN) -sf "mergerfs" $@
$(BUILDDIR)/tests: $(BUILDDIR)/mergerfs $(TESTS_OBJS)
$(CXX) $(CXXFLAGS) $(TESTS_FLAGS) $(INC_FLAGS) $(MFS_FLAGS) $(CPPFLAGS) $(TESTS_OBJS) -o $@ $(LDFLAGS) $(LDLIBS)
.PHONY: libfuse
libfuse: $(LIBFUSE)
$(MAKE) -C vendored/libfuse
$(LIBFUSE):
$(MAKE) -C vendored/libfuse $(BUILDDIR)/libfuse.a RELEASE=$(RELEASE)
tests: $(BUILDDIR)/tests
.PHONY:
changelog:
$(GIT) log --pretty --numstat --summary | git2cl > ChangeLog
ifdef GIT_REPO
$(GIT2DEBCL) --name mergerfs > ChangeLog
else
@echo "WARNING: need git repo to generate ChangeLog"
endif
obj/obj-stamp:
$(MKDIR) -p obj
.PHONY: version
version: src/version.hpp
src/version.hpp:
./buildtools/update-version
$(BUILDDIR)/stamp:
$(MKDIR) -p $(BUILDDIR)/.objs
$(MKDIR) -p $(BUILDDIR)/.test_objs
$(TOUCH) $@
obj/%.o: src/%.cpp
$(CXX) $(CFLAGS) -c $< -o $@
$(BUILDDIR)/.objs/%.cpp.o: src/%.cpp $(BUILDDIR)/stamp
$(CXX) $(CXXFLAGS) $(INC_FLAGS) $(MFS_FLAGS) $(CPPFLAGS) -c $< -o $@
clean:
$(RM) -rf obj "$(TARGET)" "$(MANPAGE)"
$(FIND) -name "*~" -delete
$(BUILDDIR)/.test_objs/%.cpp.o: tests/%.cpp | $(BUILDDIR)/stamp
$(CXX) $(CXXFLAGS) $(TESTS_FLAGS) $(INC_FLAGS) $(MFS_FLAGS) $(CPPFLAGS) -c $< -o $@
$(BUILDDIR)/preload.so: $(BUILDDIR)/stamp tools/preload.c
$(CC) -shared -fPIC $(CFLAGS) -o $@ tools/preload.c
preload: $(BUILDDIR)/preload.so
.PHONY: clean
clean: rpm-clean
$(RM) -rf $(BUILDDIR)
$(FIND) . -name "*~" -delete
$(MAKE) -C vendored/libfuse clean
.PHONY: distclean
distclean: clean
$(GIT) clean -ifd
ifdef GIT_REPO
$(GIT) clean -xfd
endif
install: $(TARGET) $(MANPAGE)
$(INSTALL) -m 0755 -D "$(TARGET)" "$(INSTALLTARGET)"
$(INSTALL) -m 0644 -D "$(MANPAGE)" "$(MANTARGET)"
.PHONY: install
install: install-base install-mount-tools install-preload install-man
install-strip: install
$(STRIP) "$(INSTALLTARGET)"
.PHONY: install-base
install-base: all
$(MKDIR) -p "$(INSTALLBINDIR)"
$(INSTALL) -v -m 0755 "$(BUILDDIR)/mergerfs" "$(INSTALLBINDIR)/mergerfs"
$(LN) -fs "mergerfs" "${INSTALLBINDIR}/fsck.mergerfs"
$(LN) -fs "mergerfs" "${INSTALLBINDIR}/mergerfs.collect-info"
uninstall:
$(RM) "$(INSTALLTARGET)"
$(RM) "$(MANTARGET)"
.PHONY: install-mount-tools
install-mount-tools: install-base
$(MKDIR) -p "$(INSTALLBINDIR)"
$(MAKE) -C vendored/libfuse install
$(MANPAGE): README.md
$(PANDOC) -s -t man -o $(MANPAGE) README.md
.PHONY: install-man
install-man: man/$(MANPAGE)
$(MKDIR) -p "$(INSTALLMAN1DIR)"
$(INSTALL) -v -m 0644 "man/$(MANPAGE)" "$(INSTALLMAN1DIR)/$(MANPAGE)"
man: $(MANPAGE)
.PHONY: install-preload
install-preload: preload
$(MKDIR) -p "$(INSTALLLIBDIR)"
$(INSTALL) -v -m 444 "$(BUILDDIR)/preload.so" "$(INSTALLLIBDIR)/preload.so"
tarball: clean changelog man
$(eval VERSION := $(shell $(GIT) describe --always --tags --dirty))
$(eval FILENAME := $(TARGET)-$(VERSION))
.PHONY: install-strip
install-strip: install-base
$(STRIP) "$(INSTALLBINDIR)/mergerfs"
.PHONY: uninstall
uninstall: uninstall-base uninstall-mount.mergerfs uninstall-preload uninstall-man
uninstall-base:
$(RM) -f "$(INSTALLBINDIR)/mergerfs"
$(RM) -f "$(INSTALLBINDIR)/fsck.mergerfs"
$(RM) -f "$(INSTALLBINDIR)/mergerfs.collect-info"
uninstall-mount.mergerfs:
$(RM) -f "$(INSTALLBINDIR)/mount.mergerfs"
uninstall-man:
$(RM) -f "$(INSTALLMAN1DIR)/$(MANPAGE)"
uninstall-preload:
$(RM) -f "$(INSTALLLIBDIR)/preload.so"
.PHONY: tarball
tarball: changelog version
$(eval VERSION := $(shell cat VERSION))
$(eval VERSION := $(subst -,_,$(VERSION)))
$(eval FILENAME := mergerfs-$(VERSION))
$(eval TMPDIR := $(shell $(MKTEMP) --tmpdir -d .$(FILENAME).XXXXXXXX))
$(MKDIR) $(TMPDIR)/$(FILENAME)
$(CP) -ar . $(TMPDIR)/$(FILENAME)
$(TAR) --exclude=.git -cz -C $(TMPDIR) -f ../$(FILENAME).tar.gz $(FILENAME)
$(TAR) --exclude=.git -cz -C $(TMPDIR) -f $(FILENAME).tar.gz $(FILENAME)
$(RM) -rf $(TMPDIR)
.PHONY: debian-changelog
debian-changelog:
ifdef GIT_REPO
$(GIT2DEBCL) --name mergerfs > debian/changelog
else
$(CP) -v ChangeLog debian/changelog
$(eval DISTRO := $(shell lsb_release -i -s | tr '[:upper:]' '[:lower:]'))
$(eval CODENAME := $(shell lsb_release -c -s | tr '[:upper:]' '[:lower:]'))
sed -i 's/~unknown-unknown/~$(DISTRO)-$(CODENAME)/g' debian/changelog
sed -i 's/ unknown; / $(CODENAME); /g' debian/changelog
endif
.PHONY: signed-deb
signed-deb:
$(MAKE) distclean
$(MAKE) debian-changelog
$(FAKEROOT) dpkg-buildpackage -nc
.PHONY: deb
deb:
$(eval VERSION := $(shell $(GIT) describe --always --tags --dirty))
$(GIT) dch --auto --release --new-version="$(VERSION)"
$(GIT) buildpackage --git-ignore-new
$(MAKE) distclean
$(MAKE) debian-changelog
$(MAKE) version
$(FAKEROOT) dpkg-buildpackage -nc -uc -us
$(MKDIR) -p ./$(BUILDDIR)/pkgs/
$(MV) -v ../mergerfs*deb ./$(BUILDDIR)/pkgs/
.PHONY: all clean install help
.PHONY: rpm-clean
rpm-clean:
$(RM) -rf rpmbuild
include $(wildcard obj/*.d)
.PHONY: rpm
rpm: tarball
$(eval VERSION := $(shell cat VERSION))
$(eval VERSION := $(subst -,_,$(VERSION)))
$(MKDIR) -p rpmbuild/BUILD rpmbuild/RPMS rpmbuild/SOURCES
$(SED) 's/__VERSION__/$(VERSION)/g' mergerfs.spec > \
rpmbuild/SOURCES/mergerfs.spec
cp -ar mergerfs-$(VERSION).tar.gz rpmbuild/SOURCES
$(RPMBUILD) $(RPMBUILD_FLAGS) -ba rpmbuild/SOURCES/mergerfs.spec \
--define "_topdir $(CURDIR)/rpmbuild"
.PHONY: install-build-pkgs
install-build-pkgs:
./buildtools/install-build-pkgs
.PHONY: install-build-tools
install-build-tools:
./buildtools/install-build-tools
define build_release
$(eval GITREF ?= $(shell git describe --exact-match --tags HEAD 2>/dev/null || git symbolic-ref --short HEAD 2>/dev/null || git rev-parse --short HEAD))
@echo "GITREF=$(GITREF)"
./buildtools/build-release \
--target=$(1) \
$(if $(CLEANUP),--cleanup) \
$(if $(PKGDIR),--pkgdirpath=$(PKGDIR)) \
--git-repo=$(if $(REMOTE_REPO),$(GITHUB_REPO),".") \
--branch=$(GITREF)
endef
.PHONY: release release-all
.PHONY: release-amd64 release-arm64 release-armhf release-riscv64
.PHONY: release-sample release-static release-tarball release-installer
release:
$(MAKE) RELEASE=1 CPPFLAGS="$(CPPFLAGS) -DNDEBUG" all
release-all:
$(call build_release,"all")
release-sample:
$(if $(TARGET),,$(eval TARGET := $(shell ./buildtools/detect-local-target 2>/dev/null)))
$(call build_release,$(if $(TARGET),$(TARGET),$(DEFAULT_TARGET)))
release-amd64:
$(call build_release,"amd64")
release-arm64:
$(call build_release,"arm64")
release-armhf:
$(call build_release,"armhf")
release-riscv64:
$(call build_release,"riscv64")
release-static:
$(call build_release,"static")
release-tarball:
$(call build_release,"tarball")
release-installer:
$(call build_release,"installer")
container:
$(eval GITREF ?= $(shell git describe --exact-match --tags HEAD 2>/dev/null || git symbolic-ref --short HEAD 2>/dev/null || git rev-parse --short HEAD))
@echo "GITREF=$(GITREF)"
./buildtools/build-containerimage "$(GITREF)"
.PHONY: tags
tags:
rm -fv TAGS
find . -name "*.c" -print | etags --append -
find . -name "*.h" -print | etags --append -
find . -name "*.cpp" -print | etags --append -
find . -name "*.hpp" -print | etags --append -
-include $(DEPS)

201
README.md
View file

@ -1,136 +1,125 @@
% mergerfs(1) mergerfs user manual
% Antonio SJ Musumeci <trapexit@spawn.link>
% June 9, 2014
# mergerfs - a featureful union filesystem
# NAME
**mergerfs** is a
[FUSE](https://en.wikipedia.org/wiki/Filesystem_in_Userspace) based
[union filesystem](https://en.wikipedia.org/wiki/Union_mount) geared
towards simplifying storage and management of files across numerous
commodity storage devices. It is similar to [**mhddfs**, **unionfs**,
**aufs**, **DrivePool**,
etc.](https://trapexit.github.io/mergerfs/latest/project_comparisons/)
mergerfs - another FUSE union filesystem
# SYNOPSIS
## Features
mergerfs -ocreate=epmfs,search=ff,action=ff &lt;srcpoints&gt; &lt;mountpoint&gt;
* Logically combine numerous filesystems/paths into a single
mount point (JBOFS: Just a Bunch of FileSystems)
* Combine paths of the same or different filesystems
* Ability to add or remove filesystems/paths without impacting the
rest of the data
* Unaffected by individual filesystem failure
* Configurable file selection and creation placement
* File IO
[passthrough](https://trapexit.github.io/mergerfs/latest/config/passthrough/)
for near native IO performance (where supported)
* Works with filesystems of any size
* Works with filesystems of [almost any
type](https://trapexit.github.io/mergerfs/latest/faq/compatibility_and_integration/#what-filesystems-can-be-used-as-branches)
* Ignore read-only filesystems when creating files
* [Hard links](https://trapexit.github.io/mergerfs/latest/faq/technical_behavior_and_limitations/#do-hard-links-work)
* Hard link [copy-on-write /
CoW](https://trapexit.github.io/mergerfs/latest/config/link_cow/)
* [Runtime configurable](https://trapexit.github.io/mergerfs/latest/runtime_interface/)
* Support for extended attributes (xattrs)
* Support for file attributes (chattr)
* Support for POSIX ACLs
# DESCRIPTION
mergerfs is similar to mhddfs, unionfs, and aufs. Like mhddfs in that it too uses FUSE. Like aufs in that it provides multiple policies for how to handle behavior.
## Non-features
Why create mergerfs when those exist? mhddfs isn't really maintained or flexible. There are also issues with running as root. aufs is more flexible but contains some hard to debug inconsistencies in behavior. Neither support file attributes ([chattr](http://linux.die.net/man/1/chattr)).
* Read/write overlay on top of read-only filesystem like OverlayFS
* File whiteout
* RAID like parity calculation (see [SnapRAID](https://www.snapraid.it))
* Redundancy
* Splitting of files across branches
# OPTIONS
###options###
## How it works
| Option | Default |
|--------|--------|
| search | ff |
| action | ff |
| create | epmfs |
mergerfs logically merges multiple filesystem paths together. Not
block devices, not filesystem mounts, just paths. It acts as a proxy
to the underlying filesystem paths. Combining the behaviors of some
functions and being a selector for others.
###srcpoints###
When the contents of a directory are requested mergerfs combines the
list of files from each directory, deduplicating entries, and returns
that list.
The source points argument is a colon (':') delimited list of paths. To make it simplier to include multiple source points without having to modify your [fstab](http://linux.die.net/man/5/fstab) we also support [globbing](http://linux.die.net/man/7/glob).
When a file or directory is created a policy is first run to determine
which branch will be selected for the creation.
For functions which change attributes or remove the file the behavior
may be applied to all instances found.
The way in which mergerfs behaves is controlled by the
[config/options/settings](https://trapexit.github.io/mergerfs/latest/config/options). More
specifically by
[policies](https://trapexit.github.io/mergerfs/latest/config/functions_categories_policies/).
### Visualization
```
$ mergerfs /mnt/disk*:/mnt/cdrom /media/drives
A + B = C
/disk1 /disk2 /merged
| | |
+-- /dir1 +-- /dir1 +-- /dir1
| | | | | |
| +-- file1 | | | +-- file1
| | +-- file2 | +-- file2
| | +-- file3 | +-- file3
| | |
+-- /dir2 | +-- /dir2
| | | | |
| +-- file4 | | +-- file4
| | |
| +-- /dir3 +-- /dir3
| | | | |
| | +-- file5 | +-- file5
| | |
+-- file6 | +-- file6
+-- file7 +-- file7 +-- file7
```
The above line will use all points in /mnt prefixed with *disk* and the directory *cdrom*.
In /etc/fstab it'd look like the following:
## QuickStart
```
# <file system> <mount point> <type> <options> <dump> <pass>
/mnt/disk*:/mnt/cdrom /media/drives fuse.mergerfs allow_other 0 0
```
**NOTE:** the globbing is done at mount time. If a new directory is added matching the glob after the fact it will not be included.
# POLICIES
Filesystem calls are broken up into 4 functional categories: search, action, create, and none. These categories can be assigned a policy which dictates how [mergerfs](http://github.com/trapexit/mergerfs) behaves while when action on the filesystem. Any policy can be assigned to a category though some aren't terribly practical. For instance: rand (Random) may be useful for **create** but could lead to very odd behavior if used for **search** or **action**. Since the input for any policy is the source mounts and fusepath and the output a vector of targets the choice was made to simplify the implementation and allow a policies usage in any category. **NOTE:** In any policy which can return more than one location (currently only **all**) the first value will be used in **search** and **create** policies since they can only ever act on 1 filepath.
#### Functional classifications ####
| Class | FUSE calls |
|-------|------------|
| search | access, getattr, getxattr, listxattr, open, readlink |
| action | chmod, link, removexattr, rmdir, setxattr, truncate, unlink, utimens |
| create | create, mkdir, mknod |
| none | fallocate, fgetattr, fsync, ftruncate, ioctl, read, readdir, rename, statfs, symlink, write, release |
#### Policy descriptions ####
| Policy | Description |
|--------------|-------------|
| ff (first found) | Given the order the paths were provided at mount time act on the first one found (regardless if stat would return EACCES). |
| ffwp (first found w/ permissions) | Given the order the paths were provided at mount time act on the first one found which you have access (stat does not error with EACCES). |
| newest (newest file) | If multiple files exist return the one with the most recent mtime. |
| all (all files found) | Attempt to apply the call to each file found. If any sub call succeeds the entire operation succeeds and other errors ignored. If all fail then the last error is reported. |
| mfs (most free space) | Assuming the path is found to exist (ENOENT would not be returned) use the drive with the most free space available. |
| epmfs (existing path, most free space) | If the path exists in multiple locations use the one with the most free space. Otherwise fall back to mfs. |
| rand (random) | Pick a destination at random. Again the dirname of the full path must exist somewhere. |
#### statvfs ####
It normalizes the source drives based on the fragment size and sums the number of adjusted blocks and inodes. This means you will see the combined space of all sources. Total, used, and free. The sources however are dedupped based on the drive so multiple points on the same drive will not result in double counting it's space.
**NOTE:** create is really a search for existence and then create. The 'search' policy applies to the first part. If the [dirname](http://linux.die.net/man/3/dirname) of the full path is not found to exist [ENOENT](http://linux.die.net/man/3/errno) is returned.
# BUILDING
* Need to install FUSE development libraries (libfuse-dev).
* Optionally need libattr1 (libattr1-dev).
https://trapexit.github.io/mergerfs/latest/quickstart/
```
[trapexit:~/dev/mergerfs] $ make help
usage: make
make XATTR_AVAILABLE=0 - to build program without xattrs functionality (auto discovered otherwise)
```
## Documentation
# Runtime Settings
https://trapexit.github.io/mergerfs
#### /.mergerfs pseudo file ####
```
<mountpoint>/.mergerfs
```
There is a pseudo file available at the mountpoint which allows for the runtime modification of policies. The file will not show up in readdirs but can be stat'ed, read, and writen. Most other calls will fail with EPERM, EINVAL, or whatever may be appropriate for that call. Anything not understood while writing will result in EINVAL otherwise the number of bytes written will be returned.
## Support
Reading the file will result in a newline delimited list of current settings as followed:
https://trapexit.github.io/mergerfs/latest/support/
```
[trapexit:/tmp/mount] $ cat .mergerfs
action=ff
create=epmfs
search=ff
```
Writing to the file is buffered and waits till a newline to process. Meaning echo works well.
## Sponsorship and Donations
```
[trapexit:/tmp/mount] $ echo "search=newest" >> .mergerfs
[trapexit:/tmp/mount] $ cat .mergerfs
action=ff
create=epmfs
search=newest
```
[https://github.com/trapexit/support](https://github.com/trapexit/support)
*NOTE:* offset is not supported and ignored in both read and write. There is also a safety check which limits buffered + incoming length to a max of 1024 bytes.
Development and support of a project like mergerfs requires a
significant amount of time and effort. The software is released under
the very liberal [ISC](https://opensource.org/license/isc-license-txt)
license and is therefore free to use for personal or commercial uses.
#### xattrs ####
If you are a non-commercial user and find mergerfs and its support valuable
and would like to support the project financially it would be very
much appreciated.
If xattrs has been enabled you can also use [{list,get,set}xattrs](http://linux.die.net/man/2/listxattr) on the pseudo file **.mergerfs** to modify the policies. The keys are **mergerfs.action**, **mergerfs.create**, and **mergerfs.search**.
```
[trapexit:/tmp/mount] $ attr -l .mergerfs
Attribute "mergerfs.action" has a 2 byte value for .mergerfs
Attribute "mergerfs.create" has a 5 byte value for .mergerfs
Attribute "mergerfs.search" has a 2 byte value for .mergerfs
[trapexit:/tmp/mount] $ attr -g mergerfs.action .mergerfs
Attribute "mergerfs.action" had a 2 byte value for .mergerfs:
ff
[trapexit:/tmp/mount] 1 $ attr -s mergerfs.action -V ffwp .mergerfs
Attribute "mergerfs.action" set to a 4 byte value for .mergerfs:
ffwp
```
If you are using mergerfs commercially please consider sponsoring the
project to ensure it continues to be maintained and receive
updates. If custom features are needed feel free to [contact me
directly](mailto:support@spawn.link).

16
buildtools/build-containerimage Executable file
View file

@ -0,0 +1,16 @@
#!/bin/sh
GIT_BRANCH="${1:-master}"
set -x
podman \
build \
--squash \
--no-cache \
--force-rm \
--build-arg="GIT_REPO=file:///mnt" \
--build-arg="BRANCH=${GIT_BRANCH}" \
-v "${PWD}":/mnt:ro \
-f "buildtools/containerimage/Containerfile" \
--tag "ghcr.io/trapexit/mergerfs:${GIT_BRANCH}" \
buildtools/

76
buildtools/build-mergerfs Executable file
View file

@ -0,0 +1,76 @@
#!/bin/sh
set -e
if [ -e /tmp/build-env ]; then
. /tmp/build-env
fi
rpmbuild_flags()
{
case "$(command -v "${CXX:-g++}")" in
/opt/rh/*)
printf '%s' '--undefine _annotated_build'
;;
esac
}
if [ $# -ne 2 ]; then
echo "usage: $0 <branch> <git_repo>"
echo "argv: $@"
echo "argc: $#"
exit 1
fi
GIT_REPO="${1}"
BRANCH="${2}"
BUILDDIR="/tmp/build"
echo "Clone source from ${GIT_REPO} to ${BUILDDIR}"
git \
clone \
--single-branch \
--branch="${BRANCH}" \
"${GIT_REPO}" \
"${BUILDDIR}"
cd "${BUILDDIR}"
git log HEAD^1..
mkdir "/build"
if [ -e /usr/bin/apt-get ]; then
make deb
elif [ -e /usr/bin/dnf ]; then
make RPMBUILD_FLAGS="$(rpmbuild_flags)" rpm
elif [ -e /usr/bin/yum ]; then
make RPMBUILD_FLAGS="$(rpmbuild_flags)" rpm
elif [ -e /sbin/apk ]; then
echo "NOT YET SUPPORTED"
exit 1
elif [ -e /usr/sbin/pkg ]; then
echo "NOT YET SUPPORTED"
exit 1
elif [ -e /usr/bin/pacman ]; then
make tarball
else
echo "NOT YET SUPPORTED"
exit 1
fi
echo "Copy packages to host..."
if [ -e /usr/bin/pacman ]; then
find "${BUILDDIR}" \
-type f \
-name "*.tar.gz" \
-exec cp -v {} /build/ \;
else
find "${BUILDDIR}" \
-type f \
\( -name "*.deb" -or -name "*.rpm" \) \
-not -name "*dbgsym*" \
-not -name "*sym*" \
-not -name "*src.rpm" \
-exec cp -v {} /build/ \;
fi
exit 0

178
buildtools/build-release Executable file
View file

@ -0,0 +1,178 @@
#!/usr/bin/env python3
import subprocess
import sys
import os
import argparse
import time
def build(git_repo,
branch,
containerfile,
pkgdirpath):
timestamp = time.time_ns()
args = ['podman',
'build',
'--pull=always',
'--force-rm']
if os.path.exists(git_repo):
git_repo = os.path.realpath(git_repo)
args += ['-v',f'{git_repo}:/tmp/mergerfs.git:ro:z']
args += ['--build-arg=GIT_REPO=file:///tmp/mergerfs.git']
else:
args += [f'--build-arg=GIT_REPO={git_repo}']
os.makedirs(pkgdirpath,exist_ok=True)
args += ['-v',f'{os.path.realpath(pkgdirpath)}:/pkgs:ro']
args += ['-o',pkgdirpath,
'-f',containerfile,
f'--build-arg=BRANCH={branch}',
f'--build-arg=BUILD_TIMESTAMP={timestamp}',
'buildtools/']
# TODO: Capture output and write to log
print(args)
rv = subprocess.run(args)
report_filepath = os.path.join(pkgdirpath,"build-report.txt")
with open(report_filepath,"a+") as f:
build = os.path.basename(containerfile)
f.write(build + ": ")
f.write(f"branch={branch}; ")
f.write(f"timestamp={timestamp}; ")
f.write("rv=")
if rv.returncode == 0:
f.write("success;")
else:
f.write("fail;")
f.write("\n")
def setup():
# Detect distribution
if os.path.exists('/usr/bin/apt-get'):
args = ['sudo',
'apt-get',
'install',
'-fy',
'qemu-user-static',
'qemu-user-binfmt']
elif os.path.exists('/usr/bin/pacman'):
args = ['sudo',
'pacman',
'-Sy',
'--noconfirm',
'qemu-user-static']
else:
print("Unsupported distribution for setup")
sys.exit(1)
print(args)
subprocess.run(args)
setup_binfmt()
def setup_binfmt():
"""Register qemu-user-static binfmt handlers (needed on Arch, etc.)."""
binfmt_conf = """\
:qemu-aarch64:M::\\x7fELF\\x02\\x01\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\xb7\\x00:\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x00\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xfe\\xff\\xff\\xff:/usr/bin/qemu-aarch64-static:F
:qemu-arm:M::\\x7fELF\\x01\\x01\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x28\\x00:\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x00\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xfe\\xff\\xff\\xff:/usr/bin/qemu-arm-static:F
:qemu-armeb:M::\\x7fELF\\x01\\x02\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x28:\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x00\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xfe\\xff\\xff:/usr/bin/qemu-armeb-static:F
:qemu-riscv64:M::\\x7fELF\\x02\\x01\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\xf3\\x00:\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x00\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xfe\\xff\\xff\\xff:/usr/bin/qemu-riscv64-static:F
:qemu-i386:M::\\x7fELF\\x01\\x01\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x03\\x00:\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x00\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xfe\\xff\\xff\\xff:/usr/bin/qemu-i386-static:F
"""
conf_path = '/etc/binfmt.d/qemu-static.conf'
print(f"Writing {conf_path}")
try:
with open(conf_path, 'w') as f:
f.write(binfmt_conf)
except PermissionError:
print(f"Permission denied writing {conf_path}; trying with sudo...")
subprocess.run(['sudo', 'tee', conf_path],
input=binfmt_conf.encode(), check=True)
print("Restarting systemd-binfmt...")
subprocess.run(['sudo', 'systemctl', 'restart', 'systemd-binfmt'])
def podman_cleanup():
args = ['podman',
'system',
'prune',
'-af']
print(args)
subprocess.run(args)
def parse_args():
p = argparse.ArgumentParser()
p.add_argument('--target',
default='debian:13.amd64')
p.add_argument('--pkgdirpath',
default='build/pkgs/')
p.add_argument('--branch',
default='master')
p.add_argument('--setup',
required=False,
action='store_true')
p.add_argument('--cleanup',
required=False,
action='store_true')
p.add_argument('--git-repo',
required=False,
type=str)
return p.parse_args()
def should_skip(filename):
if filename.endswith('~'):
return True
return False
def main():
args = parse_args()
print(args)
if args.setup:
setup()
sys.exit(0)
if not args.git_repo:
print("error: the following arguments are required: --git-repo")
sys.exit(1)
containerfiles = []
basepath = 'buildtools/containerfiles'
if os.path.exists(f'{basepath}/{args.target}'):
containerfiles.append(f'{basepath}/{args.target}')
elif args.target == 'all':
for root,dirnames,filenames in os.walk(basepath):
filenames.sort()
for filename in filenames:
if should_skip(filename):
continue
containerfile = f'buildtools/containerfiles/{filename}'
containerfiles.append(containerfile)
else:
for root,dirnames,filenames in os.walk(basepath):
filenames.sort()
for filename in filenames:
if args.target not in filename:
continue
if should_skip(filename):
continue
containerfile = f'buildtools/containerfiles/{filename}'
containerfiles.append(containerfile)
for containerfile in containerfiles:
if args.cleanup:
podman_cleanup()
build(git_repo=args.git_repo,
branch=args.branch,
containerfile=containerfile,
pkgdirpath=args.pkgdirpath)
sys.exit(0)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,10 @@
FROM --platform=amd64 debian:11 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=arm64 debian:11 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=armhf debian:11 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=i386 debian:11 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=amd64 debian:12 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=arm64 debian:12 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=armhf debian:12 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=i386 debian:12 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=amd64 debian:13 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=arm64 debian:13 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=armhf debian:13 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=i386 debian:13 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=riscv64 debian:13 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=amd64 fedora:40 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=arm64 fedora:40 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=amd64 fedora:41 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=arm64 fedora:41 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=amd64 fedora:42 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=arm64 fedora:42 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=amd64 fedora:43 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=arm64 fedora:43 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=amd64 fedora:44 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=arm64 fedora:44 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=amd64 quay.io/rockylinux/rockylinux:10 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=arm64 quay.io/rockylinux/rockylinux:10 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=amd64 quay.io/rockylinux/rockylinux:8 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=arm64 quay.io/rockylinux/rockylinux:8 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=amd64 quay.io/rockylinux/rockylinux:9 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=arm64 quay.io/rockylinux/rockylinux:9 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,15 @@
FROM --platform=linux/amd64 alpine:latest as build
COPY install-build-pkgs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN git clone --single-branch --branch="${BRANCH}" ${GIT_REPO} /tmp/mergerfs
WORKDIR /tmp/mergerfs
RUN make NDEBUG=1 LTO=1 STATIC=1 DESTDIR=/tmp -j$(nproc) install
RUN mkdir /build
RUN /tmp/usr/local/bin/mergerfs --version | head -n1 | cut -c 11- | tee /tmp/version
RUN tar cvfz /build/mergerfs-$(cat /tmp/version)-static-linux_amd64.tar.gz --directory=/tmp usr sbin
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,15 @@
FROM --platform=linux/arm64 alpine:latest as build
COPY install-build-pkgs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN git clone --single-branch --branch="${BRANCH}" ${GIT_REPO} /tmp/mergerfs
WORKDIR /tmp/mergerfs
RUN make NDEBUG=1 LTO=1 STATIC=1 DESTDIR=/tmp -j$(nproc) install
RUN mkdir /build
RUN /tmp/usr/local/bin/mergerfs --version | head -n1 | cut -c 11- | tee /tmp/version
RUN tar cvfz /build/mergerfs-$(cat /tmp/version)-static-linux_arm64.tar.gz --directory=/tmp usr sbin
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,15 @@
FROM --platform=linux/armhf alpine:latest as build
COPY install-build-pkgs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN git clone --single-branch --branch="${BRANCH}" ${GIT_REPO} /tmp/mergerfs
WORKDIR /tmp/mergerfs
RUN make NDEBUG=1 LTO=1 STATIC=1 DESTDIR=/tmp -j$(nproc) install
RUN mkdir /build
RUN /tmp/usr/local/bin/mergerfs --version | head -n1 | cut -c 11- | tee /tmp/version
RUN tar cvfz /build/mergerfs-$(cat /tmp/version)-static-linux_armhf.tar.gz --directory=/tmp usr sbin
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,15 @@
FROM --platform=linux/i386 alpine:latest as build
COPY install-build-pkgs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN git clone --single-branch --branch="${BRANCH}" ${GIT_REPO} /tmp/mergerfs
WORKDIR /tmp/mergerfs
RUN make NDEBUG=1 LTO=1 STATIC=1 DESTDIR=/tmp -j$(nproc) install
RUN mkdir /build
RUN /tmp/usr/local/bin/mergerfs --version | head -n1 | cut -c 11- | tee /tmp/version
RUN tar cvfz /build/mergerfs-$(cat /tmp/version)-static-linux_i386.tar.gz --directory=/tmp usr sbin
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,14 @@
ARG BUILD_TIMESTAMP=0
FROM --platform=linux/amd64 ubuntu:latest as build
COPY install-build-pkgs /tmp/
RUN /tmp/install-build-pkgs && \
DEBIAN_FRONTEND=noninteractive apt-get -qy --no-install-suggests --no-install-recommends install \
makeself
RUN mkdir -p /tmp/mergerfs/
RUN ls -lhd /pkgs
RUN cp -v /pkgs/*static*.gz /tmp/mergerfs/
RUN mkdir -p /build
RUN makeself /tmp/mergerfs/ /build/mergerfs-installer.run "mergerfs" echo "foo"
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,15 @@
FROM --platform=linux/riscv64 alpine:latest as build
COPY install-build-pkgs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN git clone --single-branch --branch="${BRANCH}" ${GIT_REPO} /tmp/mergerfs
WORKDIR /tmp/mergerfs
RUN make NDEBUG=1 LTO=1 STATIC=1 DESTDIR=/tmp -j$(nproc) install
RUN mkdir /build
RUN /tmp/usr/local/bin/mergerfs --version | head -n1 | cut -c 11- | tee /tmp/version
RUN tar cvfz /build/mergerfs-$(cat /tmp/version)-static-linux_riscv64.tar.gz --directory=/tmp usr sbin
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,17 @@
FROM alpine:latest as tarball
COPY install-build-pkgs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG BRANCH=master
ARG GIT_REPO
RUN git clone --single-branch "${GIT_REPO}" /tmp/mergerfs --branch="${BRANCH}"
RUN cd /tmp/mergerfs && make version tarball
RUN mkdir /build
RUN cp -v /tmp/mergerfs/*.tar.gz /build/
FROM scratch
COPY --from=tarball /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=amd64 ubuntu:22.04 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=arm64 ubuntu:22.04 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=armhf ubuntu:22.04 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=riscv64 ubuntu:22.04 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=amd64 ubuntu:24.04 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=arm64 ubuntu:24.04 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=armhf ubuntu:24.04 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=riscv64 ubuntu:24.04 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=amd64 ubuntu:25.04 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=arm64 ubuntu:25.04 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=armhf ubuntu:25.04 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=riscv64 ubuntu:25.04 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=amd64 ubuntu:25.10 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=arm64 ubuntu:25.10 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=armhf ubuntu:25.10 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=riscv64 ubuntu:25.10 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=amd64 ubuntu:26.04 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=arm64 ubuntu:26.04 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=armhf ubuntu:26.04 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,10 @@
FROM --platform=riscv64 ubuntu:26.04 as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs $GIT_REPO $BRANCH
FROM scratch
COPY --from=build /build/ /

View file

@ -0,0 +1,19 @@
FROM --platform=linux/amd64 alpine:latest as build
ARG GIT_REPO
ARG BRANCH
RUN <<EOF
apk add git gcc g++ make linux-headers
git clone --single-branch --branch="${BRANCH}" "${GIT_REPO}" /tmp/mergerfs
cd /tmp/mergerfs
make NDEBUG=1 LTO=1 STATIC=1 DESTDIR=/tmp/install -j$(nproc) install
tar cvfz /tmp/mergerfs.tgz --directory=/tmp/install usr sbin
EOF
FROM --platform=linux/amd64 alpine:latest
RUN --mount=from=build,source=/tmp/mergerfs.tgz,target=/tmp/mergerfs.tgz <<EOF
tar xvf /tmp/mergerfs.tgz -C /
EOF
ENTRYPOINT ["/usr/local/bin/mergerfs"]
CMD ["--help"]

14
buildtools/create-branches Executable file
View file

@ -0,0 +1,14 @@
#!/bin/sh
set -x
BASEPATH="/tmp"
for x in $(seq -w 2)
do
FILEPATH="${BASEPATH}/mergerfs-${x}.img"
MOUNTPOINT="${BASEPATH}/mergerfs-${x}"
truncate -s 1G "${FILEPATH}"
mkdir -p "${MOUNTPOINT}"
mkfs.ext4 -m0 -L "mergerfs${x}" "${FILEPATH}"
sudo mount "${FILEPATH}" "${MOUNTPOINT}"
done

119
buildtools/detect-local-target Executable file
View file

@ -0,0 +1,119 @@
#!/bin/bash
# Detects local OS and maps to containerfiles target
# Returns target if found in buildtools/containerfiles/, empty string otherwise
set -euo pipefail
CONTAINERFILES_DIR="buildtools/containerfiles"
# Detect system architecture and map to containerfiles format
detect_arch() {
local arch
arch=$(uname -m)
case "$arch" in
x86_64) echo "amd64" ;;
aarch64) echo "arm64" ;;
armv7l) echo "armhf" ;;
i686|i386) echo "i386" ;;
riscv64) echo "riscv64" ;;
*) echo "" ;;
esac
}
# Detect distro and version from os-release
detect_distro() {
local os_release="${1:-}"
if [[ ! -r "$os_release" ]]; then
return 1
fi
# Source the file safely - ID and VERSION_ID are environment variables
. "$os_release"
local distro="$ID"
local version="$VERSION_ID"
# Map distro ID to containerfiles naming convention
case "$distro" in
ubuntu|debian|fedora) ;;
rocky|rhel|centos|almalinux) distro="rockylinux" ;;
*)
# Fallback to ID_LIKE for derivatives
if [[ -n "${ID_LIKE:-}" ]]; then
case "$ID_LIKE" in
*ubuntu*) distro="ubuntu" ;;
*debian*) distro="debian" ;;
*fedora*) distro="fedora" ;;
esac
fi
;;
esac
# Only return if we have valid distro and version
if [[ -n "$distro" && -n "$version" ]]; then
echo "$distro:$version"
else
return 1
fi
}
# Try to find a matching containerfile target
find_containerfile() {
local target="$1"
local containerfile="${CONTAINERFILES_DIR}/${target}"
# Direct match
if [[ -d "$containerfile" || -f "$containerfile" ]]; then
echo "$target"
return 0
fi
return 1
}
# Main detection logic
main() {
local arch
# Detect architecture
arch=$(detect_arch)
if [[ -z "$arch" ]]; then
echo "WARNING: Could not detect system architecture" >&2
exit 1
fi
# Try to detect distro from multiple locations
local distro_ver
distro_ver=$(detect_distro "/etc/os-release") || \
distro_ver=$(detect_distro "/usr/lib/os-release") || {
echo "WARNING: Could not detect distro from os-release" >&2
exit 1
}
# Build target string
local target="${distro_ver}.${arch}"
# Try to find matching containerfile
if find_containerfile "$target"; then
exit 0
fi
# Try with partial version matching (e.g., 25.10 → 25)
local distro="${distro_ver%%:*}"
local version="${distro_ver##*:}"
# Strip last minor version number and try again
local short_version="${version%.*}"
if [[ -n "$short_version" ]]; then
target="${distro}:${short_version}.${arch}"
if find_containerfile "$target"; then
exit 0
fi
fi
# No match found
echo "WARNING: No containerfile found for target: ${distro_ver}.${arch}" >&2
exit 1
}
main "$@"

27
buildtools/gen-containerfiles Executable file
View file

@ -0,0 +1,27 @@
#!/bin/sh
input_file="${1}"
while IFS= read -r line || [ -n "$line" ]; do
# Skip empty lines
if [ -z "$line" ]; then
continue
fi
image=$(echo "$line" | cut -d' ' -f1)
platform=$(echo "$line" | cut -d' ' -f2-)
echo "${image} ${platform}"
cat <<EOF > "containerfiles/${image##*/}.${platform}"
FROM --platform=${platform} ${image} as build
COPY install-build-pkgs build-mergerfs /tmp/
RUN /tmp/install-build-pkgs
ARG BUILD_TIMESTAMP=0
ARG GIT_REPO
ARG BRANCH
RUN /tmp/build-mergerfs \$GIT_REPO \$BRANCH
FROM scratch
COPY --from=build /build/ /
EOF
done < "$input_file"

202
buildtools/git2debcl Executable file
View file

@ -0,0 +1,202 @@
#!/bin/sh
# Copyright (c) 2016, Antonio SJ Musumeci <trapexit@spawn.link>
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
# Default values
NAME=""
VERSION="::guess::"
DISTRO="::guess::"
CODENAME="::guess::"
URGENCY="medium"
# Function to display usage
usage() {
cat << EOF
Usage: $0 --name NAME [OPTIONS]
Generated debian/changelog from git log
Options:
--name NAME Name of package (required)
--version VERSION Place in git history to include upto (default: ::guess::)
--distro DISTRO Distribution name (default: ::guess::)
--codename NAME Distribution codename (default: ::guess::)
--urgency URGENCY Urgency (default: medium)
-h, --help Show this help message
EOF
exit 1
}
# Parse command line arguments
while [ $# -gt 0 ]; do
case "$1" in
--name)
NAME="$2"
shift 2
;;
--version)
VERSION="$2"
shift 2
;;
--distro)
DISTRO="$2"
shift 2
;;
--codename)
CODENAME="$2"
shift 2
;;
--urgency)
URGENCY="$2"
shift 2
;;
-h|--help)
usage
;;
*)
echo "Unknown option: $1" >&2
usage
;;
esac
done
# Check required arguments
if [ -z "$NAME" ]; then
echo "Error: --name is required" >&2
usage
fi
# Function to get git tags sorted in reverse order
git_tags() {
git tag -l | sort -rV
}
# Function to get git log between two tags
git_log() {
local fromtag="$1"
local totag="$2"
git log --no-merges --oneline "${fromtag}...${totag}" 2>/dev/null
}
# Function to get author and time for a tag
git_author_and_time() {
local tag="$1"
git log -1 --format="-- %an <%ae> %cD" "$tag"
}
# Function to get git version
git_version() {
git describe --always --tags --dirty 2>/dev/null || echo "unknown"
}
# Function to guess distribution
guess_distro() {
if command -v lsb_release >/dev/null 2>&1; then
lsb_release -i -s 2>/dev/null | tr '[:upper:]' '[:lower:]'
else
echo "unknown"
fi
}
# Function to guess codename
guess_codename() {
if command -v lsb_release >/dev/null 2>&1; then
lsb_release -c -s 2>/dev/null | tr '[:upper:]' '[:lower:]'
else
echo "unknown"
fi
}
# Handle guessing of values
if [ "$DISTRO" = "::guess::" ]; then
DISTRO=$(guess_distro)
fi
if [ "$CODENAME" = "::guess::" ]; then
CODENAME=$(guess_codename)
fi
if [ "$VERSION" = "::guess::" ]; then
VERSION=$(git_version)
fi
# Version suffix
VERSUFFIX="~${DISTRO}-${CODENAME}"
# Get all tags
TAGS=$(git_tags)
# Create temporary file for tag pairs
TMPFILE=$(mktemp)
trap 'rm -f "$TMPFILE"' EXIT
# Check if version is in tags
if echo "$TAGS" | grep -q "^${VERSION}$"; then
# If version is a tag, start from that tag
echo "$TAGS" | awk -v ver="$VERSION" 'BEGIN{found=0} {if($0==ver)found=1; if(found)print}' > "$TMPFILE"
else
# If version is not a tag, use HEAD as starting point
echo "$VERSION HEAD" > "$TMPFILE"
echo "$TAGS" >> "$TMPFILE"
fi
# Process tags and generate changelog
PREV_TAG=""
PREV_REF=""
FIRST=1
while IFS= read -r line; do
if [ -z "$line" ]; then
continue
fi
# Handle the special case of VERSION HEAD
if [ "$line" = "$VERSION HEAD" ]; then
TAG="$VERSION"
REF="HEAD"
else
TAG="$line"
REF="$line"
fi
if [ -n "$PREV_TAG" ]; then
# Get log entries between current and previous tag
LOG_ENTRIES=$(git_log "$REF" "$PREV_REF")
# Skip if no changes
if [ -z "$LOG_ENTRIES" ] || [ "$LOG_ENTRIES" = "" ]; then
PREV_TAG="$TAG"
PREV_REF="$REF"
continue
fi
# Print package header
printf "%s (%s%s) %s; urgency=%s\n\n" "$NAME" "$PREV_TAG" "$VERSUFFIX" "$CODENAME" "$URGENCY"
# Print each log entry
echo "$LOG_ENTRIES" | while IFS= read -r entry; do
if [ -n "$entry" ]; then
printf " * %s\n" "$entry"
fi
done
# Print author and time
AUTHOR_TIME=$(git_author_and_time "$PREV_REF")
printf "\n %s\n\n" "$AUTHOR_TIME"
fi
PREV_TAG="$TAG"
PREV_REF="$REF"
done < "$TMPFILE"

162
buildtools/install-build-pkgs Executable file
View file

@ -0,0 +1,162 @@
#!/bin/sh
set -e
BUILD_ENV=/tmp/build-env
write_gcc_env()
{
{
printf 'export CC=%s\n' "$1"
printf 'export CXX=%s\n' "$2"
} > "$BUILD_ENV"
}
write_toolset_env()
{
{
printf '. %s\n' "$1"
printf 'export CC=gcc\n'
printf 'export CXX=g++\n'
} > "$BUILD_ENV"
}
latest_apt_gxx()
{
apt-cache --names-only search '^g[+][+]-[0-9]' \
| sed -n 's/^\(g++-[0-9][0-9]*\) .*/\1/p' \
| sort -t- -k2,2V \
| tail -n 1
}
latest_dnf_toolset()
{
dnf -q list --showduplicates 'gcc-toolset-*-gcc-c++' 2>/dev/null \
| sed -n 's/^gcc-toolset-\([0-9][0-9]*\)-gcc-c++\..*/\1/p' \
| sort -V \
| tail -n 1
}
latest_yum_toolset()
{
yum -q list available 'devtoolset-*-gcc-c++' 2>/dev/null \
| sed -n 's/^devtoolset-\([0-9][0-9]*\)-gcc-c++\..*/\1/p' \
| sort -V \
| tail -n 1
}
version_gt()
{
highest="$(printf '%s\n%s\n' "$1" "$2" | sort -V | tail -n 1)"
[ "$highest" = "$1" ] && [ "$1" != "$2" ]
}
check_cxx20()
{
cxx="${CXX:-g++}"
test_src=/tmp/mergerfs-cxx20-check.cpp
test_bin=/tmp/mergerfs-cxx20-check
cat > "$test_src" <<'EOF'
template <typename T>
concept Incrementable = requires(T value) { value + 1; };
static_assert(Incrementable<int>);
int main()
{
return 0;
}
EOF
if ! "$cxx" -std=c++20 "$test_src" -o "$test_bin" >/dev/null 2>&1; then
echo "error: $cxx does not support C++20" >&2
exit 1
fi
rm -f "$test_src" "$test_bin"
}
: > "$BUILD_ENV"
if [ -e /usr/bin/apt-get ]; then
export DEBIAN_FRONTEND=noninteractive
apt-get -qy update
cxx_pkg="$(latest_apt_gxx)"
if [ -n "$cxx_pkg" ]; then
gcc_pkg="gcc-${cxx_pkg#g++-}"
compiler_pkgs="$gcc_pkg $cxx_pkg"
write_gcc_env "$gcc_pkg" "$cxx_pkg"
else
compiler_pkgs="g++"
write_gcc_env gcc g++
fi
apt-get -qy --force-yes --no-install-suggests --no-install-recommends \
install \
ca-certificates \
build-essential \
dpkg-dev \
git \
$compiler_pkgs \
debhelper \
lsb-release \
fakeroot
. "$BUILD_ENV"
check_cxx20
elif [ -e /usr/bin/dnf ]; then
dnf -y update
toolset="$(latest_dnf_toolset)"
dnf -y install \
git rpm-build gcc-c++ make which libatomic
default_gxx_major="$(g++ -dumpversion | cut -f1 -d.)"
if [ -n "$toolset" ] && version_gt "$toolset" "$default_gxx_major"; then
dnf -y install \
"gcc-toolset-${toolset}-gcc" \
"gcc-toolset-${toolset}-gcc-c++"
write_toolset_env "/opt/rh/gcc-toolset-${toolset}/enable"
else
write_gcc_env gcc g++
fi
. "$BUILD_ENV"
check_cxx20
elif [ -e /usr/bin/yum ]; then
yum -y update
yum -y install \
git rpm-build gcc-c++ make which
yum -y install centos-release-scl || true
yum -y update
toolset="$(latest_yum_toolset)"
default_gxx_major="$(g++ -dumpversion | cut -f1 -d.)"
if [ -n "$toolset" ] && version_gt "$toolset" "$default_gxx_major"; then
yum -y install \
"devtoolset-${toolset}-gcc" \
"devtoolset-${toolset}-gcc-c++"
write_toolset_env "/opt/rh/devtoolset-${toolset}/enable"
else
write_gcc_env gcc g++
fi
. "$BUILD_ENV"
check_cxx20
elif [ -e /usr/bin/zypper ]; then
zypper update -y
zypper install -y \
git rpm-build gcc-c++ make which
write_gcc_env gcc g++
. "$BUILD_ENV"
check_cxx20
elif [ -e /sbin/apk ]; then
apk add \
abuild git gcc g++ make \
linux-headers
write_gcc_env gcc g++
. "$BUILD_ENV"
check_cxx20
elif [ -e /usr/sbin/pkg ]; then
pkg install \
git gmake gcc
elif [ -e /usr/bin/pacman ]; then
pacman -Sy --noconfirm base-devel git fakeroot
write_gcc_env gcc g++
. "$BUILD_ENV"
check_cxx20
fi

32
buildtools/install-build-tools Executable file
View file

@ -0,0 +1,32 @@
#!/bin/sh
if [ "$(id -u)" -eq 0 ]; then
SUDO=
elif command -v sudo >/dev/null 2>&1; then
SUDO=sudo
elif command -v doas >/dev/null 2>&1; then
SUDO=doas
else
printf '%s\n' "error: need root privileges; run as root or install sudo/doas" >&2
exit 1
fi
if [ -e /usr/bin/apt-get ]; then
export DEBIAN_FRONTEND=noninteractive
${SUDO} apt-get -qy update
${SUDO} apt-get -qy --no-install-suggests --no-install-recommends install \
qemu-user-static \
podman
elif [ -e /usr/bin/dnf ]; then
${SUDO} dnf -y update
${SUDO} dnf -y install \
qemu-user-static \
podman
elif [ -e /sbin/apk ]; then
${SUDO} apk add \
python3 \
qemu-user-static \
podman
elif [ -e /usr/bin/pacman ]; then
${SUDO} pacman -Sy --noconfirm qemu-user-static podman
fi

View file

@ -0,0 +1,39 @@
debian:11 amd64
debian:11 arm64
debian:11 armhf
debian:11 i386
debian:12 amd64
debian:12 arm64
debian:12 armhf
debian:12 i386
debian:13 amd64
debian:13 arm64
debian:13 armhf
debian:13 i386
debian:13 riscv64
fedora:40 amd64
fedora:40 arm64
fedora:41 amd64
fedora:41 arm64
fedora:42 amd64
fedora:42 arm64
fedora:43 amd64
fedora:43 arm64
quay.io/rockylinux/rockylinux:10 amd64
quay.io/rockylinux/rockylinux:10 arm64
quay.io/rockylinux/rockylinux:8 amd64
quay.io/rockylinux/rockylinux:8 arm64
quay.io/rockylinux/rockylinux:9 amd64
quay.io/rockylinux/rockylinux:9 arm64
ubuntu:22.04 amd64
ubuntu:22.04 arm64
ubuntu:22.04 armhf
ubuntu:22.04 riscv64
ubuntu:24.04 amd64
ubuntu:24.04 arm64
ubuntu:24.04 armhf
ubuntu:24.04 riscv64
ubuntu:25.04 amd64
ubuntu:25.04 arm64
ubuntu:25.04 armhf
ubuntu:25.04 riscv64

20
buildtools/update-version Executable file
View file

@ -0,0 +1,20 @@
#!/bin/sh
VERSION=$(git describe --always --tags --dirty)
if [ $? -ne 0 ]; then
VERSION=$(cat VERSION)
fi
if [ "${VERSION}" = "" ]; then
VERSION="unknown"
fi
echo "version = ${VERSION}"
echo -n "${VERSION}" > VERSION
grep -sq \"${VERSION}\" src/version.hpp
RV=$?
if [ $RV -ne 0 ]; then
echo "Writing 'src/version.hpp'"
echo "#pragma once" > src/version.hpp
echo "static const char MERGERFS_VERSION[] = \"${VERSION}\";" >> src/version.hpp
fi

27
debian/changelog vendored
View file

@ -1,27 +0,0 @@
mergerfs (1.1.0) trusty; urgency=medium
* initial code commit
* fix building without libattr
* update build instructions in readme
* use {get,list,set}xattr to modify runtime
* use long instead of int to limit possibility of overflow in switch, closes #1
* add FS_IOC_{GET}VERSION to ioctl
* remove statfs policy
* fs::make_path should check for forward slashes, add if missing
* remove stat'ing of files in readdir. closes #3
* use eaccess to determine permissions for ffwp. closes #2
* rework policy code
* add fgetattr. closes #5
* when readdir's filler returns non-zero return ENOMEM. closes #7
* enhance Makefile
* further Makefile enhancements
* fix free space calculations. closes #8
* add debian package building
-- Antonio SJ Musumeci <trapexit@spawn.link> Fri, 30 May 2014 21:32:19 -0400
mergerfs (1.0.0) trusty; urgency=medium
* Initial commit
-- Antonio SJ Musumeci <trapexit@spawn.link> Fri, 30 May 2014 21:28:09 -0400

1
debian/compat vendored
View file

@ -1 +0,0 @@
9

13
debian/control vendored
View file

@ -2,10 +2,7 @@ Source: mergerfs
Section: utils
Priority: optional
Maintainer: Antonio SJ Musumeci <trapexit@spawn.link>
Build-Depends: debhelper (>= 8.0.0),
libfuse-dev,
libattr1-dev,
pkg-config
Build-Depends: debhelper-compat (= 10)
Standards-Version: 3.9.4
Homepage: http://github.com/trapexit/mergerfs
@ -13,8 +10,8 @@ Package: mergerfs
Architecture: any
Depends: ${shlibs:Depends},
${misc:Depends},
libfuse2
fuse [linux-any] | fuse4bsd [kfreebsd-any]
Description: another FUSE union filesystem
mergerfs is similar to mhddfs, unionfs, and aufs. Like mhddfs in that it too
uses FUSE. Like aufs in that it provides multiple policies for how to handle
behavior.
mergerfs is a union filesystem geared towards simplifying storage and
management of files across numerous commodity storage devices. It is
similar to mhddfs, unionfs, and aufs.

36
debian/copyright vendored
View file

@ -4,28 +4,22 @@ Source: http://github.com/trapexit/mergerfs
Files: *
Copyright: 2014 Antonio SJ Musumeci <trapexit@spawn.link>
License: MIT
License: ISC
Files: debian/*
Copyright: 2014 Antonio SJ Musumeci <trapexit@spawn.link>
License: MIT
License: ISC
License: MIT
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
.
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
n
License: ISC
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
n

1
debian/files vendored
View file

@ -1 +0,0 @@
mergerfs_1.1.0_amd64.deb utils optional

9
debian/mergerfs.postinst vendored Executable file
View file

@ -0,0 +1,9 @@
#!/bin/sh
set -e
case "${1}" in
configure)
chmod 4755 /usr/bin/mergerfs-fusermount
;;
esac

12
debian/rules vendored
View file

@ -1,8 +1,16 @@
#!/usr/bin/make -f
# -*- makefile -*-
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
export DH_VERBOSE=1
%:
dh $@
override_dh_auto_build:
$(MAKE) release
override_dh_auto_install:
$(MAKE) \
DESTDIR=$(CURDIR)/debian/mergerfs \
PREFIX=/usr \
install

120
man/mergerfs.1 Normal file
View file

@ -0,0 +1,120 @@
.TH MERGERFS 1 "May 2025" "mergerfs" "User Commands"
.SH NAME
mergerfs \- a featureful union filesystem
.SH SYNOPSIS
.B mergerfs
[options] <branches> <mountpoint>
.SH DESCRIPTION
.B mergerfs
is a FUSE-based union filesystem geared towards simplifying storage and management of files across numerous commodity storage devices. It is similar to
.BR mhddfs ,
.BR unionfs ,
and
.BR aufs .
.SH QUICKSTART
.UR https://trapexit.github.io/mergerfs/latest/quickstart
.LI https://trapexit.github.io/mergerfs/latest/quickstart
.UE
.SH DOCUMENTATION
.UR https://trapexit.github.io/mergerfs
.LI https://trapexit.github.io/mergerfs
.UE
.SH SUPPORT
.UR https://trapexit.github.io/mergerfs/latest/support
.LI https://trapexit.github.io/mergerfs/latest/support
.UE
.SH FEATURES
.IP \[bu] 2
Logically combine numerous filesystems/paths into a single mount point
.IP \[bu]
Combine paths of the same or different filesystems
.IP \[bu]
Ability to add or remove filesystems/paths without impacting the rest of the data
.IP \[bu]
Unaffected by individual filesystem failure
.IP \[bu]
Configurable file selection and creation placement
.IP \[bu]
Works with filesystems of any size
.IP \[bu]
Works with filesystems of almost any type
.IP \[bu]
Ignore read-only filesystems when creating files
.IP \[bu]
Hard link copy-on-write / CoW
.IP \[bu]
Runtime configurable
.IP \[bu]
Support for extended attributes (xattrs)
.IP \[bu]
Support for file attributes (chattr)
.IP \[bu]
Support for POSIX ACLs
.SH NON-FEATURES
.IP \[bu] 2
Read/write overlay on top of read-only filesystem like OverlayFS
.IP \[bu]
File whiteout
.IP \[bu]
RAID-like parity calculation
.IP \[bu]
Redundancy
.IP \[bu]
Splitting of files across branches
.SH HOW IT WORKS
.B mergerfs
logically merges multiple filesystem paths together. It acts as a proxy to the underlying filesystem paths, combining the behaviors of some functions and being a selector for others.
When the contents of a directory are requested,
.B mergerfs
combines the list of files from each directory, deduplicating entries, and returns that list.
When a file or directory is created, a policy is first run to determine which branch will be selected for the creation.
For functions which change attributes or remove the file, the behavior may be applied to all instances found.
Read more about policies here:
.UR https://trapexit.github.io/mergerfs/latest/config/functions_categories_policies
.LI https://trapexit.github.io/mergerfs/latest/config/functions_categories_policies
.UE
.SH VISUALIZATION
.nf
A + B = C
/disk1 /disk2 /merged
| | |
+-- /dir1 +-- /dir1 +-- /dir1
| | | | | |
| +-- file1 | +-- file2 | +-- file1
| | +-- file3 | +-- file2
+-- /dir2 | | +-- file3
| | +-- /dir3 |
| +-- file4 | +-- /dir2
| +-- file5 | |
+-- file6 | +-- file4
|
+-- /dir3
| |
| +-- file5
|
+-- file6
.fi
.SH SPONSORSHIP AND DONATIONS
Development and support of a project like
.B mergerfs
require a significant amount of time and effort. The software is released under the very liberal ISC license and is therefore free to use for personal or commercial uses.
If you are a non-commercial user and find
.B mergerfs
and its support valuable and would like to support the project financially, it would be very much appreciated.
If you are using
.B mergerfs
commercially, please consider sponsoring the project to ensure it continues to be maintained and receive updates. If custom features are needed, feel free to contact the maintainer directly.
.UR https://github.com/trapexit/support
.LI https://github.com/trapexit/support
.UE
.SH LICENSE
ISC License
.SH AUTHOR
Antonio SJ Musumeci (aka trapexit)

59
mergerfs.spec Normal file
View file

@ -0,0 +1,59 @@
Name: mergerfs
Version: __VERSION__
Release: 1%{?dist}
Summary: A featureful FUSE based union filesystem
Group: Applications/System
License: ISC
URL: https://github.com/trapexit/mergerfs
Source: mergerfs-%{version}.tar.gz
BuildRequires: gcc-c++
# rpmbuild driven by the Makefile uses git to generate a version number
BuildRequires: git
%global debug_package %{nil}
%undefine _debuginfo_subpackages
%global _enable_debug_packages 0
%prep
%setup -q
%description
mergerfs is a union filesystem geared towards simplifying storage and
management of files across numerous commodity storage devices. It is
similar to mhddfs, unionfs, and aufs.
%build
make %{?_smp_mflags} CFLAGS="%{optflags}" CXXFLAGS="%{optflags}" LDFLAGS="%{__global_ldflags}"
%install
make install PREFIX=%{_prefix} DESTDIR=%{buildroot}
%files
/usr/bin/mergerfs
/usr/bin/mergerfs-fusermount
/usr/bin/fsck.mergerfs
/usr/bin/mergerfs.collect-info
/sbin/mount.mergerfs
/usr/lib/mergerfs/preload.so
%doc %{_mandir}/*
%changelog
* Fri Apr 26 2019 Antonio SJ Musumeci <trapexit@spawn.link>
- Update description
* Mon Jan 25 2016 Antonio SJ Musumeci <trapexit@spawn.link>
- Remove sbin files
* Sat Sep 05 2015 Antonio SJ Musumeci <trapexit@spawn.link>
- Include PREFIX to install
* Mon Dec 29 2014 Joe Lawrence <joe.lawrence@stratus.com>
- Tweak rpmbuild to archive current git HEAD into a tarball, then (re)build in
the rpmbuild directory -- more complicated but seemingly better suited to
generate source and debug rpms.
* Fri Jun 20 2014 Joe Lawrence <joe.lawrence@stratus.com>
- Initial rpm spec file.

23
mkdocs/README.md Normal file
View file

@ -0,0 +1,23 @@
# mkdocs
## Getting started
```bash
python3 -m venv venv
source venv/bin/activate
pip3 install --no-cache-dir mkdocs mkdocs-material pymdown-extensions mike
mike serve
```
## Deploy
```bash
mike deploy --push <version_name> --allow-empty
```
## References
* https://www.mkdocs.org/
* https://squidfunk.github.io/mkdocs-material/

7
mkdocs/build-venv Executable file
View file

@ -0,0 +1,7 @@
#!/bin/sh
set -x
set -e
python3 -m venv venv
. ./venv/bin/activate
pip3 install --no-cache-dir 'mkdocs<2.0' mkdocs-material pymdown-extensions mike

111
mkdocs/docs/benchmarking.md Normal file
View file

@ -0,0 +1,111 @@
# Benchmarking
Filesystems are complicated. They do many things and many of those are
interconnected. Additionally, the OS, drivers, hardware, etc. can all
impact performance. Therefore, when benchmarking, it is **necessary**
that the test focuses as narrowly as possible.
For most throughput is the key benchmark. To test throughput `dd` is
useful but **must** be used with the correct settings in order to
ensure the filesystem or device is actually being tested. The OS can
and will cache data. Without forcing synchronous reads and writes
and/or disabling caching the values returned will not be
representative of the device's true performance.
When benchmarking through mergerfs ensure you only use 1 branch to
remove any possibility of the policies or differences in underlying
filesystems complicating the situation. Benchmark the underlying
filesystem first and then mount mergerfs with that same filesystem and
that. Throughput **will be** lower but if you are experiencing speeds
below your expectation you will need to narrow down precisely which
component is leading to the slowdown. Preferably test the following in
the order listed (but not combined).
1. Enable `nullrw` mode with `nullrw=true`. This will effectively make
reads and writes no-ops. Removing the underlying device /
filesystem from the equation. This will give us the top theoretical
speeds.
2. Configure mergerfs to use a `tmpfs` branch. `tmpfs` is a RAM
disk. Extremely high speed and very low latency. This is a more
realistic best case scenario. Example: `mount -t tmpfs -o size=2G
tmpfs /tmp/tmpfs`
3. Configure mergerfs to use a local device filesystem branch. NVMe,
SSD, HDD, etc. Test them individually. If you have different
interconnects / controllers use the same storage device when
testing to ensure consistency.
4. Configure mergerfs to use any network filesystems you plan to use
one at a time. It may also be worth trying a different network
filesystem. `NFS` vs `CIFS/SMB/Samba` vs `sshfs`, etc.
Once you find the component which has the performance issue you can do
further testing with different options to see if they impact
performance. If you find a specific system, device, filesystem,
controller, etc. that performs poorly contact the author so it can be
investigated further.
Sometimes the problem is really the application accessing or writing
data through mergerfs. Some software use small buffer sizes which can
lead to more requests and therefore greater overhead. You can test
this out yourself by replacing `bs=1M` in the examples below with
`ibs` or `obs` and using a size of `512` instead of `1M`. In one
example test using `nullrw` the write speed dropped from 4.9GB/s to
69.7MB/s when moving from `1M` to `512`. Similar results were had when
testing reads. Small writes overhead may be improved by leveraging a
write cache but in casual tests little gain was found. If you have an
app that appears slow with mergerfs it could be due to this. `strace`
can be used with the app in question or mergerfs to see the size of
read/writes. Contact the software author or worse case the mergerfs
author so it may be investigated further.
### Write Benchmark
```
$ dd if=/dev/zero of=/mnt/mergerfs/16GB.file bs=1M count=16384 oflag=nocache conv=fdatasync status=progress
```
### Read Benchmark
```
$ dd if=/mnt/mergerfs/16GB.file of=/dev/null bs=1M iflag=nocache conv=fdatasync status=progress
```
### fio
`fio` is a popular and flexible benchmarking tool.
Below are some basic tests but also try setting `--direct=0`, changing
the `ioengine`, or playing with other options.
#### Write
```
$ fio --name=writetest --filename=/mnt/mergerfs/16GB.file --size=16Gb --rw=write --bs=1M --direct=1 --numjobs=1 --iodepth=8 --group_reporting --runtime=60 --startdelay=0 --ioengine=psync
```
#### Read
```
$ fio --name=readtest --filename=/mnt/mergerfs/16GB.file --size=16Gb --rw=read --bs=1M --direct=1 --numjobs=1 --iodepth=8 --group_reporting --runtime=60 --startdelay=0 --ioengine=psync
```
### Other Benchmarks
If you are attempting to benchmark other behaviors you must ensure you
clear kernel caches before runs. In fact it would be a good deal to
run before the read and write benchmarks as well just in case.
```
sync
echo 3 | sudo tee /proc/sys/vm/drop_caches
```
## Additional Reading
* [Tweaking Performance](performance.md)
* [Options](config/options.md)
* [Tips and Notes](tips_notes.md)

View file

@ -0,0 +1,89 @@
# branches-mount-timeout
* type: `UINT` (seconds)
* default: `0`
mergerfs is compatible with any path, whether it be a mount point or a
directory on your [root
filesystem.](https://en.wikipedia.org/wiki/Root_directory) It doesn’t
require branch paths to be mounted or to match a specific filesystem
at startup, and it operates effectively without needing details about
the intended filesystem. This flexibility eliminates the need to
manage mount ordering, which is particularly advantageous on modern
systems where filesystems are mounted asynchronously, resulting in
unpredictable mount sequences. While
[systemd](https://www.freedesktop.org/software/systemd/man/latest/systemd.mount.html)
offers a way to enforce mount dependencies using the
[x-systemd.requires=PATH](https://www.freedesktop.org/software/systemd/man/latest/systemd.mount.html#x-systemd.requires=)
option in /etc/fstab, applying this to every branch path is both
cumbersome and susceptible to errors.
`branches-mount-timeout` will cause mergerfs to first attempt to mount
each branch if the branch appears to be on the same filesystem as the
`mergerfs` mount point and then wait for all branches to become
"mounted." The logic to determine "mounted" is as follows.
1. It is mounted if the branch directory has the extended attribute
`user.mergerfs.branch`
2. It is mounted if the branch directory contains a file named
`.mergerfs.branch`
3. It is **not** mounted if the branch directory has the extended
attribute `user.mergerfs.branch_mounts_here`
4. It is **not** mounted if the branch directory contains
a file named `.mergerfs.branch_mounts_here`
5. It is mounted if the `st_dev` value of the mergerfs mount point is
different from the branch path.
These files and xattrs are used to help `mergerfs` know whether or not
a directory happens to be a branch or is the underlying directory
mount point.
## Paths which appear after startup
The [`branches` resolution process](branches.md#resolution) runs before
this option starts waiting. A missing literal path is retained as a
branch, so a configuration such as `/mnt/hdd/disk0/foobar` can work
when `/mnt/hdd/disk0` is mounted asynchronously and `foobar` only
becomes visible afterward, provided the path then meets one of the
"mounted" conditions above.
For each branch which is not ready, mergerfs first runs `mount` once
with the full branch path as the target and then polls that same path
until the timeout expires. It does not create the path, try to mount
its parent, or rerun `mount`. In the example above, the initial
`mount /mnt/hdd/disk0/foobar` may fail while the path is absent. If
another service mounts `/mnt/hdd/disk0` and
`/mnt/hdd/disk0/foobar` appears and meets one of the "mounted"
conditions before the deadline, mergerfs detects it during polling
and continues.
Globs are different. If `/mnt/hdd/disk0/*` has no matches during
branch resolution, the literal path `/mnt/hdd/disk0/*` is retained.
The mount wait does not expand it again after `/mnt/hdd/disk0`
becomes available. Ensure the parent filesystem is mounted before
mergerfs, configure a literal branch path, or update `branches`
through the runtime API once the paths exist.
**NOTE:** If on a `systemd` based system and using `fstab` it is a
good idea to set the mount option
[x-systemd.mount-timeout](https://www.freedesktop.org/software/systemd/man/latest/systemd.mount.html#x-systemd.mount-timeout=)
to some value longer than `branches-mount-timeout` otherwise `systemd`
might kill `mergerfs` before it finishes waiting.
**NOTE:** The way `mergerfs` attempts to mount the branch is by
calling out to the system command `mount` with the branch as the
target. If that path is configured in `/etc/fstab` as a mount point
then `mount` should attempt to mount it with the settings defined in
`fstab`.
## branches-mount-timeout-fail
Default: `false`
When set to `true` mergerfs will fail entirely after
`branches-mount-timeout` expires without all branches being
mounted. If set to `false` it will simply ignore the mount status of
the branches and continue on. The details will be
[logged](../error_handling_and_logging.md).

View file

@ -0,0 +1,237 @@
# branches
The `branches` argument is a colon (':') delimited list of paths to be
pooled together. It does not matter if the paths are on the same or
different filesystems nor does it matter [the filesystem
type](../faq/compatibility_and_integration.md/#what-filesystems-can-be-used-as-branches)
(within reason). Used and available space metrics will not be
duplicated for paths on the same filesystem and any features which
aren't supported by the underlying filesystem (such as file attributes
or extended attributes) will return the appropriate errors.
Branches currently have two options which can be set. A
[mode](#branch-mode) which impacts whether or not the branch is
included in a policy calculation and a individual
[minfreespace](#minfreespace) value. The values are set by
prepending an `=` at the end of a branch designation and using commas
as delimiters. Example: `/mnt/hdd/disk0=RW,1234`
### branch mode
- RW: (read/write) - Default behavior. Will be eligible in all policy
categories.
- RO: (read-only) - Will be excluded from `create` and `action`
policies. Same as a read-only mounted filesystem would be (though
faster to process).
- NC: (no-create) - Will be excluded from `create` policies. You can't
create on that branch but you can change or delete.
### minfreespace
Same purpose and syntax as the [global option](minfreespace.md) but
specific to the branch. Defaults to the global value.
### resolution
Each colon-delimited branch designation is resolved independently when
the `branches` option is parsed, both at startup and when it is updated
through the runtime API:
1. The path portion is expanded as a glob.
2. If the glob matches one or more directories, each match becomes a
branch.
3. If the glob has no matches, mergerfs logs a notice and keeps the
configured path unchanged as a single, literal branch.
4. mergerfs resolves each resulting path with `realpath`. If that
succeeds, the canonical path is stored. If it fails, typically
because the path does not exist yet, the unchanged path is stored.
5. A path which exists but is not a directory is logged and skipped. A
path which does not exist is logged but retained.
Consequently, a literal branch such as `/mnt/hdd/disk0/foobar` may be
configured before it exists and can become usable after
`/mnt/hdd/disk0` is mounted. Branch resolution is not repeated in the
background, however. If `/mnt/hdd/disk0/*` has no matches when it is
resolved, mergerfs stores the literal path `/mnt/hdd/disk0/*`;
directories which match it later are not discovered automatically.
Update `branches` through the runtime API or restart mergerfs to
resolve the glob again.
### globbing
To make it easier to include multiple branches mergerfs supports
[globbing](http://linux.die.net/man/7/glob). **The globbing tokens
MUST be escaped when using via the shell else the shell itself will
apply the glob itself.**
```
# mergerfs /mnt/hdd/\*:/mnt/ssd/\* /media
```
The above line will use all directories within `/mnt/hdd` and
`/mnt/ssd`.
To have the pool mounted at boot or otherwise accessible from related
tools use `/etc/fstab`.
```
# <file system> <mount point> <type> <options> <dump> <pass>
/mnt/hdd/*:/mnt/ssd/* /media mergerfs minfreespace=16G 0 0
```
**NOTE:** The globbing is done at mount or when updated using the
runtime API. If a new directory is added matching the glob after the
fact it will not be automatically included.
A convenient way to configure branches is to use
[symlinks](../quickstart.md/#etcfstab-w-config-file).
## branch setup
`mergerfs` does **not** require any special setup of branch paths in
order to be used however here are some suggestions.
### layout
When you have a large collection of storage devices, types of storage,
and types of interconnects it can be useful to have a verbose naming
convention. My preference is to create a directory within `/mnt/` for
each major type of storage device and/or interconnect. `hdd` for
traditional hard drives; `ssd` for slower SATA based SSDs; `nvme` for
M.2 or U.2 NVME SSDs; `remote` for NFS, SMB, sshfs, etc.
The mount points within those directories are named after the size of
the storage and its serial number in the case of physical storage and
the hostname and remote filesystem for remote.
```
$ ls -lh /mnt/
total 16K
drwxr-xr-x 8 root root 4.0K Aug 18 2024 hdd
drwxr-xr-x 6 root root 4.0K Oct 8 2024 nvme
drwxr-xr-x 3 root root 4.0K Aug 24 2024 remote
drwxr-xr-x 3 root root 4.0K Jul 14 2024 ssd
$ ls -lh /mnt/hdd/
total 8K
d--------- 2 root root 4.0K Apr 14 15:58 10T-01234567
d--------- 2 root root 4.0K Apr 12 20:51 20T-12345678
$ ls -lh /mnt/nvme/
total 8K
d--------- 2 root root 4.0K Apr 14 16:00 1T-ABCDEFGH
d--------- 2 root root 4.0K Apr 14 23:24 1T-BCDEFGHI
$ ls -lh /mnt/remote/
total 8K
d--------- 2 root root 4.0K Apr 12 20:23 foo-sshfs
d--------- 2 root root 4.0K Apr 12 20:24 bar-nfs
# You can find the serial number of a drive using lsblk
$ lsblk -d -o NAME,PATH,SIZE,SERIAL
NAME PATH SIZE SERIAL
sda /dev/sda 9.1T 01234567
sdb /dev/sdb 18.2T 12345678
nvme0n1 /dev/nvme0n1 953.9G ABCDEFGH
nvme1n1 /dev/nvme1n1 953.9G BCDEFGHI
```
### permissions and mode
#### mount points
To ensure the directory is **only** used as a point to mount another
filesystem it is good to lock it down as much as possible. Be sure to
do this **before** mounting a filesystem to it.
```
$ sudo chown root:root /mnt/hdd/10T-XYZ
$ sudo chmod 0000 /mnt/hdd/10T-XYZ
$ sudo setfattr -n user.mergerfs.branch_mounts_here
$ sudo chattr +i /mnt/hdd/10T-XYZ
```
The extended attribute `user.mergerfs.branch_mounts_here` is used by
the [branches-mount-timeout](branches-mount-timeout.md) option to
recognize whether or not a mergerfs branch path points to the intended
filesystem.
The `chattr` is likely to only work on EXT{2,3,4} filesystems but will
restrict even `root` from modifying the directory or its content but
is still able to be a mount point.
#### mounted filesystems
For those new to Linux, intending to be the primary individual logged
into the system, or simply want to simplify permissions it is
recommended to set the root of mounted filesystems like `/tmp/` is set
to. Owned by `root`, `ugo+rwx` and [sticky
bit](https://en.wikipedia.org/wiki/Sticky_bit) set.
This must be done **after** mounting the filesystem to the target
mount point.
```
$ sudo chown root:root /mnt/hdd/10T-SERIALNUM
$ sudo chmod 1777 /mnt/hdd/10T-SERIALNUM
$ sudo setfattr -n user.mergerfs.branch /mnt/hdd/10T-SERIALNUM
```
### formatting
While even less relevant to mergerfs than the details above the topic
does com up regularly with mergerfs users. When it comes to
partitioning and formatting it is suggested to keep things
simple. Most users of mergerfs will be using the whole drive capacity
and as such have a singular partition and filesystem on that
partition. Something many people don't realize is that the partition
is not necessary and actually can become problematic.
Rather than creating paritions just format the block device. Let's use
`/dev/sda` as an example.
```
$ lsblk -d -o NAME,PATH,SERIAL /dev/sda
NAME PATH SERIAL
sda /dev/sda 01234567
$ sudo mkfs.ext4 -m0 -L 01234567 /dev/sda
mke2fs 1.47.0 (5-Feb-2023)
Discarding device blocks: done
Creating filesystem with 262144 4k blocks and 65536 inodes
Filesystem UUID: ede8bf96-9aff-464e-a4fb-a4ab8a197cd7
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
```
You can then use the serial number as the identifier in `fstab`.
```
# <file system> <mount point> <type> <options> <dump> <pass>
LABEL=01234567 /mnt/hdd/10TB-01234567 auto nofail 0 2
```
Benefits of doing it this way?
* One less thing (partitions) to configure and worry about.
* Guarantees alignment of blocks
* Makes it easier to use the drive with different enclosures. Some
SATA to USB adapters use 4K blocks while the drive itself is using
512b. If you create partitions with one block size and move the
drive to a controller that uses the other the offset on the device
where the filesystem starts will be misinterpreted. It is possible
to manually fix this but it isn't well documented and avoidable.

193
mkdocs/docs/config/cache.md Normal file
View file

@ -0,0 +1,193 @@
# caching
## cache.files
Controls how [page caching](https://en.wikipedia.org/wiki/Page_cache)
works for mergerfs itself. Not the underlying filesystems.
* `cache.files=off`: Disables page caching for mergerfs.
* `cache.files=partial`: Enables page caching. Files are cached
while open.
* `cache.files=full`: Enables page caching. Files are cached across
opens.
* `cache.files=auto-full`: Enables page caching. Files are cached
across opens if mtime and size are unchanged since previous
open. Cache is dropped if mtime or size change on open.
* `cache.files=per-process`: Enable page caching (equivalent to
`cache.files=partial`) only for processes whose 'comm' name matches
one of the values defined in cache.files.process-names. If the name
does not match the file open is equivalent to `cache.files=off`.
Generally, enabling the page cache actually *harms*
performance[^1]. In part because it can lead to buffer bloat due to
the kernel caching both the underlying filesystem's file content as
well as the file through mergerfs. However, if you want to confirm
performance differences it is recommended that you perform some
benchmark to confirm which option works best for your setup.
Why then would you want to enable page caching if it consumes ~2x the
RAM as normal and is on average slower? Because it is the only way to
support
[mmap](https://man7.org/linux/man-pages/man2/mmap.2.html). `mmap` is a
way for programs to treat a file as if it is a contiguous RAM buffer
which is regularly used by a number of programs such as those that
leverage **sqlite3**. Despite `mmap` not being supported by all
filesystems it is unfortunately common for software to not have an
option to use regular file IO instead of `mmap`.
The good thing is that in Linux v6.6[^2] and above FUSE can now
transparently enable page caching when mmap is requested. This means
it should be safe to set `cache.files=off`. However, on Linux v6.5 and
below you will need to configure `cache.files` as you need.
If [passthrough.io](passthrough.md) is enabled so must page
caching. mergerfs will set `cache.files=auto-full` if `passthrough.io`
is enabled. And when using `passthrough.io` the there is no double
page caching since it is in fact passing through the IO.
[^1]: This is not unique to mergerfs and affects all FUSE
filesystems. It is something that the FUSE community hopes to
investigate at some point but as of early 2025 there are a number
of major reworking going on with FUSE which needs to be finished
first.
[^2]: [https://kernelnewbies.org/Linux_6.6#FUSE](https://kernelnewbies.org/Linux_6.6#FUSE)
## cache.entry
* `cache.entry=UINT`: Sets the number of seconds to cache
entry queries. Defaults to `1`.
The kernel must ask mergerfs about the existence of files. The entry
cache caches that those details which limits the number of requests
sent to mergerfs.
The risk of setting this value, as with most any cache, is related to
[out-of-band](https://en.wikipedia.org/wiki/Out-of-band) changes. If
the filesystems are changed outside mergerfs there is a risk of files
which have been removed continuing to show as available. It will fail
gracefully if a phantom file is actioned on in some way so there is
little risk in setting the value much higher. Especially if there are
no out-of-band changes.
## cache.negative-entry
* `cache.negative-entry=UINT`: Sets the number of seconds to cache
negative entry queries. Defaults to `1`.
This is a cache for negative entry query responses. Such as when a
file which does not exist is referenced.
The risk of setting this value, as with most any cache, is related to
[out-of-band](https://en.wikipedia.org/wiki/Out-of-band) changes. If
the filesystems are changed outside mergerfs there is a risk of files
which have been added outside mergerfs not appearing correctly till
the cache entry times out if there had been a request for the same
name within mergerfs which didn't exist. This is mostly an
inconvenience.
## cache.attr
* `cache.attr=UINT`: Sets the number of seconds to cache file
attributes. Defaults to `1`.
This is a cache for file attributes and metadata such as that which is
collected by the
[stat](https://man7.org/linux/man-pages/man2/stat.2.html) system call
which is used when you run commands such as `find` or `ls -lh`.
As with other caches the risk of enabling the attribute cache is if
changes are made to the file out-of-band there could be
inconsistencies between the actual file and the cached details which
could result in different issues depending on how the data is used. If
the simultaneous writing of a file from inside and outside is unlikely
then you should be safe. That said any simultaneous, uncoordinated
manipulation of a file can lead to unexpected results.
## cache.statfs
* `cache.statfs=UINT`: Sets the number of seconds to cache `statfs`
calls used by policies. Defaults to `0`.
A number of policies require looking up the available space of the
branches being considered. This is accomplished by calling
[statfs](https://man7.org/linux/man-pages/man2/statfs.2.html). This
call however is a bit expensive so this cache reduces the overhead by
limiting how often the calls are actually made.
This will mean that if the available space of branches changed
somewhat rapidly there is a risk of `create` or `mkdir` calls made
within the timeout period ending up on the same branch. This however
should even itself out over time.
## cache.symlinks
* `cache.symlinks=BOOL`: Enable kernel caching of symlink
values. Defaults to `false`.
As of Linux v4.20 there is an ability to cache the value of symlinks
so that the kernel does not need to make a request to mergerfs every
single time a
[readlink](https://man7.org/linux/man-pages/man2/readlink.2.html)
request is made. While not a common usage pattern, if software very
regularly queries symlink values, the use of this cache could
significantly improve performance.
mergerfs will not error if the kernel used does not support symlink
caching.
As with other caches the main risk in enabling it is if you are
manipulating symlinks from both within and without the mergerfs
mount. Should the value be changed outside of mergerfs then it will
not be reflected in the mergerfs mount till the cached value is
invalidated.
## cache.readdir
* `cache.readdir=BOOL`: Enable kernel caching of readdir
results. Defaults to `false`.
As of Linux v4.20 it supports readdir caching. This can have a
significant impact on directory traversal. Especially when combined
with entry (`cache.entry`) and attribute (`cache.attr`) caching. If
the kernel doesn't support readdir caching setting the option to true
has no effect. This option is configurable at runtime via xattr
user.mergerfs.cache.readdir.
## cache.writeback
* `cache.writeback=BOOL`: Enable writeback cache. Defaults to `false`.
When `cache.files` is enabled the default is for it to perform
writethrough caching. This behavior won't help improve performance as
each write still goes one for one through the filesystem. By enabling
the FUSE writeback cache small writes *may* be aggregated by the
kernel and then sent to mergerfs as one larger request. This can
greatly improve the throughput for apps which write to files
inefficiently. The amount the kernel can aggregate is limited by the
size of a FUSE message. Read the [fuse-msg-size](fuse-msg-size.md)
section for more details.
There is a side effect as a result of enabling writeback
caching. Underlying files won't ever be opened with O_APPEND or
O_WRONLY. The former because the kernel then manages append mode and
the latter because the kernel may request file data from mergerfs to
populate the write cache. The O_APPEND change means that if a file is
changed outside of mergerfs it could lead to corruption as the kernel
won't know the end of the file has changed. That said any time you use
caching you should keep from writing to the same file outside of
mergerfs at the same time.
Note that if an application is properly sizing writes then writeback
caching will have little or no effect. It will only help with writes
of sizes below the FUSE message size (128K on older kernels, 1M on
newer). Even then its effectiveness might not be great. Given the side
effects of enabling this feature it is recommended that its benefits
be proved out with benchmarks.

View file

@ -0,0 +1,26 @@
# Deprecated Options
These are old, deprecated options which may no longer have any
function or have been replaced. **They should not be used.**
* **allow_other**: mergerfs v2.35.0 and above sets this FUSE option
automatically if running as root.
* **async_read**: Use `async-read=true`.
* **atomic_o_trunc**: Does nothing.
* **attr_timeout**: Use [cache.attr](cache.md).
* **auto_cache**: Use [cache.files=auto-full](cache.md).
* **big_writes**: Does nothing.
* **direct_io**: Use [cache.files=off](cache.md).
* **entry_timeout**: Use [cache.entry](cache.md).
* **hard_remove**: Does nothing.
* **kernel_cache**: Use [cache.files=full](cache.md).
* **negative_entry**: Use [cache.negative-entry](cache.md).
* **remember**: Use `never-forget-nodes`.
* **remember-nodes**: Use `never-forget-nodes`.
* **noforget**: Use `never-forget-nodes`.
* **nonempty**: Does nothing.
* **splice_move**: Does nothing.
* **splice_read**: Does nothing.
* **splice_write**: Does nothing.
* **sync_read**: Use `async-read=false`.
* **use_ino**: Use [inodecalc](inodecalc.md).

View file

@ -0,0 +1,15 @@
# export-support
* `export-support=true|false`
* Default: `true`
In theory, this flag should not be exposed to the end user. It is a
low-level FUSE flag which indicates whether or not the kernel can send
certain kinds of messages to it for the purposes of using it with
NFS. mergerfs does support these messages but due to bugs and quirks
found in the kernel and mergerfs this option is provided just in case
it is needed for debugging.
Given that this flag is set when the FUSE connection is first
initiated it is not possible to change during run time.

View file

@ -0,0 +1,21 @@
# flush-on-close
By default, FUSE would issue a flush before the release of a file
descriptor. This was considered a bit aggressive and a feature added
to give the FUSE server the ability to choose when that happens.
* `flush-on-close=always`
* `flush-on-close=never`
* `flush-on-close=opened-for-write`
* Defaults to `opened-for-write`.
For now it defaults to `opened-for-write` which is less aggressive
than the behavior before this feature was added. It should not be a
problem because the flush is really only relevant when a file is
written to. Given flush is irrelevant for many filesystems in the
future a branch specific flag may be added so only files opened on a
specific branch would be flushed on close.
## References
* [https://lkml.kernel.org/linux-fsdevel/20211024132607.1636952-1-amir73il@gmail.com/T/](https://lkml.kernel.org/linux-fsdevel/20211024132607.1636952-1-amir73il@gmail.com/T/)

View file

@ -0,0 +1,23 @@
# follow-symlinks
This feature, when enabled, will cause symlinks to be interpreted by
mergerfs as their target.
When there is a getattr/stat request for a file mergerfs will check if
the file is a symlink and depending on the `follow-symlinks` setting
will replace the information about the symlink with that of that which
it points to.
When unlink'ing or rmdir'ing the followed symlink it will remove the
symlink itself and not that which it points to.
* `follow-symlinks=never`: Behave as normal. Symlinks are treated as such.
* `follow-symlinks=directory`: Resolve symlinks only which point to directories.
* `follow-symlinks=regular`: Resolve symlinks only which point to regular files.
* `follow-symlinks=all`: Resolve all symlinks to that which they point
to. Symlinks which do not point to anything are left as is.
* Defaults to `never`.
**WARNING:** This feature should be considered experimental. There
might be edge cases yet found. If you find any odd behaviors please
file a ticket on [github](https://github.com/trapexit/mergerfs/issues/new?assignees=&labels=bug%2C+investigating&projects=&template=bug_report.md&title=).

View file

@ -0,0 +1,43 @@
# func.readdir
* type: `STR`
* default: `seq`
* examples: `func.readdir=seq`, `func.readdir=cor:4`
`readdir` has policies to control how to read directory content.
| Policy | Description |
| ------ | ----------- |
| seq | "sequential" : Iterate sequentially over branches in the order defined in `branches`. This is the default and traditional behavior found prior to the readdir policy introduction. This will be increasingly slower as more branches are added to the pool. Especially if needing to wait for drives to spin up or network filesystems to respond. |
| cosr:N:M | "concurrent open, sequential read" : Concurrently open branch directories using a thread pool and process them in the order defined in `branches`. This keeps memory and CPU usage low while also reducing the time spent waiting on branches to respond. `N` is the number of threads. If negative it will be the core count divided by `abs(N)`. `M` is the queue depth. If either value is `0` it will be decided based on system configuration. |
| cosr:N | cosr:N:M with M = 0 |
| cosr | cosr:N:M with N = 0 and M = 0 |
| cor:N:M | "concurrent open and read" : Concurrently open branch directories and immediately start reading their contents using a thread pool. This will result in slightly higher memory and CPU usage but reduced latency. Particularly when using higher latency / slower speed network filesystem branches. Unlike `seq` and `cosr` the order of files could change due the async nature of the thread pool. This should not be a problem since the order of files returned in not guaranteed. `N` is the number of threads. If negative it will be the core count divided by `abs(N)`. `M` is the queue depth. If either value is `0` it will be decided based on system configuration. |
| cor:N | cosr:N:M with M = 0 |
| cor | cosr:N:M with N = 0 and M = 0 |
Keep in mind that `readdir` mostly just provides a list of file names
in a directory and possibly some basic metadata about said files. To
know details about the files, as one would see from commands like
`find` or `ls`, it is required to call `stat` on the file which is
controlled by `fuse.getattr`.
Until Linux v6.16, despite being able to change the size of FUSE
messages, `readdir` requests were limited to 1 page (4KiB) in size per
message. This limitation limited throughput and therefore performance
of the `readdir` call. In v6.16 that was changed to be able to grow to
the [fuse-msg-size](fuse-msg-size.md) which allows a lot more data to
be sent per request and therefore much better performance in certain
situations.
## Technical Details
* On Linux
[getdents](https://man7.org/linux/man-pages/man2/getdents.2.html) is
used instead of
[readdir](https://man7.org/linux/man-pages/man2/readdir.2.html) in
order to leverage larger buffers for better performance on larger
directory reads as well as have more control in concurrent policies.
* [readdir](https://man7.org/linux/man-pages/man2/readdir.2.html) is
used on FreeBSD.

View file

@ -0,0 +1,150 @@
# functions, categories and policies
The POSIX filesystem API is made up of a number of functions. `creat`,
`stat`, `chown`, etc. For ease of configuration in mergerfs, most of
the core functions are grouped into 3 categories: `action`, `create`,
and `search`. These functions and categories can be assigned a policy
which dictates which branch is chosen when performing that
function. IE. When an application requests that a file or directory is
created how should mergerfs decide which branch to choose to attempt
the create? That is the policy.
Some functions, listed in the category `N/A` below, can not be
assigned the normal policies because they are directly related to a
file which has already been opened.
## Functions and their Category classifications
| Category | Functions |
| -------- | --------- |
| action | chmod, chown, link, removexattr, rename, rmdir, setxattr, truncate, unlink, utimens |
| create | create, mkdir, mknod, symlink |
| search | access, getattr, getxattr, ioctl (directories), listxattr, open, readlink |
| N/A | fchmod, fchown, futimens, ftruncate, fallocate, fgetattr, fsync, ioctl (files), read, readdir, release, statfs, write, copy_file_range |
In cases where something may be searched for (such as a path to clone)
`getattr` will usually be used.
## Policies
See below for [available policies and their descriptions](#policy-descriptions).
A policy is an algorithm designed to select one or more branches for a
function to operate on.
Policies do not actually manage the filesystem or layout. They are
strictly responsible for deciding which files or branches will be
worked on in relation to the function being performed. Once the branch
is chosen other parts of the system does what is necessary to
accomplish the function. Such as the cloning of directories between
branches.
When using policies which are based on a branch's available space the
branch base path provided is used. Not the full path to the file or
directory in question. Meaning that mounts within the branch will not
be considered in the space calculations.
**NOTE:** While any policy can be assigned to a function or category,
some may not be very useful in practice. For instance: `rand` (random)
may be useful for file creation but could lead to very odd behavior if
used for `chmod` if there were more than one copy of the file. Unless
users find this flexibility useful it will likely be removed in the
future.
## Filtering
Most policies search branches and create a list of files / paths for
functions to work on. The policy is responsible for filtering and
sorting the branches. Filters include [minfreespace](minfreespace.md),
whether or not a branch is mounted read-only, and the branch mode
(RO,NC,RW). These filters are applied across most policies.
- No `search` function policies filter.
- All `action` function policies filter out branches which are
mounted **read-only** or mode is **RO (read-only)**.
- All `create` function policies filter out branches which are
mounted **read-only**, mode **RO (read-only)** or **NC (no
create)**, or has available space less than
[minfreespace](minfreespace.md).
Policies may have their own additional filtering such as those that
require relative paths to be present.
If all branches are filtered an error will be returned. Typically
`EROFS` (read-only filesystem) or `ENOSPC` (no space left on
device) depending on the most recent reason for filtering a
branch.
If `create`, `mkdir`, `mknod`, or `symlink` fail with `EROFS`
or other fundamental errors then mergerfs will mark any branch found
to be read-only as such (IE will set the mode `RO`) and will rerun the
policy and try again. This is mostly for `ext4` filesystems that can
suddenly become read-only when it encounters an error.
## Path Preservation
Policies, as described below, are of two basic classifications. `path
preserving` and `non-path preserving`.
All policies which start with `ep` (`epff`, `eplfs`, `eplus`, `epmfs`,
`eprand`) are `path preserving`. `ep` stands for `existing path`.
A path preserving policy will only consider branches where the relative
path being accessed already exists.
With the `msp` or `most shared path` policies they are defined as
`path preserving` for the purpose of controlling `link` and `rename`'s
behaviors since `ignorepponrename` is available to disable that
behavior.
## Policy descriptions
A policy's behavior differs, as mentioned above, based on the function
it is used with. Sometimes it really might not make sense to even
offer certain policies because they are literally the same as others
but it makes things a bit more uniform.
| Policy | Description |
| --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| pfrd (percentage free random distribution) | Selects a branch randomly, with the probability of selection proportional to its available space relative to the total available space across all branches. For instance, if Branch A has 100 GB free and Branch B has 50 GB free, Branch A is twice as likely to be chosen. |
| rand (random) | Calls **all** and then randomizes. Returns 1 branch. |
| mfs (most free space) | Pick the branch with the most available free space. |
| ff (first found) | Given the order of the branches, as defined at mount time or configured at runtime, act on the first one found. |
| lfs (least free space) | Pick the branch with the least available free space. |
| lup (least used percent) | Pick the branch with the least used percentage of space |
| lus (least used space) | Pick the branch with the least used space. |
| all | Search: For **mkdir**, **mknod**, and **symlink** it will apply to all branches. **create** works like **ff**. |
| msppfrd (most shared path, percentage free random distribution) | Like **eppfrd** but if it fails to find a branch it will try again with the parent directory. Continues this pattern till finding one. |
| mspmfs (most shared path, most free space) | Like **epmfs** but if it fails to find a branch it will try again with the parent directory. Continues this pattern till finding one. |
| msplfs (most shared path, least free space) | Like **eplfs** but if it fails to find a branch it will try again with the parent directory. Continues this pattern till finding one. |
| msplus (most shared path, least used space) | Like **eplus** but if it fails to find a branch it will try again with the parent directory. Continues this pattern till finding one. |
| eppfrd (existing path, percentage free random distribution) | Like **pfrd** but limited to existing paths. |
| epmfs (existing path, most free space) | Of all the branches on which the relative path exists choose the branch with the most free space. |
| eprand (existing path, random) | Calls **epall** and then randomizes. Returns 1. |
| epff (existing path, first found) | Given the order of the branches, as defined at mount time or configured at runtime, act on the first one found where the relative path exists. |
| eplfs (existing path, least free space) | Of all the branches on which the relative path exists choose the branch with the least free space. |
| eplus (existing path, least used space) | Of all the branches on which the relative path exists choose the branch with the least used space. |
| epall (existing path, all) | For **mkdir**, **mknod**, and **symlink** it will apply to all found. **create** works like **epff** (but more expensive because it doesn't stop after finding a valid branch). |
| newest | Pick the file / directory with the largest mtime. |
**NOTE:** If you are using an underlying filesystem that reserves
blocks such as ext2, ext3, or ext4 be aware that mergerfs respects the
reservation by using `f_bavail` (number of free blocks for
unprivileged users) rather than `f_bfree` (number of free blocks) in
policy calculations. **df** does NOT use `f_bavail`, it uses
`f_bfree`, so direct comparisons between **df** output and mergerfs'
policies is not appropriate.
## Defaults
| Category | Policy |
| -------- | ------ |
| action | epall |
| create | pfrd |
| search | ff |

View file

@ -0,0 +1,50 @@
# fuse-msg-size
* type: `UINT|SIZE`
* default: `1M`
* example: `fuse-msg-size=1M`
* If the value is a `SIZE` in the form of `xB`, `xK`, `xM`, `xG`, or
`xT` then it will choose the closest multiple of the system page
size. If the value is just an integer without a size multipler suffix
then it is treated as a page count
FUSE applications communicate with the kernel over a special character
device: `/dev/fuse`. A large portion of the overhead associated with
FUSE is the cost of going back and forth between user space and kernel
space over that device. Generally speaking, the fewer trips needed the
better the performance will be. Reducing the number of trips can be
done a number of ways. Kernel level caching and increasing message
sizes being two significant ones. When it comes to reads and writes if
the message size is doubled the number of trips are approximately
halved.
In Linux v4.20 a new feature was added allowing the negotiation of the
max message size. Since the size is in multiples of
[pages](https://en.wikipedia.org/wiki/Page_(computer_memory)) the
feature is called `max_pages`. In versions of Linux prior to v6.13
there is a maximum `max_pages` value of 256 (1MiB) and minimum of 1
(4KiB). In [Linux
v6.13](https://web.git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=2b3933b1e0a0a4b758fbc164bb31db0c113a7e2c)
and above the max value supported by the kernel can range from 1
(4KiB) to 65535 (~256MiB) (assuming a page size of 4KiB.) The default
used by Linux >= 4.20, and hard coded value used before 4.20, is 32
(128KiB). In mergerfs it is referred to as `fuse-msg-size` to make it
clear what it impacts and provide some abstraction.
If the `fuse-msg-size` value provided is more than the system wide
maximum mergerfs will attempt to increase the system wide value to keep
the user from needing to set the value using `sysctl`,
`/etc/sysctl.conf`, or `/proc/sys/fs/fuse/max_pages_limit`.
The main downside to increasing the value is that memory usage will
increase approximately relative to the number of [processing
threads](threads.md) configured. Keep this in mind for systems with
lower amounts of memory like most SBCs. Performance improvements seem
to peak around 4MiB.
On kernels before v4.20 the option has no effect. On kernels between
v4.20 and v6.13 the max value is 256. On kernels >= v6.13 the maximum
value is 65535.
NOTE: If you intend to enable `cache.files` you should also set
[readahead](readahead.md) to match `fuse-msg-size`.

View file

@ -0,0 +1,80 @@
# inodecalc
[Inodes](https://en.wikipedia.org/wiki/Inode) (`st_ino`) are unique
identifiers for files within a filesystem. Each mounted filesystem
also has a (typically) unique device ID (`st_dev`) as well and
together they can uniquely identify a file on the whole of the
system. Entries on the same device with the same inode are (generally)
in fact references to the same underlying file. It is a many to one
relationship between names and an inode. Directories, however, do not
have multiple links on most systems due to the complexity that would
add.
FUSE allows the server (in this case `mergerfs`) to set inode values
but not device IDs. Creating an inode value is somewhat complex in
mergerfs' case as files aren't really in its control. If a policy
changes what directory or file is to be selected or changes are made
to branches out of band it becomes unclear what value should be
used. Most software does not to care what the values are but those
that do often break if a value changes unexpectedly. For instance: the
tool `find` will abort a directory walk if it sees a directory inode
change. NFS can return stale handle errors if the inode changes
out-of-band. File dedup tools will usually leverage device ids and
inodes as a shortcut in searching for duplicate files and would resort
to full file comparisons should it find different inode values.
mergerfs offers multiple ways to calculate the inode in hopes of
covering different usecases.
* `passthrough`: Passes through the underlying inode value. Mostly
intended for testing as using this does not address any of the
problems mentioned above and could confuse file deduplication
software as inodes from different filesystems can be the same.
* `path-hash`: Hashes the relative path of the entry in question. The
underlying file's values are completely ignored. This means the
inode value will always be the same for that file path. This is
useful when using NFS and you make changes out of band such as copy
data between branches. This also means that entries that do point to
the same file will not be recognizable via inodes. That does not
mean hard links don't work. They will.
* `path-hash32`: 32bit version of path-hash.
* `devino-hash`: Hashes the branch path and inode of the underlying
entry. This won't prevent issues with NFS should the policy pick a
different file or files move out of band but will present the same
inode for underlying files that share the same inode. Previous
releases of mergerfs used the device ID but that changes on
reboot. The downside to using the branch path is inodes for files on
the same underlying filesystem will be different.
* `devino-hash32`: 32bit version of devino-hash.
* `hybrid-hash`: Performs path-hash on directories and devino-hash on
other file types. Since directories can't have hard links the static
value won't make a difference and the files will get values useful
for finding duplicates. Probably the best to use if not using
NFS. As such it is the default.
* `hybrid-hash32`: 32bit version of hybrid-hash.
32bit versions are provided as there is some software which does not
handle 64bit inodes well.
While there is a risk of hash collision in tests of a couple of
million entries there were zero collisions. Unlike a typical
filesystem FUSE filesystems can reuse inodes and not refer to the same
entry. The internal identifier used to reference a file in FUSE is
different from the inode value presented. The former is the nodeid and
is actually a tuple of 2 64bit values: nodeid and generation. This
tuple is not client facing. The inode that is presented to the client
is passed through the kernel uninterpreted.
From FUSE docs for `use_ino`:
> Honor the st_ino field in the functions getattr() and
> fill_dir(). This value is used to fill in the st_ino field
> in the stat(2), lstat(2), fstat(2) functions and the d_ino
> field in the readdir(2) function. The filesystem does not
> have to guarantee uniqueness, however some applications
> rely on this value being unique for the whole filesystem.
> Note that this does *not* affect the inode that libfuse
> and the kernel use internally (also called the "nodeid").
**NOTE:** As of version 2.35.0 the use_ino option has been
removed. mergerfs should always be managing inode values.

Some files were not shown because too many files have changed in this diff Show more