cfs で readdir() が正しく動作しない?

[id:rna:20041021#cfs] の続き。cfs でマウントしたディレクトリ(や、そのサブディレクトリ)で readdir() が正しく動作しません。60数エントリくらいで NULL を返してしまいます。この影響で xv のファイルブラウザがファイルを全部表示してくれません。ls とか nautilus は大丈夫みたい。

#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
 
int main(int argc, char** argv) {
  struct dirent *dp;
  DIR *dirp = opendir(".");
  int i = 0;
  while ((dp = readdir(dirp)) != NULL) {
    i++;
  }
  printf("%d entries.\n", i);
}

これを 100 個のファイルがあるディレクトリで動かして strace して見るとこんな感じ((ディレクトリ読み込み周辺のみ):

open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 3
fstat64(3, {st_mode=S_IFDIR|0700, st_size=12288, ...}) = 0
fcntl64(3, F_SETFD, FD_CLOEXEC)         = 0
brk(0)                                  = 0x80dd000
brk(0x80ff000)                          = 0x80ff000
brk(0)                                  = 0x80ff000
getdents64(3, /* 102 entries */, 4096)  = 2448
_llseek(3, 2130706432, [2130706432], SEEK_SET) = 0
getdents64(3, /* 41 entries */, 4096)   = 984
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 6), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf6fff000
write(1, "61 entries.\n", 12)           = 12

ディレクトリエントリを全部読んだ後なんかよけいなことをしてるような。。。
ext3fs ではこんな感じ:

open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 3
fstat64(3, {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
fcntl64(3, F_SETFD, FD_CLOEXEC)         = 0
brk(0)                                  = 0x977b000
brk(0x979d000)                          = 0x979d000
brk(0)                                  = 0x979d000
getdents64(3, /* 102 entries */, 4096)  = 2448
getdents64(3, /* 0 entries */, 4096)    = 0
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 6), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf6fff000
write(1, "102 entries.\n", 13)          = 13