#9922·rclone

mount2: readdir reports FUSE_UNKNOWN_INO for every directory entry

Author: biagiop1986Created Sep 14, 2026Updated Sep 14, 2026
Labelsbug

Before you start

  • I have searched the forum and the existing issues for this problem.
  • I have tested with the latest beta or stable release and can still reproduce the problem.
  • This is a reproducible bug, not a usage question (questions belong on the forum).

Associated forum post URL

No response

What is the problem you are having with rclone?

cmd/mount2 returns Ino: 0 for every entry in Readdir, which the kernel reports to userspace as FUSE_UNKNOWN_INO (4294967295). Every entry in every directory carries the same wrong inode number in getdents64. It is invisible to ls -i, because coreutils stats each entry anyway. It shows up in anything that trusts d_ino from readdir without a follow-up stat.

Code to reproduce the bug

mkdir -p /tmp/src /tmp/mnt
echo "aaa" > /tmp/src/file1.txt
echo "bbb" > /tmp/src/file2.txt
rclone mount2 /tmp/src /tmp/mnt --vfs-cache-mode off &
sleep 5
python3 -c "
import os
for e in os.scandir('/tmp/mnt'):
     print(e.inode(), e.name)"

It prints

4294967295 file1.txt
4294967295 file2.txt

Expected: each entry's real inode number, matching stat . cmd/mount is unaffected.

Impacts of the bug beyond d_ino
It breaks NFS re-export, which #9548 made work. FUSE implements no get_name export operation, so when the kernel reconnects a file handle (reconnect_path -> exportfs_get_name) it falls back to scanning the parent directory for an entry whose inode matches. Since all the entries report the same (wrong) value, that scan can never succeed and the client gets an unrecoverable ESTALE.
#9548 fixed various mount2/NFS gaps, but the Readdir one expressed here was missing.

rclone version

rclone v1.76.0-beta.10346.c3ba18461

  • os/version: ubuntu 24.04 (64 bit)
  • os/kernel: 6.12.76-linuxkit (aarch64)
  • os/type: linux
  • os/arch: arm64 (ARMv8 compatible)
  • go/version: go1.27.1
  • go/linking: static
  • go/tags: none

Operating system

Linux

Which cloud storage system are you using?

local

Output of rclone config redacted

; empty config
### Double check the config for sensitive info before posting publicly

The command you were trying to run

rclone mount2 /tmp/src /tmp/mnt --vfs-cache-mode off

A log from the command with the -vv flag

2026/09/14 16:08:55 DEBUG : rclone: Version "v1.76.0-beta.10346.c3ba18461" starting with parameters ["rclone" "mount2" "/tmp/src" "/tmp/mnt" "--vfs-cache-mode" "off" "-vv"]
2026/09/14 16:08:55 DEBUG : Creating backend with remote "/tmp/src"
2026/09/14 16:08:55 NOTICE: Config file "/root/.config/rclone/rclone.conf" not found - using defaults
2026/09/14 16:08:55 INFO  : Local file system at /tmp/src: poll-interval is not supported by this remote
2026/09/14 16:08:55 DEBUG : Local file system at /tmp/src: Mounting on "/tmp/mnt"
2026/09/14 16:08:55 DEBUG : Root: 
2026/09/14 16:08:55 DEBUG : >Root: node=, err=<nil>
2026/09/14 16:08:55 DEBUG : Local file system at /tmp/src: Waiting for the mount to start...
2026/09/14 16:08:55 DEBUG : Local file system at /tmp/src: Mount started
2026/09/14 16:08:56 DEBUG : Readdir: 
2026/09/14 16:08:56 DEBUG : >Readdir: ds=&{[0x18c4abc7f790 0x18c4abc7f860] 0}, errno=errno 0
2026/09/14 16:08:56 DEBUG : Lookup: name="file1.txt"
2026/09/14 16:08:56 DEBUG : >Lookup: inode=i2 g0 (reg): , attr={M0100644 SZ=2 L=1 0:0 B1*0 i0:2 A 1789402135.818117 M 1789402135.818117 C 1789402135.818117}, errno=errno 0
2026/09/14 16:08:56 DEBUG : Lookup: name="file2.txt"
2026/09/14 16:08:56 DEBUG : >Lookup: inode=i3 g0 (reg): , attr={M0100644 SZ=2 L=1 0:0 B1*0 i0:3 A 1789402135.818117 M 1789402135.818117 C 1789402135.818117}, errno=errno 0
2026/09/14 16:08:57 DEBUG : /tmp/mnt: Unmounted externally. Just exit now.
2026/09/14 16:08:57 DEBUG : rclone: Version "v1.76.0-beta.10346.c3ba18461" finishing with parameters ["rclone" "mount2" "/tmp/src" "/tmp/mnt" "--vfs-cache-mode" "off" "-vv"]

Anything else?

Note the contrast in the log: Readdir returns the entries carrying no inode information, while the Lookup immediately after reports i2 and i3 correctly. The numbers exist, they're just never put on the dirents.