aboutsummaryrefslogtreecommitdiffstats
path: root/fs/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/inode.c')
-rw-r--r--fs/inode.c61
1 files changed, 26 insertions, 35 deletions
diff --git a/fs/inode.c b/fs/inode.c
index 1d7ca6ed7dbd..5039ddf4f0e0 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -74,7 +74,6 @@ static unsigned int i_hash_shift __read_mostly;
74 * allowing for low-overhead inode sync() operations. 74 * allowing for low-overhead inode sync() operations.
75 */ 75 */
76 76
77LIST_HEAD(inode_in_use);
78LIST_HEAD(inode_unused); 77LIST_HEAD(inode_unused);
79 78
80struct inode_hash_bucket { 79struct inode_hash_bucket {
@@ -266,6 +265,7 @@ void inode_init_once(struct inode *inode)
266 INIT_HLIST_NODE(&inode->i_hash); 265 INIT_HLIST_NODE(&inode->i_hash);
267 INIT_LIST_HEAD(&inode->i_dentry); 266 INIT_LIST_HEAD(&inode->i_dentry);
268 INIT_LIST_HEAD(&inode->i_devices); 267 INIT_LIST_HEAD(&inode->i_devices);
268 INIT_LIST_HEAD(&inode->i_list);
269 INIT_RADIX_TREE(&inode->i_data.page_tree, GFP_ATOMIC); 269 INIT_RADIX_TREE(&inode->i_data.page_tree, GFP_ATOMIC);
270 spin_lock_init(&inode->i_data.tree_lock); 270 spin_lock_init(&inode->i_data.tree_lock);
271 spin_lock_init(&inode->i_data.i_mmap_lock); 271 spin_lock_init(&inode->i_data.i_mmap_lock);
@@ -291,24 +291,6 @@ static void init_once(void *foo)
291 inode_init_once(inode); 291 inode_init_once(inode);
292} 292}
293 293
294/*
295 * inode_lock must be held
296 */
297void __iget(struct inode *inode)
298{
299 assert_spin_locked(&inode->i_lock);
300 inode->i_count++;
301 if (inode->i_count > 1)
302 return;
303
304 if (!(inode->i_state & (I_DIRTY|I_SYNC))) {
305 spin_lock(&wb_inode_list_lock);
306 list_move(&inode->i_list, &inode_in_use);
307 spin_unlock(&wb_inode_list_lock);
308 }
309 atomic_dec(&inodes_stat.nr_unused);
310}
311
312/** 294/**
313 * clear_inode - clear an inode 295 * clear_inode - clear an inode
314 * @inode: inode to clear 296 * @inode: inode to clear
@@ -352,7 +334,7 @@ static void dispose_list(struct list_head *head)
352 struct inode *inode; 334 struct inode *inode;
353 335
354 inode = list_first_entry(head, struct inode, i_list); 336 inode = list_first_entry(head, struct inode, i_list);
355 list_del(&inode->i_list); 337 list_del_init(&inode->i_list);
356 338
357 if (inode->i_data.nrpages) 339 if (inode->i_data.nrpages)
358 truncate_inode_pages(&inode->i_data, 0); 340 truncate_inode_pages(&inode->i_data, 0);
@@ -405,11 +387,12 @@ static int invalidate_list(struct list_head *head, struct list_head *dispose)
405 invalidate_inode_buffers(inode); 387 invalidate_inode_buffers(inode);
406 if (!inode->i_count) { 388 if (!inode->i_count) {
407 spin_lock(&wb_inode_list_lock); 389 spin_lock(&wb_inode_list_lock);
408 list_move(&inode->i_list, dispose); 390 list_del(&inode->i_list);
409 spin_unlock(&wb_inode_list_lock); 391 spin_unlock(&wb_inode_list_lock);
410 WARN_ON(inode->i_state & I_NEW); 392 WARN_ON(inode->i_state & I_NEW);
411 inode->i_state |= I_FREEING; 393 inode->i_state |= I_FREEING;
412 spin_unlock(&inode->i_lock); 394 spin_unlock(&inode->i_lock);
395 list_add(&inode->i_list, dispose);
413 count++; 396 count++;
414 continue; 397 continue;
415 } 398 }
@@ -496,7 +479,13 @@ again:
496 spin_unlock(&wb_inode_list_lock); 479 spin_unlock(&wb_inode_list_lock);
497 goto again; 480 goto again;
498 } 481 }
499 if (inode->i_state || inode->i_count) { 482 if (inode->i_count) {
483 list_del_init(&inode->i_list);
484 spin_unlock(&inode->i_lock);
485 atomic_dec(&inodes_stat.nr_unused);
486 continue;
487 }
488 if (inode->i_state) {
500 list_move(&inode->i_list, &inode_unused); 489 list_move(&inode->i_list, &inode_unused);
501 spin_unlock(&inode->i_lock); 490 spin_unlock(&inode->i_lock);
502 continue; 491 continue;
@@ -512,6 +501,7 @@ again:
512again2: 501again2:
513 spin_lock(&wb_inode_list_lock); 502 spin_lock(&wb_inode_list_lock);
514 503
504 /* XXX: may no longer work well */
515 if (inode != list_entry(inode_unused.next, 505 if (inode != list_entry(inode_unused.next,
516 struct inode, i_list)) 506 struct inode, i_list))
517 continue; /* wrong inode or list_empty */ 507 continue; /* wrong inode or list_empty */
@@ -660,9 +650,6 @@ __inode_add_to_lists(struct super_block *sb, struct inode_hash_bucket *b,
660 atomic_inc(&inodes_stat.nr_inodes); 650 atomic_inc(&inodes_stat.nr_inodes);
661 list_add(&inode->i_sb_list, &sb->s_inodes); 651 list_add(&inode->i_sb_list, &sb->s_inodes);
662 spin_unlock(&sb_inode_list_lock); 652 spin_unlock(&sb_inode_list_lock);
663 spin_lock(&wb_inode_list_lock);
664 list_add(&inode->i_list, &inode_in_use);
665 spin_unlock(&wb_inode_list_lock);
666 if (b) { 653 if (b) {
667 spin_lock(&b->lock); 654 spin_lock(&b->lock);
668 hlist_add_head(&inode->i_hash, &b->head); 655 hlist_add_head(&inode->i_hash, &b->head);
@@ -1311,9 +1298,11 @@ void generic_delete_inode(struct inode *inode)
1311{ 1298{
1312 const struct super_operations *op = inode->i_sb->s_op; 1299 const struct super_operations *op = inode->i_sb->s_op;
1313 1300
1314 spin_lock(&wb_inode_list_lock); 1301 if (!list_empty(&inode->i_list)) {
1315 list_del_init(&inode->i_list); 1302 spin_lock(&wb_inode_list_lock);
1316 spin_unlock(&wb_inode_list_lock); 1303 list_del_init(&inode->i_list);
1304 spin_unlock(&wb_inode_list_lock);
1305 }
1317 list_del_init(&inode->i_sb_list); 1306 list_del_init(&inode->i_sb_list);
1318 spin_unlock(&sb_inode_list_lock); 1307 spin_unlock(&sb_inode_list_lock);
1319 WARN_ON(inode->i_state & I_NEW); 1308 WARN_ON(inode->i_state & I_NEW);
@@ -1365,12 +1354,12 @@ int generic_detach_inode(struct inode *inode)
1365 struct super_block *sb = inode->i_sb; 1354 struct super_block *sb = inode->i_sb;
1366 1355
1367 if (!hlist_unhashed(&inode->i_hash)) { 1356 if (!hlist_unhashed(&inode->i_hash)) {
1368 if (!(inode->i_state & (I_DIRTY|I_SYNC))) { 1357 if (list_empty(&inode->i_list)) {
1369 spin_lock(&wb_inode_list_lock); 1358 spin_lock(&wb_inode_list_lock);
1370 list_move(&inode->i_list, &inode_unused); 1359 list_add(&inode->i_list, &inode_unused);
1371 spin_unlock(&wb_inode_list_lock); 1360 spin_unlock(&wb_inode_list_lock);
1361 atomic_inc(&inodes_stat.nr_unused);
1372 } 1362 }
1373 atomic_inc(&inodes_stat.nr_unused);
1374 if (sb->s_flags & MS_ACTIVE) { 1363 if (sb->s_flags & MS_ACTIVE) {
1375 spin_unlock(&inode->i_lock); 1364 spin_unlock(&inode->i_lock);
1376 spin_unlock(&sb_inode_list_lock); 1365 spin_unlock(&sb_inode_list_lock);
@@ -1386,11 +1375,13 @@ int generic_detach_inode(struct inode *inode)
1386 WARN_ON(inode->i_state & I_NEW); 1375 WARN_ON(inode->i_state & I_NEW);
1387 inode->i_state &= ~I_WILL_FREE; 1376 inode->i_state &= ~I_WILL_FREE;
1388 __remove_inode_hash(inode); 1377 __remove_inode_hash(inode);
1378 }
1379 if (!list_empty(&inode->i_list)) {
1380 spin_lock(&wb_inode_list_lock);
1381 list_del_init(&inode->i_list);
1382 spin_unlock(&wb_inode_list_lock);
1389 atomic_dec(&inodes_stat.nr_unused); 1383 atomic_dec(&inodes_stat.nr_unused);
1390 } 1384 }
1391 spin_lock(&wb_inode_list_lock);
1392 list_del_init(&inode->i_list);
1393 spin_unlock(&wb_inode_list_lock);
1394 list_del_init(&inode->i_sb_list); 1385 list_del_init(&inode->i_sb_list);
1395 spin_unlock(&sb_inode_list_lock); 1386 spin_unlock(&sb_inode_list_lock);
1396 WARN_ON(inode->i_state & I_NEW); 1387 WARN_ON(inode->i_state & I_NEW);
@@ -1726,7 +1717,7 @@ void __init inode_init(void)
1726 1717
1727 inode_hashtable = 1718 inode_hashtable =
1728 alloc_large_system_hash("Inode-cache", 1719 alloc_large_system_hash("Inode-cache",
1729 sizeof(struct hlist_head), 1720 sizeof(struct inode_hash_bucket),
1730 ihash_entries, 1721 ihash_entries,
1731 14, 1722 14,
1732 0, 1723 0,