diff options
Diffstat (limited to 'fs/inode.c')
-rw-r--r-- | fs/inode.c | 61 |
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 | ||
77 | LIST_HEAD(inode_in_use); | ||
78 | LIST_HEAD(inode_unused); | 77 | LIST_HEAD(inode_unused); |
79 | 78 | ||
80 | struct inode_hash_bucket { | 79 | struct 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 | */ | ||
297 | void __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: | |||
512 | again2: | 501 | again2: |
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, |