http://bugzilla.novell.com/show_bug.cgi?id=584720 http://bugzilla.novell.com/show_bug.cgi?id=584720#c4 Neil Brown <nfbrown@novell.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED --- Comment #4 from Neil Brown <nfbrown@novell.com> 2010-04-20 07:07:48 UTC --- I can duplicate something that is at least a lot like this. If the name you give to "ls -l" includes any path components that are in the NFS filesystem the you see changes immediately, if not you don't. So if "/mnt" is a mount point then while true; do sleep 0.9; ls -l /mnt/foo ; done will immediately show changes to 'foo', while cd /mnt/foo while true; do sleep 0.9 ; ls -l . ; done will not. "ls -l /mnt" acts like "ls -l ." because no part of "/mnt" is within the mounted filesystem. This inconsistency could certainly be seen as a bug. NFS normally claims 'close-to-open' consistency, which means if one process updates a file then closes it, and another process subsequently opens the file (with the open being after the close) then the second process will see the changes even if it is on another host. I'm not sure if this is supposed to apply equally to directories and it cannot apply exactly as you don't open a directory in order to change it. However the equivalent should be that if you open a directory to read from it after a change has been made, you should see that change. When opening the mount point or the current directory, NFS is never told that the directory was opened. The first it knows about it is a readdir request against an inode which was a mountpoint or current directory. For other directories to does the equivalent of 'open' processing during the lookup of the name of the directory. but these two directories don't have names (in the same sense). So that doesn't work. A possible solution would to revalidate the directory at the start of readdir if f_pos is zero. i.e diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index a1f6b44..df4f0a6 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -560,6 +560,9 @@ static int nfs_readdir(struct file *filp, void *dirent, filldir_t filldir) desc->entry = &my_entry; nfs_block_sillyrename(dentry); + if (filp->f_pos == 0) + /* Force attribute validity at open */ + NFS_I(inode)->cache_validity |= NFS_INO_REVAL_PAGECACHE; res = nfs_revalidate_mapping(inode, filp->f_mapping); if (res < 0) goto out; This appears to work, but may be over-zealous. I'll ask upstream. This does not address the fact that you sometimes get 'stale file handle'. I have managed to reproduce that though only once and with slightly older kernels. I might explore that side again once this side is resolved. -- Configure bugmail: http://bugzilla.novell.com/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- You are on the CC list for the bug.