diff options
Diffstat (limited to 'fs/nfs/inode.c')
-rw-r--r-- | fs/nfs/inode.c | 37 |
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 | */ |
1074 | int nfs_revalidate_mapping(struct inode *inode, struct address_space *mapping) | 1075 | static 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 | */ | ||
1146 | int 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 | */ | ||
1159 | int nfs_revalidate_mapping_protected(struct inode *inode, struct address_space *mapping) | ||
1160 | { | ||
1161 | return __nfs_revalidate_mapping(inode, mapping, true); | ||
1162 | } | ||
1163 | |||
1133 | static unsigned long nfs_wcc_update_inode(struct inode *inode, struct nfs_fattr *fattr) | 1164 | static 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); |