HomeFreeBSD

fusefs: optimize NFS readdir for FUSE_NO_OPENDIR_SUPPORT

Description

fusefs: optimize NFS readdir for FUSE_NO_OPENDIR_SUPPORT

In its lowest common denominator, FUSE does not require that a directory
entry's d_off field is valid outside of the lifetime of the directory's
FUSE file handle. But since NFS is stateless, it must reopen the
directory on every call to VOP_READDIR. That means reading the
directory all the way from the first entry. Not only does this create
an O(n^2) condition for large directories, but it can also result in
incorrect behavior if either:

  • The file system _does_ change the d_off field for the last directory entry previously seen by NFS, or
  • The file system deletes the last directory entry previously seen by NFS.

Handily, for file systems that set FUSE_NO_OPENDIR_SUPPORT d_off is
guaranteed to be valid for the lifetime of the directory entry, there is
no need to read the directory from the start.

MFC after: 3 weeks
Reviewed by: rmacklem

Details

Provenance
asomersAuthored on Jan 2 2022, 10:29 PM
Parents
rGd088dc76e1a6: Fix NFS exports of FUSE file systems for big directories
Branches
Unknown
Tags
Unknown