summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
...
* passthrough_hp: Avoid a bit code dup in readdirBernd Schubert2023-01-131-14/+9
| | | | Just a slight code simplification.
* passthrough_hp: Add options for clone_fd, max_threads, daemonizeBernd Schubert2023-01-133-2/+40
| | | | | | | This is useful for benchmarking. Note: This changes behavior - passthrough_hp runs in background by default now.
* Fix loading of FUSE modulesGoswin von Brederlow2023-01-131-3/+3
| | | | | | | | | | | | | dlsym returns the address of the module factory symbol, not the actual function (#722) pointer. Change the type of `factory` to `fuse_module_factory_t*` to reflect this and then dereference it when registering the module. This is a followup to d92bf83, which introduced a NULL pointer dereference when dlsym returns NULL, and 8ec7fd9, which reverted it back to not dereferencing the symbol at all. Fixes: #721 Co-authored-by: Goswin von Brederlow <brederlo@q-leap.de>
* Support application-defined I/O functions for FUSE fdTofik Sonono2023-01-109-13/+567
| | | | | | The io for FUSE requests and responses can now be further customized by allowing to write custom functions for reading/writing the responses. This includes overriding the splice io. The reason for this addition is that having a custom file descriptor is not sufficient to allow custom io. Different types of file descriptor require different mechanisms of io interaction. For example, some file descriptor communication has boundaries (SOCK_DGRAM, EOF, etc...), while other types of fd:s might be unbounded (SOCK_STREAMS, ...). For unbounded communication, you have to read the header of the FUSE request first, and then read the remaining packet data. Furthermore, the one read call does not necessarily return all the data expected, requiring further calls in a loop.
* Test for fuse_lowlevel_notify_expire_entry.HereThereBeDragons2023-01-062-6/+22
| | | | This test is too simple to check for all functionalities of notify_expire as it always successfully passes when libfuse supports the function (even if kernel does not support it - it just takes it as notify_inval)
* adding comments and capability discovery, enum for flags moved to top of fileHereThereBeDragons2023-01-064-4/+56
|
* upgrade of fuse_kernel.h based on Miklos expire_only kernel patch ↵HereThereBeDragons2023-01-061-11/+190
| | | | https://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse.git/commit/?h=for-next&id=53e949edb7692dce02220eba926c9d75ecbb47f7
* Initial patch provided by Miklos Szeredi <mszeredi@redhat.com>HereThereBeDragons2023-01-064-5/+30
|
* Fixes when HAVE_LIBC_VERSIONED_SYMBOLS is not definedBernd Schubert2023-01-043-8/+42
| | | | | | | | | fuse_loop_mt and fuse_new had not been defined when HAVE_LIBC_VERSIONED_SYMBOLS had not been set and additionally, fuse_new_31 was missing in the version script and was therefore an unusable symbol. This also adds a test for unset HAVE_LIBC_VERSIONED_SYMBOLS.
* convert __APPLE__ and __ULIBC__ to HAVE_LIBC_VERSIONED_SYMBOLSBernd Schubert2023-01-045-25/+58
| | | | | | | | | | | In fact only gnu-libc fully supports symbol versioning, so it is better to have a generic macro for it. This also allows to manually disable symbol version and allows to run tests with that configuration on gnu-libc. That testing will still not catch compat issues, but least ensures the code can compile. Testing for __APPLE__ and __ULIBC__ is now done by meson. More of such checks can be added by people using other libcs.
* Fix ublic/apple build for the fuse_parse_cmdline ABI symbolBernd Schubert2023-01-043-13/+57
| | | | | | | | | | For __APPLE__ and __ULIBC__, which are assumed to not support versioned symbols, helper.c has a compat ABI symbol for fuse_parse_cmdline(). However that ABI symbol was conflicting with the API macro (which redirects to the right API function for recompilations against current libfuse). Additionally the parameter 'opts' had a typo and was called 'out_opts'.
* Remove partial locking of paths when using high-level APIKyle Lippincott2023-01-041-54/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | As described in https://github.com/libfuse/libfuse/issues/695 and below, partial locking of paths can cause a deadlock. Partial locking was added to prevent starvation, but it's unclear what specific cases of starvation were of concern. As far as I was able to determine, since we support reader locks that give priority to writers (to prevent starvation), this means that to starve the queue element, we'd need a constant stream of queued requests that lock the path for write. Write locks are used when the element is being (potentially) removed, so this stream of requests that starve the `rename` or `lock` operations seems unlikely. ### Summarizing issue #695 The high-level API handles locking of the node structures it maintains to prevent concurrent requests from deleting nodes that are in use by other requests. This means that requests that might remove these structs (`rmdir`, `rename`, `unlink`, `link`) need to acquire an (internally managed - not pthread) exclusive lock before doing so. In the case where the lock is already held (for read or for write), the operation is placed onto a queue of waiters. On every unlock, the queue is reinspected for any element that might now be able to make progress. Since `rename` and `link` involve two paths, when added to the queue, a single queue entry requires that we lock two different paths. There was, prior to this change, support for partially locking the first queue element if it had two paths to lock. This partial locking can cause a deadlock: - set up a situation where the first element in the queue is partially locked (such as by holding a reader lock on one of the paths being renamed, but not the other). For example: `/rmthis/foo/foo.txt` [not-yet-locked] and `/rmthis/bar/bar.txt` [locked] - add an `rmdir` for an ancestor directory of the not-yet-locked path to the queue. In this example: `/rmthis` After getting into this situation, we have the following `treelock` values: - `/rmthis`: 1 current reader (due to the locked `/rmthis/bar/bar.txt`), one waiting writer (`rmdir`): no new readers will acquire a read lock here. - `/rmthis/bar`: 1 reader (the locked `/rmthis/bar/bar.txt`) - `/rmthis/bar/bar.txt`: 1 writer (the locked `/rmthis/bar/bar.txt`) This is deadlocked, because the partial lock will never be able to be completely locked, as doing so would require adding a reader lock on `/rmthis`, and that will be rejected due to write lock requests having priority -- until the writer succeeds in locking it, no new readers can be added. However, the writer (the `rmdir`) will never be able to acquire its write lock, as the reader lock will never be dropped -- there's no support for downgrading a partially locked element to be unlocked, the only state change that's allowed involves it becoming completely locked.
* Move try_get_path2 earlier in the fileKyle Lippincott2023-01-041-21/+21
|
* Revert "libfuse custom communication interface"Nikolaus Rath2023-01-023-24/+0
| | | | This reverts commit 777663953382925c7403f0560c28ec9bbd14d7be.
* update mount.c, in order to pass through -n.Ciaran2023-01-021-0/+1
| | | | autofs uses automount, which calls fuse, during an sshfs call. fuse complains about -n being an unknown option (ref. https://github.com/libfuse/libfuse/issues/715) this one line edit provides the command to be accepted, and pass through, allowing autofs-automount to operate on the mount, even though it is already in the mtab, given the nature of autofs/automount.
* Make it work even if max_idle_threads is set to 0Zhansong Gao2022-12-011-1/+1
| | | | | | | | | It may happen that none of the worker threads are running if max_idle_threads is set to 0 although few people will do this. Adding a limit of keeping at least one worker thread will make our code more rigorous. Signed-off-by: Zhansong Gao <zhsgao@hotmail.com>
* libfuse custom communication interfacey2022-11-153-0/+24
| | | | libfuse can now be used without having a mount interface.
* Fix the fuse_parse_cmdline@FUSE_3.0 ABI compat symbolBernd Schubert2022-09-111-1/+1
| | | | | | | | | There was a simple typo and sym1 didn't match the function name with the older __asm__(".symver " sym1 "," sym2) way to define ABI compatibility. Witht the newer "__attribute__ ((symver (sym2)))" sym1 is not used at all and in manual testing the issue didn't come up therefore.
* Released 3.12.0fuse-3.12.0Nikolaus Rath2022-09-082-52/+23
|
* Add option to specify init script locationFina Wilke2022-09-083-13/+15
| | | | Also allows to disable the installation if desired
* Use destroy_req instead of free to destroy fuse_reqFrank Dinoff2022-09-081-1/+3
| | | | | | If we get the interrupt before the fuse op, the fuse_req is deleted without decrementing the refcount on the cloned file descriptor. This leads to a leak of the cloned /dev/fuse file descriptor.
* Add summary of changes regarding 'max_threads' to ChangeLog.rstBernd Schubert2022-09-041-0/+55
| | | | | Update the change log file with the summary of API changes related to the 'max_threads' changes.
* fuse_session_loop_mt: Accept a NULL config - use defaultsBernd Schubert2022-09-042-8/+25
| | | | | | If an application does not want to bother with the session and wants to keep defaults, it can now just pass a NULL as config parameter.
* fuse-loop/fuse_do_work: Avoid lots of thread creations/destructionsBernd Schubert2022-09-047-14/+117
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | On benchmarking metadata operations with a single threaded bonnie++ and "max_idle_threads" limited to 1, 'top' was showing suspicious 160% cpu usage. Profiling the system with flame graphs showed that an astonishing amount of CPU time was spent in thread creation and destruction. After verifying the code it turned out that fuse_do_work() was creating a new thread every time all existing idle threads were already busy. And then just a few lines later after processing the current request it noticed that it had created too many threads and destructed the current thread. I.e. there was a thread creation/destruction ping-pong. Code is changed to only create new threads if the max number of threads is not reached. Furthermore, thread destruction is disabled, as creation/destruction is expensive in general. With this change cpu usage of passthrough_hp went from ~160% to ~80% (with different values of max_idle_threads). And bonnie values got approximately faster by 90%. This is a with single threaded bonnie++ bonnie++ -x 4 -q -s0 -d <path> -n 30:1:1:10 -r 0 Without this patch, using the default max_idle_threads=10 and just a single bonnie++ the thread creation/destruction code path is not triggered. Just one libfuse and one application thread is just a corner case - the requirement for the issue was just n-application-threads >= max_idle_threads. Signed-off-by: Bernd Schubert <bschubert@ddn.com>
* API update for fuse_loop_config additionsBernd Schubert2022-09-0413-48/+278
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | struct fuse_loop_config was passed as a plain struct, without any version identifer. This had two implications 1) Any addition of new parameters required a FUSE_SYMVER for fuse_session_loop_mt() and fuse_loop_mt() as otherwise a read beyond end-of previous struct size might have happened. 2) Filesystems also might have been recompiled and the developer might not have noticed the struct extensions and unexpected for the developer (or people recomliling the code) uninitialized parameters would have been passed. Code is updated to have struct fuse_loop_config as an opaque/private data type for file systems that want version 312 (FUSE_MAKE_VERSION(3, 12)). The deprecated fuse_loop_config_v1 is visible, but should not be used outside of internal conversion functions File systems that want version >= 32 < 312 get the previous struct (through ifdefs) and the #define of fuse_loop_mt and fuse_session_loop_mt ensures that these recompiled file systems call into the previous API, which then converts the struct. This is similar to existing compiled applications when just libfuse updated, but binaries it is solved with the FUSE_SYMVER ABI compact declarations. Signed-off-by: Bernd Schubert <bschubert@ddn.com>
* Revert "Increase meson min version and avoid get_pkgconfig_variable warning ↵Nikolaus Rath2022-07-022-2/+2
| | | | | | | (#682)" This reverts commit 8db2ba06fef10f38f90b0f3213dd39ec07678e2f. This Meson version is not yet generally available, so we do not want to depend on it..
* Remove member m from fuse_fs (#684)Nozomi Miyamori2022-07-021-6/+0
| | | | | fuse_fs.m is no longer used. Modules are now managed by fuse_modules. fix: free dangling pointer of module #683
* Increase meson min version and avoid get_pkgconfig_variable warning (#682)Bernd Schubert2022-06-202-2/+2
| | | | | | | | | | | | | meson was complaining: Build targets in project: 27 NOTICE: Future-deprecated features used: * 0.56.0: {'Dependency.get_pkgconfig_variable'} So change to .get_variable(pkgconfig : 'type' and also increase the meson minimal version to be able to handle it. Co-authored-by: Bernd Schubert <bschubert@ddn.com>
* Fix a test strncpy compilation warning with recent gccBernd Schubert2022-05-061-2/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | meson configure -D buildtype=debugoptimized meson configure -D b_sanitize=address,undefined Results in '-fsanitize=address,undefined ... -O2 -g' that made compilation to give errors with recent gcc versions. bernd@t1700bs build-ubuntu>ninja -v [1/2] ccache gcc -Itest/test_syscalls.p -Itest -I../test -Iinclude -I../include -Ilib -I../lib -I. -I.. -fdiagnostics-color=always -fsanitize=address,undefined -fno-omit-frame-pointer -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wextra -Werror -O2 -g -D_REENTRANT -DHAVE_CONFIG_H -Wno-sign-compare -Wstrict-prototypes -Wmissing-declarations -Wwrite-strings -fno-strict-aliasing -Wno-unused-result -DHAVE_SYMVER_ATTRIBUTE -MD -MQ test/test_syscalls.p/test_syscalls.c.o -MF test/test_syscalls.p/test_syscalls.c.o.d -o test/test_syscalls.p/test_syscalls.c.o -c ../test/test_syscalls.c FAILED: test/test_syscalls.p/test_syscalls.c.o ccache gcc -Itest/test_syscalls.p -Itest -I../test -Iinclude -I../include -Ilib -I../lib -I. -I.. -fdiagnostics-color=always -fsanitize=address,undefined -fno-omit-frame-pointer -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -Wextra -Werror -O2 -g -D_REENTRANT -DHAVE_CONFIG_H -Wno-sign-compare -Wstrict-prototypes -Wmissing-declarations -Wwrite-strings -fno-strict-aliasing -Wno-unused-result -DHAVE_SYMVER_ATTRIBUTE -MD -MQ test/test_syscalls.p/test_syscalls.c.o -MF test/test_syscalls.p/test_syscalls.c.o.d -o test/test_syscalls.p/test_syscalls.c.o -c ../test/test_syscalls.c In file included from /usr/include/string.h:519, from ../test/test_syscalls.c:7: In function ‘strncpy’, inlined from ‘test_socket’ at ../test/test_syscalls.c:1885:2, inlined from ‘main’ at ../test/test_syscalls.c:2030:9: /usr/include/x86_64-linux-gnu/bits/string_fortified.h:95:10: error: ‘__builtin_strncpy’ output may be truncated copying 107 bytes from a string of length 1023 [-Werror=stringop-truncation] 95 | return __builtin___strncpy_chk (__dest, __src, __len, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | __glibc_objsize (__dest)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ I disagree a bit on the gcc sanity here, as the code was behaving correctly and even already checked the string length. But sice the string length is already verified, that length can be used for the final strncpy.
* Released 3.11.0fuse-3.11.0Nikolaus Rath2022-05-024-6/+16
|
* patch: document ignored fill parameter of readdirAndré Schröder2022-04-201-0/+7
|
* Add missing kernel flags up to 1ULL << 33Bernd Schubert2022-04-171-0/+8
| | | | Just a further sync with the in-kernel flags.
* Set FUSE_INIT_EXT in fuse_init_out::flagsBernd Schubert2022-04-171-2/+5
| | | | | It is better to tell the kernel that libfuse knows about the 64 bit flag extension.
* Passthrough_ll should display cmd line optionsDharmendra singh2022-04-081-0/+18
| | | | | | Make passthrough_ll to display all its cmdline options instead of keeping them hidden. (I am not sure if these are intentionally kept hidden)
* Modify structures in libfuse to handle flags beyond 32 bits.Dharmendra Singh2022-04-082-38/+51
| | | | | | | | | | | In fuse kernel, 'commit 53db28933e95 ("fuse: extend init flags")' made the changes to handle flags going beyond 32 bits but i think changes were not done in libfuse to handle the same. This patch prepares the ground in libfuse for incoming FUSE kernel patches (Atomic open + lookup) where flags went beyond 32 bits. It makes struct same as in fuse kernel resulting in name change of few fields.
* passthrough_hp: Disable splice with the --nosplice optionBernd Schubert2022-03-311-7/+13
| | | | | passthrough_hp was not updated when splice got enabled by default in libfuse3. I.e. the --nosplice option and condition on it was a noop.
* passthrough_hp: Fix inode ref in sfs_unlinkBernd Schubert2022-03-311-0/+26
| | | | | | sfs_unlink may call do_lookup(), which increases the inode ref count, but since that function does not return attributes that lookup ref count won't get automatically decreased.
* Merge pull request #649 from fdinoff/fix_clone_fdNikolaus Rath2022-03-221-3/+9
|\ | | | | Fix fd leak with clone_fd
| * Fix fd leak with clone_fdFrank Dinoff2022-03-211-3/+9
|/ | | | | | | do_interrupt would destroy_req on the request without decrementing the channel's refcount. With clone_fd this could leak file descriptors if the worker thread holding the cloned fd was destroyed. (Only max_idle_threads are kept).
* Merge pull request #635 from amir73il/fopen_noflushNikolaus Rath2022-03-149-2/+94
|\ | | | | Add support for FOPEN_NOFLUSH flag
| * Merge branch 'master' into fopen_noflushNikolaus Rath2022-03-143-7/+9
| |\ | |/ |/|
* | Removed duplicates code. (#642)David Galeano2022-02-111-2/+0
| | | | | | The cap for FUSE_CAP_WRITEBACK_CACHE was printed twice.
* | Fixed returning an error condition to ioctl(2) (#641)Jean-Pierre André2022-02-092-0/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When returning a negative error code by ->ioctl() to the high level interface, no error is propagated to the low level, and the reply message to the kernel is shown as successful. A negative result is however returned to kernel, so the kernel can detect the bad condition, but this appears to not be the case since kernel 5.15. The proposed fix is more in line with the usual processing of errors in fuse, taking into account that ioctl(2) always returns a non-negative value in the absence of errors. Co-authored-by: Jean-Pierre André <jpandre@users.sourceforge.net>
* | Fix ReST end-string nits (#638)Andrew Gaul2022-01-231-3/+3
| | | | | | This makes the file more readable with syntax highlighting.
* | Avoid ENOENT response when recently invalidated fuse_ino_t is received from ↵Ken Schalk2022-01-111-2/+2
| | | | | | | | the kernel (#636)
| * Add test for FOPEN_NOFLUSH flagAmir Goldstein2022-01-052-1/+65
| | | | | | | | | | | | | | | | | | Simulate write() delay and verify that close(rofd) does not block waiting on pending writes. The support for the flag was added in kernel v5.16-rc1. Signed-off-by: Amir Goldstein <amir73il@gmail.com>
| * Add no_rofd_flush mount optionAmir Goldstein2022-01-032-0/+14
| | | | | | | | | | | | To disable flush for read-only fd. Signed-off-by: Amir Goldstein <amir73il@gmail.com>
| * Add support for FOPEN_NOFLUSH flagAmir Goldstein2022-01-035-1/+15
|/ | | | | | | | | | | Allow requesting from kernel to avoid flush on close at file open time. If kernel does not support FOPEN_NOFLUSH flag, the request will be ignored. For passthrough_hp example, request to avoid flush on close when writeback cache is disabled and file is opened O_RDONLY. Signed-off-by: Amir Goldstein <amir73il@gmail.com>
* Document possible NULL paths when directories are removed (#633)Maximilian Heinzler2021-12-121-0/+6
| | | | | | When directories with open handles are removed, the releasedir and fsyncdir operations might be called with a NULL path. That is because there is no hiding behavior like for regular files and the nodes get removed immediately.
* test/test_syscalls.c: allow EBADF in fcheck_stat() (#631)Luis Henriques2021-11-201-1/+2
| | | | | | | | | | | | | | | Test test/test_examples.py::test_passthrough_hp[False] fails because, on kernels >= 5.14, fstat() will return -EBADF: 3 [check_unlinked_testfile] fcheck_stat() - fstat: Bad file descriptor 4 [check_unlinked_testfile] fcheck_stat() - fstat: Bad file descriptor 5 [check_unlinked_testfile] fcheck_stat() - fstat: Bad file descriptor 9 [check_unlinked_testfile] fcheck_stat() - fstat: Bad file descriptor ... This patch simply whitelists the EBADF errno code. Signed-off-by: Luís Henriques <lhenriques@suse.de> Co-authored-by: Luís Henriques <lhenriques@suse.de>