NFS: Don't write enable new pages while an invalidation is proceeding
authorTrond Myklebust <trond.myklebust@primarydata.com>
Tue, 3 Mar 2015 05:06:35 +0000 (00:06 -0500)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Tue, 3 Mar 2015 18:58:08 +0000 (13:58 -0500)
nfs_vm_page_mkwrite() should wait until the page cache invalidation
is finished. This is the second patch in a 2 patch series to deprecate
the NFS client's reliance on nfs_release_page() in the context of
nfs_invalidate_mapping().

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/file.c
fs/nfs/inode.c

index 41963ffca597f9fec748576ba4186f15a639fc10..e679d24c39d3a57d5ef510a22d5ccbe2832c5335 100644 (file)
@@ -623,6 +623,9 @@ static int nfs_vm_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
        /* make sure the cache has finished storing the page */
        nfs_fscache_wait_on_page_write(NFS_I(inode), page);
 
+       wait_on_bit_action(&NFS_I(inode)->flags, NFS_INO_INVALIDATING,
+                       nfs_wait_bit_killable, TASK_KILLABLE);
+
        lock_page(page);
        mapping = page_file_mapping(page);
        if (mapping != inode->i_mapping)
index 8edb7d049565a8b82dbe0db42555384aa3fcdcd2..d42dff6d5e983f65c2e2f299e12d5353f54236c7 100644 (file)
@@ -1035,6 +1035,7 @@ static int nfs_invalidate_mapping(struct inode *inode, struct address_space *map
 
        if (mapping->nrpages != 0) {
                if (S_ISREG(inode->i_mode)) {
+                       unmap_mapping_range(mapping, 0, 0, 0);
                        ret = nfs_sync_mapping(mapping);
                        if (ret < 0)
                                return ret;