On 6/12/25 17:56, Prince Kumar wrote:
Gentle reminder!!
It would be ways more visible, if you would add [fuse] to the subject
line. I only noticed by accident during lunch break when I scanned
through fsdevel...
-Prince.
On Thu, Jun 5, 2025 at 2:53 PM Prince Kumar <princer@xxxxxxxxxx> wrote:
Hello Team,
I'm implementing Readdirplus support in GCSFuse
(https://github.com/googlecloudplatform/gcsfuse) and have observed
behavior that seems to contradict my understanding of its purpose.
When Readdirplus returns ChildInodeEntry, I expect the kernel to use
this information and avoid subsequent lookup calls for those entries.
However, I'm seeing lookup calls persist for these entries unless an
entry_timeout is explicitly set.
One similar open issue on the libfuse github repo:
https://github.com/libfuse/libfuse/issues/235, which is closed but
seems un-resolved.
1. Could you confirm if this is the expected behavior, or a kernel side issue?
2. Also, is there a way other than setting entry_timeout, to suppress
these lookup entries calls after the Readdirplus call?
I guess the problem is that there is no readdir-plus system call.
Try something like "strace -f ls -l /tmp"
Results in
getdents64(3, 0x6119da3c3640 /* 28 entries */, 32768) = 1768
statx(AT_FDCWD, "/tmp/snap-private-tmp", AT_STATX_SYNC_AS_STAT|AT_SYMLINK_NOFOLLOW|AT_NO_AUTOMOUNT, STATX_MODE|STATX_NLINK|STATX_UID|STATX_GID|STATX_MTIME|STATX_SIZE, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0700, stx_size=120, ...}) = 0
lgetxattr("/tmp/snap-private-tmp", "security.selinux", 0x6119da3c1f40, 255) = -1 ENODATA (No data available)
getdents64() eventually becomes FUSE_READDIRPLUS and libfuse returns
the entries with their attributes. And these attributes get
filled into the inodes.
A bit later statx() is called and since there is no cache on the attributes
it has to assume that the attributes are outdated and fetches them again.
Without cache you would need a single application call, but that syscall
does not exist.
Hope it helps,
Bernd