PING .... any comments on this patch, or the problem it tries to address? Thanks, NeilBrown
On Fri, Jun 03 2016, NeilBrown wrote: > When a byte range lock (or flock) is taken out on an NFS file, the > validity of the cached data is checked and the inode is marked > NFS_INODE_INVALID_DATA. However the cached data isn't flushed from > the page cache. > > This is sufficient for future read() requests or mmap() requests as > they call nfs_revalidate_mapping() which performs the flush if > necessary. > > However an existing mapping is not affected. Accessing data through > that mapping will continue to return old data even though the inode is > marked NFS_INODE_INVALID_DATA. > > This can easily be confirmed using the 'nfs' tool in > git://github.com/okirch/twopence-nfs.git > and running > > nfs coherence FILENAME > on one client, and > nfs coherence -r FILENAME > on another client. > > It appears that prior to Linux 2.6.0 this worked correctly. > > However commit: > > http://git.kernel.org/cgit/linux/kernel/git/history/history.git/commit/?id=ca9268fe3ddd075714005adecd4afbd7f9ab87d0 > > removed the call to inode_invalidate_pages() from nfs_zap_caches(). I > haven't tested this code, but inspection suggests that prior to this > commit, file locking would invalidate all inode pages. > > This patch adds a call to nfs_revalidate_mapping_protected() after a > successful SETLK so that invalid data is flushed. With this patch the > above test passes. > > Cc: Olaf Kirch <okir@xxxxxxxx> > Signed-off-by: NeilBrown <neilb@xxxxxxxx> > --- > fs/nfs/file.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/fs/nfs/file.c b/fs/nfs/file.c > index 717a8d6af52d..781cc6c9c60b 100644 > --- a/fs/nfs/file.c > +++ b/fs/nfs/file.c > @@ -822,6 +822,7 @@ do_setlk(struct file *filp, int cmd, struct file_lock *fl, int is_local) > __nfs_revalidate_inode(NFS_SERVER(inode), inode); > else > nfs_zap_caches(inode); > + nfs_revalidate_mapping_protected(inode, filp->f_mapping); > } > out: > return status; > -- > 2.8.3
Attachment:
signature.asc
Description: PGP signature