Hi, On Tue, Oct 19, 2010 at 12:35:40AM +0200, Sylvain Rochet wrote: > > ... upgraded to 2.6.33.5, then 2.6.33.7, finally to 2.6.35.7, and I > always end up with the same ending, it seems inotify can miss some VFS > events from time to time. I finally find out why. The NFS server does not always know the name of the modified file, if the modified inode was cleared from the VFS cache fsnotify does not know as well the filename then inotify child events on directories are silently tossed. Easy way to reproduce: Add a few printk debug (here it only works if /data is the NFS export): --- begin//fs/nfsd/vfs.c 2011-07-22 04:17:23.000000000 +0200 +++ linux-3.0/fs/nfsd/vfs.c 2011-07-30 03:18:17.837560809 +0200 @@ -975,6 +975,8 @@ inode = dentry->d_inode; exp = fhp->fh_export; + printk("nfsd write inode=%ld name=%s\n", inode->i_ino, dentry->d_name.name); + /* * Request sync writes if * - the sync export option has been set, or diff -Nru begin//include/linux/fsnotify.h linux-3.0/include/linux/fsnotify.h --- begin//include/linux/fsnotify.h 2011-07-22 04:17:23.000000000 +0200 +++ linux-3.0/include/linux/fsnotify.h 2011-07-30 03:07:00.330239062 +0200 @@ -216,8 +232,15 @@ mask |= FS_ISDIR; if (!(file->f_mode & FMODE_NONOTIFY)) { + if( !strcmp(path->mnt->mnt_mountpoint->d_name.name, "data") ) + printk("fsnotify modify inode=%ld name=%s\n", inode->i_ino, file->f_dentry->d_name.name); fsnotify_parent(path, NULL, mask); fsnotify(inode, mask, path, FSNOTIFY_EVENT_PATH, NULL, 0); + } else { + if( !strcmp(path->mnt->mnt_mountpoint->d_name.name, "data") ) + printk("fsnotify modify-nonotify inode=%ld name=%s\n", inode->i_ino, file->f_dentry->d_name.name); } } On the NFS client, open a fd and send some data: # exec 1> test # ls -la # On the NFS server, check the kern log: Aug 20 00:57:44 inotifydebug kernel: nfsd write inode=13 name=test Aug 20 00:57:44 inotifydebug kernel: fsnotify modify inode=13 name=test Everything goes well. Now, clear the VFS cache on the NFS server: # echo 3 > /proc/sys/vm/drop_caches On the NFS client, send some data to the fd: # ls -la # On the NFS server, check the kern log: Aug 20 00:58:56 inotifydebug kernel: nfsd write inode=13 name= Aug 20 00:58:56 inotifydebug kernel: fsnotify modify inode=13 name= The filename is lost, fsnotify does not know the filename anymore, therefore inotify cannot send event about a modified file in a watched directory. End of the story. I guess this is almost impossible to fix this fsnotify bug, this is due by the fact that NFS use inode as file identifiers, so in some case this is impossible to know the modified filepath, and therefore impossible to match the file event to the directory watch. Kind regards, Sylvain
Attachment:
signature.asc
Description: Digital signature