[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