JFS readdir() issues in stable 3.2

From: Richard Weinberger
Date: Fri Mar 20 2015 - 19:34:00 EST


Hi!

Mainline commit 44512449c0ab368889dd13ae0031fba74ee7e1d2
(jfs: fix readdir cookie incompatibility with NFSv4) does not work as expected on 3.2.
Maybe on other stable kernels too.

UML stumbled over it:
https://bugzilla.kernel.org/show_bug.cgi?id=94741

If you run the attached readdir.c on a JFS on stable 3.2.51+ readdir() will not
increment the directory offset nor return NULL, hence the caller will loop forever.
It looks like if the current directory offset is > 0 and you run seekdir(telldir())
the next readdir() call will not increment it.

Dave, has your fix some unnamed dependencies which need backporting too?

Thanks,
//richard
#include <stdio.h>
#include <dirent.h>
#include <assert.h>

int main(int argc, char *argv[])
{
DIR *dirp;
struct dirent *dent;
off_t dpos;

if (argc < 2) {
fprintf(stderr, "Usage: %s DIR\n", argv[0]);
return 1;
}

dirp = opendir(argv[1]);
assert(dirp);
dpos = 0;

for (;;) {
seekdir(dirp, dpos);
dent = readdir(dirp);
if (!dent)
break;
assert(dpos != telldir(dirp));
dpos = telldir(dirp);
}

return 0;
}