diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2010-06-07 13:43:19 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2010-08-09 16:48:35 -0400 |
commit | 45321ac54316eaeeebde0b5f728a1791e500974c (patch) | |
tree | c3989dd1a8b4a50168d696aa608941de88da9ade /fs/inode.c | |
parent | 30140837f256558c943636245ab90897a9455a70 (diff) |
Make ->drop_inode() just return whether inode needs to be dropped
... and let iput_final() do the actual eviction or retention
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/inode.c')
-rw-r--r-- | fs/inode.c | 113 |
1 files changed, 34 insertions, 79 deletions
diff --git a/fs/inode.c b/fs/inode.c index 82ca3562a688..0e077619cbf6 100644 --- a/fs/inode.c +++ b/fs/inode.c | |||
@@ -1183,58 +1183,51 @@ void remove_inode_hash(struct inode *inode) | |||
1183 | } | 1183 | } |
1184 | EXPORT_SYMBOL(remove_inode_hash); | 1184 | EXPORT_SYMBOL(remove_inode_hash); |
1185 | 1185 | ||
1186 | int generic_delete_inode(struct inode *inode) | ||
1187 | { | ||
1188 | return 1; | ||
1189 | } | ||
1190 | EXPORT_SYMBOL(generic_delete_inode); | ||
1191 | |||
1186 | /* | 1192 | /* |
1187 | * Tell the filesystem that this inode is no longer of any interest and should | 1193 | * Normal UNIX filesystem behaviour: delete the |
1188 | * be completely destroyed. | 1194 | * inode when the usage count drops to zero, and |
1189 | * | 1195 | * i_nlink is zero. |
1190 | * We leave the inode in the inode hash table until *after* the filesystem's | ||
1191 | * ->delete_inode completes. This ensures that an iget (such as nfsd might | ||
1192 | * instigate) will always find up-to-date information either in the hash or on | ||
1193 | * disk. | ||
1194 | * | ||
1195 | * I_FREEING is set so that no-one will take a new reference to the inode while | ||
1196 | * it is being deleted. | ||
1197 | */ | 1196 | */ |
1198 | void generic_delete_inode(struct inode *inode) | 1197 | int generic_drop_inode(struct inode *inode) |
1199 | { | 1198 | { |
1200 | list_del_init(&inode->i_list); | 1199 | return !inode->i_nlink || hlist_unhashed(&inode->i_hash); |
1201 | list_del_init(&inode->i_sb_list); | ||
1202 | WARN_ON(inode->i_state & I_NEW); | ||
1203 | inode->i_state |= I_FREEING; | ||
1204 | inodes_stat.nr_inodes--; | ||
1205 | spin_unlock(&inode_lock); | ||
1206 | |||
1207 | evict(inode); | ||
1208 | |||
1209 | spin_lock(&inode_lock); | ||
1210 | hlist_del_init(&inode->i_hash); | ||
1211 | spin_unlock(&inode_lock); | ||
1212 | wake_up_inode(inode); | ||
1213 | BUG_ON(inode->i_state != (I_FREEING | I_CLEAR)); | ||
1214 | destroy_inode(inode); | ||
1215 | } | 1200 | } |
1216 | EXPORT_SYMBOL(generic_delete_inode); | 1201 | EXPORT_SYMBOL_GPL(generic_drop_inode); |
1217 | 1202 | ||
1218 | /** | 1203 | /* |
1219 | * generic_detach_inode - remove inode from inode lists | 1204 | * Called when we're dropping the last reference |
1220 | * @inode: inode to remove | 1205 | * to an inode. |
1221 | * | ||
1222 | * Remove inode from inode lists, write it if it's dirty. This is just an | ||
1223 | * internal VFS helper exported for hugetlbfs. Do not use! | ||
1224 | * | 1206 | * |
1225 | * Returns 1 if inode should be completely destroyed. | 1207 | * Call the FS "drop_inode()" function, defaulting to |
1208 | * the legacy UNIX filesystem behaviour. If it tells | ||
1209 | * us to evict inode, do so. Otherwise, retain inode | ||
1210 | * in cache if fs is alive, sync and evict if fs is | ||
1211 | * shutting down. | ||
1226 | */ | 1212 | */ |
1227 | static int generic_detach_inode(struct inode *inode) | 1213 | static void iput_final(struct inode *inode) |
1228 | { | 1214 | { |
1229 | struct super_block *sb = inode->i_sb; | 1215 | struct super_block *sb = inode->i_sb; |
1216 | const struct super_operations *op = inode->i_sb->s_op; | ||
1217 | int drop; | ||
1218 | |||
1219 | if (op && op->drop_inode) | ||
1220 | drop = op->drop_inode(inode); | ||
1221 | else | ||
1222 | drop = generic_drop_inode(inode); | ||
1230 | 1223 | ||
1231 | if (!hlist_unhashed(&inode->i_hash)) { | 1224 | if (!drop) { |
1232 | if (!(inode->i_state & (I_DIRTY|I_SYNC))) | 1225 | if (!(inode->i_state & (I_DIRTY|I_SYNC))) |
1233 | list_move(&inode->i_list, &inode_unused); | 1226 | list_move(&inode->i_list, &inode_unused); |
1234 | inodes_stat.nr_unused++; | 1227 | inodes_stat.nr_unused++; |
1235 | if (sb->s_flags & MS_ACTIVE) { | 1228 | if (sb->s_flags & MS_ACTIVE) { |
1236 | spin_unlock(&inode_lock); | 1229 | spin_unlock(&inode_lock); |
1237 | return 0; | 1230 | return; |
1238 | } | 1231 | } |
1239 | WARN_ON(inode->i_state & I_NEW); | 1232 | WARN_ON(inode->i_state & I_NEW); |
1240 | inode->i_state |= I_WILL_FREE; | 1233 | inode->i_state |= I_WILL_FREE; |
@@ -1252,53 +1245,15 @@ static int generic_detach_inode(struct inode *inode) | |||
1252 | inode->i_state |= I_FREEING; | 1245 | inode->i_state |= I_FREEING; |
1253 | inodes_stat.nr_inodes--; | 1246 | inodes_stat.nr_inodes--; |
1254 | spin_unlock(&inode_lock); | 1247 | spin_unlock(&inode_lock); |
1255 | return 1; | ||
1256 | } | ||
1257 | |||
1258 | static void generic_forget_inode(struct inode *inode) | ||
1259 | { | ||
1260 | if (!generic_detach_inode(inode)) | ||
1261 | return; | ||
1262 | evict(inode); | 1248 | evict(inode); |
1249 | spin_lock(&inode_lock); | ||
1250 | hlist_del_init(&inode->i_hash); | ||
1251 | spin_unlock(&inode_lock); | ||
1263 | wake_up_inode(inode); | 1252 | wake_up_inode(inode); |
1253 | BUG_ON(inode->i_state != (I_FREEING | I_CLEAR)); | ||
1264 | destroy_inode(inode); | 1254 | destroy_inode(inode); |
1265 | } | 1255 | } |
1266 | 1256 | ||
1267 | /* | ||
1268 | * Normal UNIX filesystem behaviour: delete the | ||
1269 | * inode when the usage count drops to zero, and | ||
1270 | * i_nlink is zero. | ||
1271 | */ | ||
1272 | void generic_drop_inode(struct inode *inode) | ||
1273 | { | ||
1274 | if (!inode->i_nlink) | ||
1275 | generic_delete_inode(inode); | ||
1276 | else | ||
1277 | generic_forget_inode(inode); | ||
1278 | } | ||
1279 | EXPORT_SYMBOL_GPL(generic_drop_inode); | ||
1280 | |||
1281 | /* | ||
1282 | * Called when we're dropping the last reference | ||
1283 | * to an inode. | ||
1284 | * | ||
1285 | * Call the FS "drop()" function, defaulting to | ||
1286 | * the legacy UNIX filesystem behaviour.. | ||
1287 | * | ||
1288 | * NOTE! NOTE! NOTE! We're called with the inode lock | ||
1289 | * held, and the drop function is supposed to release | ||
1290 | * the lock! | ||
1291 | */ | ||
1292 | static inline void iput_final(struct inode *inode) | ||
1293 | { | ||
1294 | const struct super_operations *op = inode->i_sb->s_op; | ||
1295 | void (*drop)(struct inode *) = generic_drop_inode; | ||
1296 | |||
1297 | if (op && op->drop_inode) | ||
1298 | drop = op->drop_inode; | ||
1299 | drop(inode); | ||
1300 | } | ||
1301 | |||
1302 | /** | 1257 | /** |
1303 | * iput - put an inode | 1258 | * iput - put an inode |
1304 | * @inode: inode to put | 1259 | * @inode: inode to put |