aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfs/inode.c')
-rw-r--r--fs/nfs/inode.c37
1 files changed, 34 insertions, 3 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
index 5026c44a98e1..8edb7d049565 100644
--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -1067,11 +1067,14 @@ static bool nfs_mapping_need_revalidate_inode(struct inode *inode)
1067} 1067}
1068 1068
1069/** 1069/**
1070 * nfs_revalidate_mapping - Revalidate the pagecache 1070 * __nfs_revalidate_mapping - Revalidate the pagecache
1071 * @inode - pointer to host inode 1071 * @inode - pointer to host inode
1072 * @mapping - pointer to mapping 1072 * @mapping - pointer to mapping
1073 * @may_lock - take inode->i_mutex?
1073 */ 1074 */
1074int nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping) 1075static int __nfs_revalidate_mapping(struct inode *inode,
1076 struct address_space *mapping,
1077 bool may_lock)
1075{ 1078{
1076 struct nfs_inode *nfsi = NFS_I(inode); 1079 struct nfs_inode *nfsi = NFS_I(inode);
1077 unsigned long *bitlock = &nfsi->flags; 1080 unsigned long *bitlock = &nfsi->flags;
@@ -1120,7 +1123,12 @@ int nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping)
1120 nfsi->cache_validity &= ~NFS_INO_INVALID_DATA; 1123 nfsi->cache_validity &= ~NFS_INO_INVALID_DATA;
1121 spin_unlock(&inode->i_lock); 1124 spin_unlock(&inode->i_lock);
1122 trace_nfs_invalidate_mapping_enter(inode); 1125 trace_nfs_invalidate_mapping_enter(inode);
1123 ret = nfs_invalidate_mapping(inode, mapping); 1126 if (may_lock) {
1127 mutex_lock(&inode->i_mutex);
1128 ret = nfs_invalidate_mapping(inode, mapping);
1129 mutex_unlock(&inode->i_mutex);
1130 } else
1131 ret = nfs_invalidate_mapping(inode, mapping);
1124 trace_nfs_invalidate_mapping_exit(inode, ret); 1132 trace_nfs_invalidate_mapping_exit(inode, ret);
1125 1133
1126 clear_bit_unlock(NFS_INO_INVALIDATING, bitlock); 1134 clear_bit_unlock(NFS_INO_INVALIDATING, bitlock);
@@ -1130,6 +1138,29 @@ out:
1130 return ret; 1138 return ret;
1131} 1139}
1132 1140
1141/**
1142 * nfs_revalidate_mapping - Revalidate the pagecache
1143 * @inode - pointer to host inode
1144 * @mapping - pointer to mapping
1145 */
1146int nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping)
1147{
1148 return __nfs_revalidate_mapping(inode, mapping, false);
1149}
1150
1151/**
1152 * nfs_revalidate_mapping_protected - Revalidate the pagecache
1153 * @inode - pointer to host inode
1154 * @mapping - pointer to mapping
1155 *
1156 * Differs from nfs_revalidate_mapping() in that it grabs the inode->i_mutex
1157 * while invalidating the mapping.
1158 */
1159int nfs_revalidate_mapping_protected(struct inode *inode, struct address_space *mapping)
1160{
1161 return __nfs_revalidate_mapping(inode, mapping, true);
1162}
1163
1133static unsigned long nfs_wcc_update_inode(struct inode *inode, struct nfs_fattr *fattr) 1164static unsigned long nfs_wcc_update_inode(struct inode *inode, struct nfs_fattr *fattr)
1134{ 1165{
1135 struct nfs_inode *nfsi = NFS_I(inode); 1166 struct nfs_inode *nfsi = NFS_I(inode);