diff options
author | Jeff Garzik <jgarzik@pobox.com> | 2006-01-03 19:00:06 +0300 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2006-01-03 19:00:06 +0300 |
commit | 61420e147a706ee7c7a902008045547fb2a2a330 (patch) | |
tree | c5739fe1feac05cac49c96107138520c65f8f657 /fs/nfs/inode.c | |
parent | 3d0a59c02303df01848537b3bf938dc11e9a0ded (diff) | |
parent | a18ceba7b40e24a9da87249bd74f16ea5abd6894 (diff) | |
download | linux-61420e147a706ee7c7a902008045547fb2a2a330.tar.xz |
Merge branch 'upstream'
Diffstat (limited to 'fs/nfs/inode.c')
-rw-r--r-- | fs/nfs/inode.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index afd75d0463fd..432f41cd75e6 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -640,6 +640,27 @@ static int nfs_show_options(struct seq_file *m, struct vfsmount *mnt) return 0; } +/** + * nfs_sync_mapping - helper to flush all mmapped dirty data to disk + */ +int nfs_sync_mapping(struct address_space *mapping) +{ + int ret; + + if (mapping->nrpages == 0) + return 0; + unmap_mapping_range(mapping, 0, 0, 0); + ret = filemap_fdatawrite(mapping); + if (ret != 0) + goto out; + ret = filemap_fdatawait(mapping); + if (ret != 0) + goto out; + ret = nfs_wb_all(mapping->host); +out: + return ret; +} + /* * Invalidate the local caches */ @@ -1179,11 +1200,8 @@ void nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping) struct nfs_inode *nfsi = NFS_I(inode); if (nfsi->cache_validity & NFS_INO_INVALID_DATA) { - if (S_ISREG(inode->i_mode)) { - if (filemap_fdatawrite(mapping) == 0) - filemap_fdatawait(mapping); - nfs_wb_all(inode); - } + if (S_ISREG(inode->i_mode)) + nfs_sync_mapping(mapping); invalidate_inode_pages2(mapping); spin_lock(&inode->i_lock); |