Re: 2.6.xx: NFS: directory motion/cam2 contains a readdir loop

From: Christoph Hellwig
Date: Wed Jul 27 2011 - 14:11:25 EST


Justin,

can you please run the attached test program on the affected directory
on the server, and see if you see duplicates in the d_off colum. Unless
you have privacy concerns I would also love to see the full output.

#define _GNU_SOURCE

#include <dirent.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/syscall.h>

#define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0)

struct linux_dirent64 {
unsigned long long d_ino;
long long d_off;
unsigned short d_reclen;
unsigned char d_type;
char d_name[];
};

#define BUF_SIZE 131072

int main(int argc, char *argv[])
{
int fd, nread;
char buf[BUF_SIZE];
struct linux_dirent64 *d;
int bpos;

fd = open(argc > 1 ? argv[1] : ".", O_RDONLY | O_DIRECTORY);
if (fd == -1)
handle_error("open");

for (;;) {
nread = syscall(SYS_getdents64, fd, buf, BUF_SIZE);
if (nread == -1)
handle_error("getdents");

if (nread == 0)
break;

printf("--------------- nread=%d ---------------\n", nread);
printf("i-node# type d_reclen d_off d_name\n");
for (bpos = 0; bpos < nread;) {
d = (struct linux_dirent64 *)(buf + bpos);
printf("%16lld ", d->d_ino);
printf("%4d %10lld %s\n", d->d_reclen,
d->d_off, d->d_name);
bpos += d->d_reclen;
}
}

exit(EXIT_SUCCESS);
}