xfs-masters
[Top] [All Lists]

[Bug 808] For Linux-2.6.28 kernel and XFS filesystem, glibc readdir miss

To: xfs-masters@xxxxxxxxxxx
Subject: [Bug 808] For Linux-2.6.28 kernel and XFS filesystem, glibc readdir misses final file in directory listings
From: bugzilla-daemon@xxxxxxxxxxx
Date: Sat, 27 Dec 2008 06:45:38 -0600
http://oss.sgi.com/bugzilla/show_bug.cgi?id=808





------- Additional Comments From jpsinthemix@xxxxxxxxxxx  2008-12-27 06:45 CST 
-------
(In reply to comment #5)
> So looking at the differences of your trace to mine is that your glibc uses
> getdents64 even without -D_FILE_OFFSET_BITS=64, while mine uses plain old
> getdents, and it always does a llseek after the getdents which my glibc 
> doesn't
> do.  My first getdents64 is exactly the same as yours (compiled with
> -D_FILE_OFFSET_BITS=64) and the the writes from the printf in your program
> follow, but it goes on until the file 168 entry, which it should for both our
> cases given that getdents claims to have 170 entries in it's buffer which is 
> 168
> + the "." and ".." entries:
> 
> getdents64(3, /* 170 entries */, 4096)  = 4080
> write(1, "file: . rc: Success\n"..., 20) = 20
> write(1, "file: .. rc: Success\n"..., 21) = 21
> 
> ...
> write(1, "file: 167 rc: Success\n"..., 22) = 22
> write(1, "file: 168 rc: Success\n"..., 22) = 22
> 
> 
> Your trace then starts another getdents call:
> 
> getdents64(3, /* 1 entries */, 4096)    = 24                                  
>   
> 
> which mine doesn't do, and which doesn't return an error either but what looks
> like a single normal dirent structure.
> 
> Very strange things going on here, I'll see if I can find something fishy in 
> the
> glibc sources.
> 
> You don't happen to have a 2.6.27.<something> kernel still around and could
> attach a strace from that one?

Yup. Below is an strace for 2.6.27.6 (haven't seen the problem at all with this
kernel, which use's glibc-2.8_20081103 (for the 2.6.28 kernel I have
glibc-2.8_20081222). Also, in all cases I'm using gcc-4.3.2, and the glibc
configure was done as:
echo "CFLAGS += -march=i486 -mtune=i686" > configparms

$SRCDIR/$PKG-$VERSION/configure \
  --prefix=/$PREFIX \
  --libexecdir=/$PREFIX/lib/glibc \
  --disable-profile \
  --enable-add-ons \
  --enable-kernel=2.6.0
 
Here's the 2.6.27.6 strace:
----------------------------------------------------------------------
execve("./test_readdir", ["./test_readdir", "ttt"], [/* 49 vars */]) = 0
brk(0)                                  = 0x804a000
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0xb8085000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/sse2/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or
directory)
stat64("/lib/tls/i686/sse2", 0xbf89f5a8) = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or 
directory)
stat64("/lib/tls/i686", 0xbf89f5a8)     = -1 ENOENT (No such file or directory)
open("/lib/tls/sse2/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or 
directory)
stat64("/lib/tls/sse2", 0xbf89f5a8)     = -1 ENOENT (No such file or directory)
open("/lib/tls/libc.so.6", O_RDONLY)    = -1 ENOENT (No such file or directory)
stat64("/lib/tls", 0xbf89f5a8)          = -1 ENOENT (No such file or directory)
open("/lib/i686/sse2/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or 
directory)
stat64("/lib/i686/sse2", 0xbf89f5a8)    = -1 ENOENT (No such file or directory)
open("/lib/i686/libc.so.6", O_RDONLY)   = -1 ENOENT (No such file or directory)
stat64("/lib/i686", 0xbf89f5a8)         = -1 ENOENT (No such file or directory)
open("/lib/sse2/libc.so.6", O_RDONLY)   = -1 ENOENT (No such file or directory)
stat64("/lib/sse2", 0xbf89f5a8)         = -1 ENOENT (No such file or directory)
open("/lib/libc.so.6", O_RDONLY)        = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0 g\1\0004\0\0\0\24"...,
512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=7544996, ...}) = 0
mmap2(NULL, 1308240, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) =
0xb7f45000
mmap2(0xb807f000, 12288, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x13a) = 0xb807f000
mmap2(0xb8082000, 9808, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb8082000
close(3)                                = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0xb7f44000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb7f446c0, limit:1048575,
seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0,
useable:1}) = 0
mprotect(0xb807f000, 8192, PROT_READ)   = 0
mprotect(0xb80a1000, 4096, PROT_READ)   = 0
open("ttt", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3
fstat64(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
fcntl64(3, F_GETFD)                     = 0x1 (flags FD_CLOEXEC)
brk(0)                                  = 0x804a000
brk(0x806c000)                          = 0x806c000
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 2), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =
0xb7f43000
write(1, "Files in ttt:\n"..., 14)      = 14
getdents64(3, /* 170 entries */, 4096)  = 4080
write(1, "file: . rc: Success\n"..., 20) = 20
write(1, "file: .. rc: Success\n"..., 21) = 21
write(1, "file: 1 rc: Success\n"..., 20) = 20
write(1, "file: 2 rc: Success\n"..., 20) = 20
write(1, "file: 3 rc: Success\n"..., 20) = 20
write(1, "file: 4 rc: Success\n"..., 20) = 20
write(1, "file: 5 rc: Success\n"..., 20) = 20
write(1, "file: 6 rc: Success\n"..., 20) = 20
write(1, "file: 7 rc: Success\n"..., 20) = 20
write(1, "file: 8 rc: Success\n"..., 20) = 20
write(1, "file: 9 rc: Success\n"..., 20) = 20
write(1, "file: 10 rc: Success\n"..., 21) = 21
write(1, "file: 11 rc: Success\n"..., 21) = 21
write(1, "file: 12 rc: Success\n"..., 21) = 21
write(1, "file: 13 rc: Success\n"..., 21) = 21
write(1, "file: 14 rc: Success\n"..., 21) = 21
write(1, "file: 15 rc: Success\n"..., 21) = 21
write(1, "file: 16 rc: Success\n"..., 21) = 21
write(1, "file: 17 rc: Success\n"..., 21) = 21
write(1, "file: 18 rc: Success\n"..., 21) = 21
write(1, "file: 19 rc: Success\n"..., 21) = 21
write(1, "file: 20 rc: Success\n"..., 21) = 21
write(1, "file: 21 rc: Success\n"..., 21) = 21
write(1, "file: 22 rc: Success\n"..., 21) = 21
write(1, "file: 23 rc: Success\n"..., 21) = 21
write(1, "file: 24 rc: Success\n"..., 21) = 21
write(1, "file: 25 rc: Success\n"..., 21) = 21
write(1, "file: 26 rc: Success\n"..., 21) = 21
write(1, "file: 27 rc: Success\n"..., 21) = 21
write(1, "file: 28 rc: Success\n"..., 21) = 21
write(1, "file: 29 rc: Success\n"..., 21) = 21
write(1, "file: 30 rc: Success\n"..., 21) = 21
write(1, "file: 31 rc: Success\n"..., 21) = 21
write(1, "file: 32 rc: Success\n"..., 21) = 21
write(1, "file: 33 rc: Success\n"..., 21) = 21
write(1, "file: 34 rc: Success\n"..., 21) = 21
write(1, "file: 35 rc: Success\n"..., 21) = 21
write(1, "file: 36 rc: Success\n"..., 21) = 21
write(1, "file: 37 rc: Success\n"..., 21) = 21
write(1, "file: 38 rc: Success\n"..., 21) = 21
write(1, "file: 39 rc: Success\n"..., 21) = 21
write(1, "file: 40 rc: Success\n"..., 21) = 21
write(1, "file: 41 rc: Success\n"..., 21) = 21
write(1, "file: 42 rc: Success\n"..., 21) = 21
write(1, "file: 43 rc: Success\n"..., 21) = 21
write(1, "file: 44 rc: Success\n"..., 21) = 21
write(1, "file: 45 rc: Success\n"..., 21) = 21
write(1, "file: 46 rc: Success\n"..., 21) = 21
write(1, "file: 47 rc: Success\n"..., 21) = 21
write(1, "file: 48 rc: Success\n"..., 21) = 21
write(1, "file: 49 rc: Success\n"..., 21) = 21
write(1, "file: 50 rc: Success\n"..., 21) = 21
write(1, "file: 51 rc: Success\n"..., 21) = 21
write(1, "file: 52 rc: Success\n"..., 21) = 21
write(1, "file: 53 rc: Success\n"..., 21) = 21
write(1, "file: 54 rc: Success\n"..., 21) = 21
write(1, "file: 55 rc: Success\n"..., 21) = 21
write(1, "file: 56 rc: Success\n"..., 21) = 21
write(1, "file: 57 rc: Success\n"..., 21) = 21
write(1, "file: 58 rc: Success\n"..., 21) = 21
write(1, "file: 59 rc: Success\n"..., 21) = 21
write(1, "file: 60 rc: Success\n"..., 21) = 21
write(1, "file: 61 rc: Success\n"..., 21) = 21
write(1, "file: 62 rc: Success\n"..., 21) = 21
write(1, "file: 63 rc: Success\n"..., 21) = 21
write(1, "file: 64 rc: Success\n"..., 21) = 21
write(1, "file: 65 rc: Success\n"..., 21) = 21
write(1, "file: 66 rc: Success\n"..., 21) = 21
write(1, "file: 67 rc: Success\n"..., 21) = 21
write(1, "file: 68 rc: Success\n"..., 21) = 21
write(1, "file: 69 rc: Success\n"..., 21) = 21
write(1, "file: 70 rc: Success\n"..., 21) = 21
write(1, "file: 71 rc: Success\n"..., 21) = 21
write(1, "file: 72 rc: Success\n"..., 21) = 21
write(1, "file: 73 rc: Success\n"..., 21) = 21
write(1, "file: 74 rc: Success\n"..., 21) = 21
write(1, "file: 75 rc: Success\n"..., 21) = 21
write(1, "file: 76 rc: Success\n"..., 21) = 21
write(1, "file: 77 rc: Success\n"..., 21) = 21
write(1, "file: 78 rc: Success\n"..., 21) = 21
write(1, "file: 79 rc: Success\n"..., 21) = 21
write(1, "file: 80 rc: Success\n"..., 21) = 21
write(1, "file: 81 rc: Success\n"..., 21) = 21
write(1, "file: 82 rc: Success\n"..., 21) = 21
write(1, "file: 83 rc: Success\n"..., 21) = 21
write(1, "file: 84 rc: Success\n"..., 21) = 21
write(1, "file: 85 rc: Success\n"..., 21) = 21
write(1, "file: 86 rc: Success\n"..., 21) = 21
write(1, "file: 87 rc: Success\n"..., 21) = 21
write(1, "file: 88 rc: Success\n"..., 21) = 21
write(1, "file: 89 rc: Success\n"..., 21) = 21
write(1, "file: 90 rc: Success\n"..., 21) = 21
write(1, "file: 91 rc: Success\n"..., 21) = 21
write(1, "file: 92 rc: Success\n"..., 21) = 21
write(1, "file: 93 rc: Success\n"..., 21) = 21
write(1, "file: 94 rc: Success\n"..., 21) = 21
write(1, "file: 95 rc: Success\n"..., 21) = 21
write(1, "file: 96 rc: Success\n"..., 21) = 21
write(1, "file: 97 rc: Success\n"..., 21) = 21
write(1, "file: 98 rc: Success\n"..., 21) = 21
write(1, "file: 99 rc: Success\n"..., 21) = 21
write(1, "file: 100 rc: Success\n"..., 22) = 22
write(1, "file: 101 rc: Success\n"..., 22) = 22
write(1, "file: 102 rc: Success\n"..., 22) = 22
write(1, "file: 103 rc: Success\n"..., 22) = 22
write(1, "file: 104 rc: Success\n"..., 22) = 22
write(1, "file: 105 rc: Success\n"..., 22) = 22
write(1, "file: 106 rc: Success\n"..., 22) = 22
write(1, "file: 107 rc: Success\n"..., 22) = 22
write(1, "file: 108 rc: Success\n"..., 22) = 22
write(1, "file: 109 rc: Success\n"..., 22) = 22
write(1, "file: 110 rc: Success\n"..., 22) = 22
write(1, "file: 111 rc: Success\n"..., 22) = 22
write(1, "file: 112 rc: Success\n"..., 22) = 22
write(1, "file: 113 rc: Success\n"..., 22) = 22
write(1, "file: 114 rc: Success\n"..., 22) = 22
write(1, "file: 115 rc: Success\n"..., 22) = 22
write(1, "file: 116 rc: Success\n"..., 22) = 22
write(1, "file: 117 rc: Success\n"..., 22) = 22
write(1, "file: 118 rc: Success\n"..., 22) = 22
write(1, "file: 119 rc: Success\n"..., 22) = 22
write(1, "file: 120 rc: Success\n"..., 22) = 22
write(1, "file: 121 rc: Success\n"..., 22) = 22
write(1, "file: 122 rc: Success\n"..., 22) = 22
write(1, "file: 123 rc: Success\n"..., 22) = 22
write(1, "file: 124 rc: Success\n"..., 22) = 22
write(1, "file: 125 rc: Success\n"..., 22) = 22
write(1, "file: 126 rc: Success\n"..., 22) = 22
write(1, "file: 127 rc: Success\n"..., 22) = 22
write(1, "file: 128 rc: Success\n"..., 22) = 22
write(1, "file: 129 rc: Success\n"..., 22) = 22
write(1, "file: 130 rc: Success\n"..., 22) = 22
write(1, "file: 131 rc: Success\n"..., 22) = 22
write(1, "file: 132 rc: Success\n"..., 22) = 22
write(1, "file: 133 rc: Success\n"..., 22) = 22
write(1, "file: 134 rc: Success\n"..., 22) = 22
write(1, "file: 135 rc: Success\n"..., 22) = 22
write(1, "file: 136 rc: Success\n"..., 22) = 22
write(1, "file: 137 rc: Success\n"..., 22) = 22
write(1, "file: 138 rc: Success\n"..., 22) = 22
write(1, "file: 139 rc: Success\n"..., 22) = 22
write(1, "file: 140 rc: Success\n"..., 22) = 22
write(1, "file: 141 rc: Success\n"..., 22) = 22
write(1, "file: 142 rc: Success\n"..., 22) = 22
write(1, "file: 143 rc: Success\n"..., 22) = 22
write(1, "file: 144 rc: Success\n"..., 22) = 22
write(1, "file: 145 rc: Success\n"..., 22) = 22
write(1, "file: 146 rc: Success\n"..., 22) = 22
write(1, "file: 147 rc: Success\n"..., 22) = 22
write(1, "file: 148 rc: Success\n"..., 22) = 22
write(1, "file: 149 rc: Success\n"..., 22) = 22
write(1, "file: 150 rc: Success\n"..., 22) = 22
write(1, "file: 151 rc: Success\n"..., 22) = 22
write(1, "file: 152 rc: Success\n"..., 22) = 22
write(1, "file: 153 rc: Success\n"..., 22) = 22
write(1, "file: 154 rc: Success\n"..., 22) = 22
write(1, "file: 155 rc: Success\n"..., 22) = 22
write(1, "file: 156 rc: Success\n"..., 22) = 22
write(1, "file: 157 rc: Success\n"..., 22) = 22
write(1, "file: 158 rc: Success\n"..., 22) = 22
write(1, "file: 159 rc: Success\n"..., 22) = 22
write(1, "file: 160 rc: Success\n"..., 22) = 22
write(1, "file: 161 rc: Success\n"..., 22) = 22
write(1, "file: 162 rc: Success\n"..., 22) = 22
write(1, "file: 163 rc: Success\n"..., 22) = 22
write(1, "file: 164 rc: Success\n"..., 22) = 22
write(1, "file: 165 rc: Success\n"..., 22) = 22
write(1, "file: 166 rc: Success\n"..., 22) = 22
write(1, "file: 167 rc: Success\n"..., 22) = 22
write(1, "file: 168 rc: Success\n"..., 22) = 22
getdents64(3, /* 0 entries */, 4096)    = 0
write(1, "Finished with rc: Success (0)\n"..., 30) = 30
exit_group(0)                           = ?

----------------------------------------------------------------------


-- 
Configure bugmail: http://oss.sgi.com/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.

<Prev in Thread] Current Thread [Next in Thread>