IABSD.fr/src/sys/miscfs

Branch :


Log

Author Commit Date CI Message
3a22be5a 2021-12-20 16:22:24 Let poll(2) register EVFILT_EXCEPT filter with dead vnodes This enables the system deliver POLLHUP when pollfd.events == 0.
7fedc433 2021-12-14 15:53:42 Remember to clear __EV_HUP when the other end of the FIFO has re-opened.
87c93f01 2021-12-13 14:56:55 Revise EVFILT_EXCEPT filters Restrict the circumstances where EVFILT_EXCEPT filters trigger: * when out-of-band data is present and NOTE_OOB is requested. * when the channel is fully closed and consumer is poll(2). This should clarify the logic and suppress events that kqueue-based poll(2) does not except. OK mpi@
468dccc2 2021-12-13 14:54:22 Prevent kevent(2) use of EVFILT_EXCEPT with FIFOs and pipes Currently, the only intended direct usage of the EVFILT_EXCEPT filter is with NOTE_OOB to detect out-of-band data in ptys and sockets. NOTE_OOB does not apply to FIFOs or pipes. Prevent the user from registering the filter with these file types. The filter code is for the kernel's internal use. OK mpi@
f1993be3 2021-12-12 09:14:58 Add vnode parameter to VOP_STRATEGY() Pass the device vnode as a parameter to VOP_STRATEGY() to allow calling the correct vop_strategy callback. Now the vnode is also available in the callback. OK mpi@
6ecc0d7f 2021-12-11 09:28:26 Clarify usage of __EV_POLL and __EV_SELECT Make __EV_POLL specific to kqueue-based poll(2), to remove overlap with __EV_SELECT that only select(2) uses. OK millert@ mpi@
8013d39c 2021-12-08 13:03:52 Fix select(2) exceptfds handling of FIFOs and pipes Prevent select(2) from indicating an exceptional condition when the other end of a FIFO or pipe is closed. Originally, select(2) returned an exceptfds event only with a pty or socket that has out-of-band data pending. millert@ says that OpenBSD diverged from this by accident when poll(2) and select(2) were changed to use the same backend code in year 2003. OK millert@
fdd2406a 2021-10-24 11:23:22 Implement poll(2), select(2), ppoll(2) & pselect(2) on top of kqueue. The given set of fds are converted to equivalent kevents using EV_SET(2) and passed to the scanning internals of kevent(2): kqueue_scan(). ktrace(1) will now output the converted kevents on top of the usuals set bits to be able to find possible error in the convertion. This switch implies that poll(2) and select(2) will now query underlying kqfilters instead of the *_poll() routines. An increase in latency is visible, especially with UDP sockets and NET_LOCK()-contended subsystems and will be addressed in next steps. Based on similar work done on MacOS and DragonFlyBSD with inputs from visa@, millert@, anton@, cheloha@, thanks! Tested by many, thanks! ok claudio@, bluhm@
8e156a1d 2021-10-24 07:02:47 Set klist lock for sockets to make socket event filters MP-safe The filterops instances already provide f_modify and f_process callbacks with proper internal locking. Locking of socket klists has been the missing detail for MP-safety. OK mpi@
0650ab1a 2021-10-22 15:11:32 Make EVFILT_EXCEPT handling separate from the read filter. This is a change of behavior and events wont be generated if there is something to read on the fd. Only EV_EOF or NOTE_OOB will now be reported. While here a new filter for FIFOs supporting EV_EOF and __EV_HUP. ok visa@
f42cad0a 2021-10-19 06:09:39 vnode: deadfs: do not call v_op->vop_lock directly, use VOP_LOCK() wrapper ok mpi@ visa@ (as part of larger diff)
413a7ab5 2021-10-15 06:30:06 vnode: remove vop_generic_{,is,un}lock stub functions These functions are only stubs (returning 0). Replace them with nullop function (same behaviour). There is no intented behaviour changes. While here, reorder some vop_islocked member in structs to be next others vop_{,un}lock members. ok visa@
81b1345f 2021-10-02 17:29:28 fuse: avoid namei_pool leaks in several functions when calling namei(), cn_pnbuf is kept allocated when fs implementation is setting SAVENAME flag. In such cases, it is expected the fs implementation to also release memory when work is done. fuse(4) didn't put back the memory to the pool. correct it. ok mpi@
9aafff14 2021-10-02 08:51:41 vfs: merge *_badop to vop_generic_badop It replaces spec_badop, fifo_badop, dead_badop and mfs_badop, which are only calls to panic(9), to one unique function vop_generic_badop(). No intented behaviour changes (outside the panic message which isn't the same). ok mpi@
f894fcaa 2021-07-13 07:37:50 Add f_modify and f_process callbacks to FIFO filterops. OK millert@ mpi@
9c14f6a5 2021-05-01 16:18:28 Update the remaining SYSCTL_INT_READONLY cases OK mvs@
9d6122f6 2021-04-28 09:53:53 Introduce a global vnode_mtx and use it to make vn_lock() safe to be called without the KERNEL_LOCK. This moves VXLOCK and VXWANT to a mutex protected v_lflag field and also v_lockcount is protected by this mutex. The vn_lock() dance is overly complex and all of this should probably replaced by a proper lock on the vnode but such a diff is a lot more complex. This is an intermediate step so that at least some calls can be modified to grab the KERNEL_LOCK later or not at all. OK mpi@
8761c2c6 2021-03-24 16:11:32 make some `struct vops' members explicitly NULL instead of implicitly NULL ok mpi@
b66b9ef8 2021-03-11 13:31:35 spelling
e04a79f8 2021-01-17 05:23:34 Replace SB_KNOTE and sb_flagsintr with direct checking of klist. OK mpi@ as part of a larger diff
9b0cf67b 2020-12-25 12:59:51 Refactor klist insertion and removal Rename klist_{insert,remove}() to klist_{insert,remove}_locked(). These functions assume that the caller has locked the klist. The current state of locking remains intact because the kernel lock is still used with all klists. Add new functions klist_insert() and klist_remove() that lock the klist internally. This allows some code simplification. OK mpi@
6e044e75 2020-11-17 03:23:10 Convert fusefs_sysctl to sysctl_bounded_args OK millert@
cd731760 2020-06-15 15:42:11 Implement a simple kqfilter for deadfs matching its poll handler. ok visa@, millert@
2b88cdaf 2020-06-15 15:29:40 Set __EV_HUP when the conditions matching poll(2)'s POLLUP are found. This is only done in poll-compatibility mode, when __EV_POLL is set. ok visa@, millert@
1c57bd6b 2020-06-11 09:18:43 Rename poll-compatibility flag to better reflect what it is. While here prefix kernel-only EV flags with two underbars. Suggested by kettenis@, ok visa@
6e29a944 2020-06-08 08:04:09 Use a new EV_OLDAPI flag to match the behavior of poll(2) and select(2). Adapt FS kqfilters to always return true when the flag is set and bypass the polling mechanism of the NFS thread. While here implement a write filter for NFS. ok visa@
a9ad0377 2020-05-13 08:13:42 Use seltrue_kqfilter() instead of hand-rolling it in multiple drivers. ok visa@
f7744361 2020-04-08 08:07:51 Make fifo_kqfilter() honor FREAD|FWRITE just like fifo_poll() does. Prevent generating events that do not correspond to how the fifo has been opened. ok visa@, millert@
c35e1d21 2020-04-08 08:01:52 Pass correct socket to the write kqueue filter. Make EVFILT_WRITE notifications on fifo work. ok visa@, millert@
9c969c9a 2020-04-07 13:27:50 Abstract the head of knote lists. This allows extending the lists, for example, with locking assertions. OK mpi@, anton@
c03a054f 2020-04-03 08:08:51 Return POLLERR instead of EINVAL in fusepoll(). ok kettenis@
b8213689 2020-02-20 16:56:51 Replace field f_isfd with field f_flags in struct filterops to allow adding more filter properties without cluttering the struct. OK mpi@, anton@
2d6b9e38 2020-01-20 23:21:55 struct vops is not modified during runtime so use const which moves each into read-only data segment. OK deraadt@ tedu@
9b55129e 2020-01-08 15:03:10 Convert infinite sleeps to tsleep_nsec(9). ok bluhm@
94321eb4 2019-12-31 13:48:31 Use C99 designated initializers with struct filterops. In addition, make the structs const so that the data are put in .rodata. OK mpi@, deraadt@, anton@, bluhm@
41f642fc 2019-12-26 13:28:49 Convert struct vfsops initializer to C99 style. OK visa@
b63185a7 2019-12-12 16:33:02 Reintroduce socket locking inside socket event filters. Tested by anton@, sashan@ OK mpi@, anton@, sashan@
83824c38 2019-12-05 10:41:08 Convert infinite sleeps to tsleep_nsec(9). ok jca@
ed1efb57 2019-10-19 06:56:18 Unlock the vnode in vop_inactive of deadfs. The unlock operation is a no-op at the moment, but future work will introduce an actual lock that has to be released. OK mpi@ anton@
836f297b 2019-08-05 08:35:59 Allow concurrent reads of the f_offset field of struct file by serializing both read/write operations using the existing file mutex. The vnode lock still grants exclusive write access to the offset; the mutex is only used to make the actual write atomic and prevent any concurrent reader from observing intermediate values. ok mpi@ visa@
6784024e 2019-07-12 13:56:27 Revert anton@ changes about read/write unlocking https://marc.info/?l=openbsd-cvs&m=156277704122293&w=2 ok anton@
d038d3d5 2019-07-10 16:43:19 Make read/write of the f_offset field belonging to struct file MP-safe; as part of the effort to unlock the kernel. Instead of relying on the vnode lock, introduce a dedicated lock per file. Exclusive write access is granted using the new foffset_enter and foffset_leave API. A convenience function foffset_get is also available for threads that only need to read the current offset. The lock acquisition order in vn_write has been changed to match the one in vn_read in order to avoid a potential deadlock. This change also gets rid of a documented race in vn_read(). Inspired by the FreeBSD implementation. With help and ok mpi@ visa@
4a4dc3ea 2018-07-30 12:22:14 Use FNONBLOCK instead of SS_NBIO to check/indicate that the I/O mode for sockets is non-blocking. This allows us to G/C SS_NBIO. Having to keep the two flags in sync in a mp-safe way is complicated. This change introduce a behavior change in sosplice(), it can now always block. However this should not matter much due to the socket lock being taken beforhand. ok bluhm@, benno@, visa@
9ff6e783 2018-07-18 10:47:02 Replace VATTR_NULL() with memset(3) in fusefs_getattr(). VATTR_NULL() sets all members of struct vattr to VNOVAL (-1) instead of 0, which is what is appropriate here. The VATTR_NULL() macro is intended for initialising struct vattr when setting attributes. ok mpi@
3270c159 2018-07-17 13:12:08 Don't send FBT_DESTROY if the FUSE connection is still PENDING. Also don't attempt to determine the size of the root inode. This is because we don't need to know the size of directories and FBT_GETATTR will also cause a deadlock if fuse_unmount(3) is called before the file system has a chance to process fbufs. Add corresponding regression test. ok mpi@
3c992bbf 2018-07-16 16:44:09 Insert the appropriate uvm_vnp_uncache(9) and uvm_vnp_setsize(9) kernel calls to ensure that the UVM cache for memory mapped files is up to date. ok mpi@
0d644658 2018-07-16 13:10:53 Implement FBT_FSYNC, which is called on fsync(2) and fdatasync(2). Currently ignores the a_waitfor argument and always invokes the file system's fsync implementation synchronously. ok mpi@
63849fff 2018-07-05 15:34:25 Do not leak memory and a fp reference when !root passes `allow_other'. Fix CID 1470236. ok helg@
2fd654f7 2018-06-27 13:58:22 Refactor to simplify - no functional change. ok mpi@
b7e69da4 2018-06-25 12:03:53 Remove unused fbuf parameter from fuse_device_cleanup(). ok mpi@
13907cde 2018-06-21 14:53:36 Don't timeout on fb_queue(9). The current process will block indefinitely and cannot be interrupted or killed. This is consistent with how VFS system calls should behave. If the file system becomes unresponsive then the only sane solution is for the user to kill the file system daemon. Implementing the equivalent of nfs -osoft or -ointr to either timeout or allow the blocking FUSE operation to be interrupted can be considered in a future patch. ok mpi@
5ff674a5 2018-06-21 14:17:23 Drop redundant "node == parent node" checks from VOP_RMDIR() implementations. Rely on the VFS layer to do the checking. OK mpi@, helg@
f49416c5 2018-06-20 10:57:39 Fix formatting.
0f4d2db5 2018-06-19 13:01:34 Changes the default mount behaviour so only the user that mounts the file system can access it unless the allow_other mount options is specified. The allow_other mount option makes the file system available to other users just like any other mounted file system. ok mpi@
413ec31c 2018-06-19 11:27:54 Send the calling thread id, effective uid and gid, and umask to the FUSE file system. fuse_get_context(3) will now return the correct values. ok mpi@
56bd213a 2018-06-18 12:04:20 Allow write for non-regular files when file system is mounted read-only. Don't ask file system to check file access; always behave as if default_permissions option was specified. (this may change in a later commit) ok mpi@
93697741 2018-06-18 11:24:15 chmod(2) should return EFTYPE if the effective user ID is not the super-user, the mode includes the sticky bit (S_ISVTX), and path does not refer to a directory. ok mpi@
4dd4d774 2018-06-07 13:37:27 Make callers of VOP_CREATE(9) and VOP_MKNOD(9) responsible for unlocking the directory vnode. OK mpi@, helg@
34bd5584 2018-06-06 06:55:22 Pass the socket to sounlock(), this prepare the terrain for per-socket locking. ok visa@, bluhm@
6c41c6ee 2018-05-23 13:09:37 Change wait text when waiting for FUSE file system daemon to respond. ok mpi@
dae5ffec 2018-05-22 12:52:14 Implement support for libfuse use_ino option. This returns the file system's ino for VOP_GETATTR(9) and VOP_READDIR(9) rather than the internally generated fuse ino. ok mpi@
65de3e7d 2018-05-21 13:06:00 The flush operation is optional so don't return ENOSYS if the FUSE file system doesn't implement it. ok mpi@
5b6d7437 2018-05-20 03:06:50 Prevent race condition if file system is accessed before it is initialised. Rather than failing, requests are now queued. ok mpi@
e1487996 2018-05-20 02:51:26 Implement FBT_FLUSH. This is sent whenever a file descriptor is closed with VOP_CLOSE(9). The associated FUSE file handle is however not closed at this time and is instead closed on VOP_RELEASE(9) because that's the only time it's guaranteed to be no longer used. Directory handles are now only closed on VOP_RELEASE(9) for the same reason. ok mpi@
903f970a 2018-05-17 11:25:11 Pass size argument to free(9). ok mpi@
390f10b5 2018-05-16 13:09:17 libfuse should not maintain state for FBT_READDIR. If a directory is opened multiple times (either from the same process or different processes) then FUSE will not reliably return the directory entries to both file descriptors. ok mpi@
bb72b40b 2018-05-15 11:57:32 Use memset(3) instead of bzero(3) for consistency and as per POSIX recommendation.
6e880534 2018-05-02 02:24:55 Remove proc from the parameters of vn_lock(). The parameter is unnecessary because curproc always does the locking. OK mpi@
36bb23f1 2018-04-28 03:13:04 Clean up the parameters of VOP_LOCK() and VOP_UNLOCK(). It is always curproc that does the locking or unlocking, so the proc parameter is pointless and can be dropped. OK mpi@, deraadt@
bae06bfd 2018-04-27 10:13:37 Move FREF() inside fd_getfile(). ok visa@
0c4143b5 2018-04-08 18:57:39 AF_LOCAL was a failed attempt (by POSIX?) to seem less UNIX-specific, but AF_UNIX is both the historical _and_ standard name, so prefer and recommend it in the headers, manpages, and kernel. ok miller@ deraadt@ schwarze@
d78cb2ff 2018-03-28 16:34:28 Use RWL_IS_VNODE with locks that are acquired through VOP_LOCK(), to appease WITNESS. ext2fs and ffs already use the flag. The same locking pattern appears with other file systems too, so this patch addresses the remaining cases. OK mpi@
2dd1cce3 2018-02-19 11:35:41 Grab solock() inside soconnect2() instead of asserting for it to be held. ok millert@
976e9839 2018-02-10 05:24:23 Syncronize filesystems to disk when suspending. Each mountpoint's vnodes are pushed to disk. Dangling vnodes (unlinked files still in use) and vnodes undergoing change by long-running syscalls are identified -- and such filesystems are marked dirty on-disk while we are suspended (in case power is lost, a fsck will be required). Filesystems without dangling or busy vnodes are marked clean, resulting in faster boots following "battery died" circumstances. Tested by numerous developers, thanks for the feedback.
c37506c6 2018-01-22 13:16:48 Use the proper address space when using a kernel that supports Supervisor Mode Access Prevention (SMAP) compiled with FUSE_DEBUG. While here, add some sanity check to the debug function fuse_dump_buff. Thanks to Thomas Jeunet. OK mpi@, helg@
53146562 2018-01-04 10:51:11 Do a FREF/FRELE dance after calling fd_getfile(). This should be enought to prevent `fp' to disapear while sleeping in malloc(9). ok helg@
4b1f64dc 2018-01-02 06:38:45 Stop assuming <sys/file.h> will pull in fcntl.h when _KERNEL is defined. ok millert@ sthen@
ac4e8908 2017-12-18 10:07:55 Revert grabbing the socket lock in kqueue(2) filters. This change exposed or created a situation where a CPU started to be irresponsive while holding the KERNEL_LOCK(). These led to lockups and even with MP_LOCKDEBUG it was not clear what happened to this CPU. These situations have been experience by dhill@ with dcrwallet and jcs@ with syncthing. Both applications are written in Go and do kevent(2) & networking across multiple threads.
7efda1a1 2017-12-11 05:27:40 In uvm Chuck decided backing store would not be allocated proactively for blocks re-fetchable from the filesystem. However at reboot time, filesystems are unmounted, and since processes lack backing store they are killed. Since the scheduler is still running, in some cases init is killed... which drops us to ddb [noted by bluhm]. Solution is to convert filesystems to read-only [proposed by kettenis]. The tale follows: sys_reboot() should pass proc * to MD boot() to vfs_shutdown() which completes current IO with vfs_busy VB_WRITE|VB_WAIT, then calls VFS_MOUNT() with MNT_UPDATE | MNT_RDONLY, soon teaching us that *fs_mount() calls a copyin() late... so store the sizes in vfsconflist[] and move the copyin() to sys_mount()... and notice nfs_mount copyin() is size-variant, so kill legacy struct nfs_args3. Next we learn ffs_mount()'s MNT_UPDATE code is sharp and rusty especially wrt softdep, so fix some bugs adn add ~MNT_SOFTDEP to the downgrade. Some vnodes need a little more help, so tie them to &dead_vnops. ffs_mount calling DIOCCACHESYNC is causing a bit of grief still but this issue is seperate and will be dealt with in time. couple hundred reboots by bluhm and myself, advice from guenther and others at the hut
3bf371cf 2017-12-10 11:31:54 Move SB_SPLICE, SB_WAIT and SB_SEL to `sb_flags', serialized by solock(). SB_KNOTE remains the only bit set on `sb_flagsintr' as it is set/unset in contexts related to kqueue(2) where we'd like to avoid grabbing solock(). While here add some KERNEL_LOCK()/UNLOCK() dances around selwakeup() and csignal() to mark which remaining functions need to be addressed in the socket layer. ok visa@, bluhm@
eedad28e 2017-11-30 11:29:03 vn_open(9) does not pass the open(2) flags to VOP_CREATE(9) so we can't support FBT_CREATE. Fall back to FBT_MKNOD + FBT_OPEN so that a valid sequence of FUSE messages is sent to the file system when creating files. input from mpi@, otto@
b3dbe383 2017-11-27 22:55:17 Change fusefs_link to return EPERM if the source file is a directory. Now aligns with link(2) man page and ffs regress tests. ok phessler@, jca@
ed6e40b2 2017-11-27 13:15:56 Check access before creating a file or directory. input and ok mpi@
9a170258 2017-11-27 12:54:13 When renaming a file, unlock the target vnode if the target file exists. ok mpi@
16956dad 2017-11-17 15:45:17 Fixes the following bugs when getcwd(3) is used on a fuse file system Endless loop if directory nested more than one level from root of file system Current directory not found if the parent directory contains more children than will fit in the buffer passed to VOP_READDIR(9) Open and close directory in fusefs_readdir if dir is not already open. Now behaves as if readdir_ino option was passed to fuse so that directories in path have a valid ino. ok mpi@
290a836d 2017-11-04 14:13:53 Make it possible for multiple threads to enter kqueue_scan() in parallel. This is a requirement to use a sleeping lock inside kqueue filters. It is now possible, but not recommended, to sleep inside ``f_event''. Threads iterating over the list of pending events are now recognizing and skipping other threads' markers. knote_acquire() and knote_release() must be used to "own" a knote to make sure no other thread is sleeping with a reference on it. Acquire and marker logic taken from DragonFly but the KERNEL_LOCK() is still serializing the execution of the kqueue code. This also enable the NET_LOCK() in socket filters. Tested by abieber@ & juanfra@, run by naddy@ in a bulk, ok visa@, bluhm@
dbcea99f 2017-08-10 14:36:34 Avoid possible NULL pointer dereference on fuseioctl() Found by Coverity Scan (CID 1453387) OK mpi@
4416ac7e 2017-07-24 15:07:39 Extend the scope of the socket lock to protect `so_state' in connect(2). As a side effect, soconnect() and soconnect2() now expect a locked socket, so update all the callers. ok bluhm@
9da3575e 2017-07-08 09:19:02 Revert grabbing the socket lock in kqueue filters. It is unsafe to sleep while iterating the list of pending events in kqueue_scan(). Reported by abieber@ and juanfra@
285127d3 2017-07-03 08:31:39 Protect `so_state', `so_snd' and `so_rcv' with the socket lock in kqueue filters. ok millert@, bluhm@, visa@
14226c8d 2017-07-03 08:27:07 Not all sockets require the NET_LOCK(). So use solock() instead in fifo_close(). ok millert@, visa@
06235387 2017-06-26 09:32:31 Assert that the corresponding socket is locked when manipulating socket buffers. This is one step towards unlocking TCP input path. Note that all the functions asserting for the socket lock are not necessarilly MP-safe. All the fields of 'struct socket' aren't protected. Introduce a new kernel-only kqueue hint, NOTE_SUBMIT, to be able to tell when a filter needs to lock the underlying data structures. Logic and name taken from NetBSD. Tested by Hrvoje Popovski. ok claudio@, bluhm@, mikeb@
6f84e71d 2017-04-20 14:13:00 Tweak lock inits to make the system runnable with witness(4) on amd64 and i386.
5b26e4e1 2017-01-10 19:48:32 Remove the unused olddp parameter from function dounmount(). OK mpi@ millert@
2b4720fc 2016-12-19 08:36:49 Introduce the NET_LOCK() a rwlock used to serialize accesses to the parts of the network stack that are not yet ready to be executed in parallel or where new sleeping points are not possible. This first pass replace all the entry points leading to ip_output(). This is done to not introduce new sleeping points when trying to acquire ART's write lock, needed when a new L2 entry is created via the RT_RESOLVE. Inputs from and ok bluhm@, ok dlg@
a5399ec0 2016-09-20 14:04:37 Fifo did work around the socket layer. Better call soconnect2() instead of unp_connect2(). This adds the missing splsoftnet(). Require that socantsendmore() and socantrcvmore() in uipc_socket2.c should be called with splsoftnet(). Found by David Hill; OK mikeb@
5e69e0b6 2016-09-07 17:53:35 Fix fuse node lookups. Currently fusefs nodes in the kernel remember the parent inode number for ".." lookups. This only works until the kernel starts to reuse vnodes and the parent's vnode is reclaimed and the ino to path mapping is removed from the userland process by libfuse. Fix this by using reference counting in libfuse, so that parent mapping are retained as long as a child uses them. Also, don't free the root node. This commit resolves following issue: $ doas fuse-zip ~/Downloads/foo.zip /mnt $ ls /mnt openbsd-www $ grep -IR foo /usr/src > /dev/null # force vfs to reclaim vnodes $ ls /mnt ls: /mnt: No such file or directory $ ok tedu
6f9b5942 2016-08-30 16:45:54 Use struct stat for storing attributes in fusebufs, because using struct vattr in userspace is suboptimal as some related helpers are not available, e.g. VATTR_NULL() and IFTOVT(). The conversion is now done in the kernel where it belongs. As a side effect the <sys/vnode.h> include can be removed from libfuse. tweaks and ok guenther
123e895f 2016-08-21 09:23:33 There are three callers of update_vattr(). Two of them don't use the updated struct vattr afterwards, so the call can be removed. Remove both calls and the function itself, inlining the last remaining call. ok millert
847e9294 2016-08-16 21:32:58 There is no sense in doing caching in fusefs. In case of a non-local filesystem the tree can change behind our back, resulting in stale cache entries. "The only winning move is not to play." ok tedu beck mpi