From: Kenneth D. <kd...@ar...> - 2006-04-16 20:58:35
|
Hi folks, This patch fixes a bug in Squashfs-3.0. The bug is tickled by nfs-mounting a squashfs, and then running "ls" on a large directory on the nfs client. The bug is that squashfs_readdir() was returning dirs_read (a positive number) when the filldir function returns -1. What it's supposed to do is return 0. Most callers of readdir() don't care, but nfsd is particularly picky about return codes, and regards any non-zero return as an error, and if it doesn't recognize the error code, nfsd passes nfserror_io back to the client, which then translates to EIO. Only large directories are affected, of course, because as long as filldir() returns 0, there are no issues. It's only when readdir() fills up the caller's result buffer that the bug occurs. The patch simply changes squashfs_readdir() to return 0 when the call to filldir() indicates that the readdir caller's buffer is full (changing "goto finish" to "return 0"). Sorry for the patch's funny format. We are maintaining a squashfs rpm that basically contains nothing but patches against kernel code, so this patch is a patch on a patch. I hope this is helpful. Please let me know if there's anything I can do to ease this patch's acceptance into the squashfs mainline. Thanks, -Ken =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D diff -BurN squashfs3.0.orig/linux-2.6.8.1/squashfs3.0-patch squashfs3.0/linux-2.6.8.1/squashfs3.0-patch --- squashfs3.0.orig/linux-2.6.8.1/squashfs3.0-patch 2006-03-15 23:39:58.000000000 +0000 +++ squashfs3.0/linux-2.6.8.1/squashfs3.0-patch 2006-04-05 00:13:46.000000000 +0000 @@ -1967,7 +1967,7 @@ + squashfs_filetype_table[dire->type]= ) + < 0) { + TRACE("Filldir returned less than 0\n"); -+ goto finish; ++ return 0; + } + file->f_pos =3D length; + dirs_read++; |