diff options
Diffstat (limited to 'fs/inode.c')
-rw-r--r-- | fs/inode.c | 65 |
1 files changed, 4 insertions, 61 deletions
diff --git a/fs/inode.c b/fs/inode.c index ab43db313517..77dacd47b492 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -84,7 +84,6 @@ static struct hlist_head *inode_hashtable __read_mostly; * NOTE! You also have to own the lock if you change * the i_state of an inode while it is in use.. */ -DEFINE_SPINLOCK(inode_lock); DEFINE_SPINLOCK(sb_inode_list_lock); DEFINE_SPINLOCK(wb_inode_list_lock); DEFINE_SPINLOCK(inode_hash_lock); @@ -355,16 +354,14 @@ static void dispose_list(struct list_head *head) truncate_inode_pages(&inode->i_data, 0); clear_inode(inode); - spin_lock(&inode_lock); spin_lock(&sb_inode_list_lock); spin_lock(&inode->i_lock); spin_lock(&inode_hash_lock); hlist_del_init(&inode->i_hash); spin_unlock(&inode_hash_lock); list_del_init(&inode->i_sb_list); - spin_unlock(&sb_inode_list_lock); spin_unlock(&inode->i_lock); - spin_unlock(&inode_lock); + spin_unlock(&sb_inode_list_lock); wake_up_inode(inode); destroy_inode(inode); @@ -392,7 +389,6 @@ static int invalidate_list(struct list_head *head, struct list_head *dispose) * change during umount anymore, and because iprune_sem keeps * shrink_icache_memory() away. */ - cond_resched_lock(&inode_lock); cond_resched_lock(&sb_inode_list_lock); next = next->next; @@ -437,13 +433,11 @@ int invalidate_inodes(struct super_block *sb) LIST_HEAD(throw_away); down_write(&iprune_sem); - spin_lock(&inode_lock); spin_lock(&sb_inode_list_lock); inotify_unmount_inodes(&sb->s_inodes); fsnotify_unmount_inodes(&sb->s_inodes); busy = invalidate_list(&sb->s_inodes, &throw_away); spin_unlock(&sb_inode_list_lock); - spin_unlock(&inode_lock); dispose_list(&throw_away); up_write(&iprune_sem); @@ -486,7 +480,6 @@ static void prune_icache(int nr_to_scan) unsigned long reap = 0; down_read(&iprune_sem); - spin_lock(&inode_lock); again: spin_lock(&wb_inode_list_lock); for (nr_scanned = 0; nr_scanned < nr_to_scan; nr_scanned++) { @@ -510,12 +503,10 @@ again: spin_unlock(&wb_inode_list_lock); __iget(inode); spin_unlock(&inode->i_lock); - spin_unlock(&inode_lock); if (remove_inode_buffers(inode)) reap += invalidate_mapping_pages(&inode->i_data, 0, -1); iput(inode); - spin_lock(&inode_lock); again2: spin_lock(&wb_inode_list_lock); @@ -542,7 +533,6 @@ again2: __count_vm_events(KSWAPD_INODESTEAL, reap); else __count_vm_events(PGINODESTEAL, reap); - spin_unlock(&inode_lock); spin_unlock(&wb_inode_list_lock); dispose_list(&freeable); @@ -693,12 +683,10 @@ void inode_add_to_lists(struct super_block *sb, struct inode *inode) { struct hlist_head *head = inode_hashtable + hash(sb, inode->i_ino); - spin_lock(&inode_lock); spin_lock(&sb_inode_list_lock); spin_lock(&inode->i_lock); __inode_add_to_lists(sb, head, inode); spin_unlock(&inode->i_lock); - spin_unlock(&inode_lock); } EXPORT_SYMBOL_GPL(inode_add_to_lists); @@ -724,18 +712,14 @@ struct inode *new_inode(struct super_block *sb) static atomic_t last_ino = ATOMIC_INIT(0); struct inode *inode; - spin_lock_prefetch(&inode_lock); - inode = alloc_inode(sb); if (inode) { - spin_lock(&inode_lock); spin_lock(&sb_inode_list_lock); spin_lock(&inode->i_lock); inode->i_ino = atomic_inc_return(&last_ino); inode->i_state = 0; __inode_add_to_lists(sb, NULL, inode); spin_unlock(&inode->i_lock); - spin_unlock(&inode_lock); } return inode; } @@ -794,7 +778,6 @@ static struct inode *get_new_inode(struct super_block *sb, if (inode) { struct inode *old; - spin_lock(&inode_lock); /* We released the lock, so.. */ old = find_inode(sb, head, test, data); if (!old) { @@ -806,7 +789,6 @@ static struct inode *get_new_inode(struct super_block *sb, inode->i_state = I_NEW; __inode_add_to_lists(sb, head, inode); spin_unlock(&inode->i_lock); - spin_unlock(&inode_lock); /* Return the locked inode with I_NEW set, the * caller is responsible for filling in the contents @@ -821,7 +803,6 @@ static struct inode *get_new_inode(struct super_block *sb, */ __iget(old); spin_unlock(&old->i_lock); - spin_unlock(&inode_lock); destroy_inode(inode); inode = old; wait_on_inode(inode); @@ -831,7 +812,6 @@ static struct inode *get_new_inode(struct super_block *sb, set_failed: spin_unlock(&inode->i_lock); spin_unlock(&sb_inode_list_lock); - spin_unlock(&inode_lock); destroy_inode(inode); return NULL; } @@ -849,7 +829,6 @@ static struct inode *get_new_inode_fast(struct super_block *sb, if (inode) { struct inode *old; - spin_lock(&inode_lock); /* We released the lock, so.. */ old = find_inode_fast(sb, head, ino); if (!old) { @@ -859,7 +838,6 @@ static struct inode *get_new_inode_fast(struct super_block *sb, inode->i_state = I_NEW; __inode_add_to_lists(sb, head, inode); spin_unlock(&inode->i_lock); - spin_unlock(&inode_lock); /* Return the locked inode with I_NEW set, the * caller is responsible for filling in the contents @@ -874,7 +852,6 @@ static struct inode *get_new_inode_fast(struct super_block *sb, */ __iget(old); spin_unlock(&old->i_lock); - spin_unlock(&inode_lock); destroy_inode(inode); inode = old; wait_on_inode(inode); @@ -924,7 +901,6 @@ ino_t iunique(struct super_block *sb, ino_t max_reserved) struct hlist_head *head; ino_t res; - spin_lock(&inode_lock); spin_lock(&unique_lock); do { if (counter <= max_reserved) @@ -933,7 +909,6 @@ ino_t iunique(struct super_block *sb, ino_t max_reserved) head = inode_hashtable + hash(sb, res); } while (!test_inode_iunique(sb, head, res)); spin_unlock(&unique_lock); - spin_unlock(&inode_lock); return res; } @@ -943,7 +918,6 @@ struct inode *igrab(struct inode *inode) { struct inode *ret = inode; - spin_lock(&inode_lock); spin_lock(&inode->i_lock); if (!(inode->i_state & (I_FREEING|I_CLEAR|I_WILL_FREE))) __iget(inode); @@ -955,7 +929,6 @@ struct inode *igrab(struct inode *inode) */ ret = NULL; spin_unlock(&inode->i_lock); - spin_unlock(&inode_lock); return ret; } @@ -986,17 +959,14 @@ static struct inode *ifind(struct super_block *sb, { struct inode *inode; - spin_lock(&inode_lock); inode = find_inode(sb, head, test, data); if (inode) { __iget(inode); spin_unlock(&inode->i_lock); - spin_unlock(&inode_lock); if (likely(wait)) wait_on_inode(inode); return inode; } - spin_unlock(&inode_lock); return NULL; } @@ -1020,16 +990,13 @@ static struct inode *ifind_fast(struct super_block *sb, { struct inode *inode; - spin_lock(&inode_lock); inode = find_inode_fast(sb, head, ino); if (inode) { __iget(inode); spin_unlock(&inode->i_lock); - spin_unlock(&inode_lock); wait_on_inode(inode); return inode; } - spin_unlock(&inode_lock); return NULL; } @@ -1193,7 +1160,6 @@ int insert_inode_locked(struct inode *inode) struct hlist_node *node; struct inode *old = NULL; - spin_lock(&inode_lock); repeat: spin_lock(&inode_hash_lock); hlist_for_each_entry(old, node, head, i_hash) { @@ -1213,13 +1179,11 @@ repeat: /* XXX: initialize inode->i_lock to locked? */ hlist_add_head(&inode->i_hash, head); spin_unlock(&inode_hash_lock); - spin_unlock(&inode_lock); return 0; } spin_unlock(&inode_hash_lock); __iget(old); spin_unlock(&old->i_lock); - spin_unlock(&inode_lock); wait_on_inode(old); if (unlikely(!hlist_unhashed(&old->i_hash))) { iput(old); @@ -1242,7 +1206,6 @@ int insert_inode_locked4(struct inode *inode, unsigned long hashval, struct hlist_node *node; struct inode *old = NULL; - spin_lock(&inode_lock); repeat: spin_lock(&inode_hash_lock); hlist_for_each_entry(old, node, head, i_hash) { @@ -1262,13 +1225,11 @@ repeat: /* XXX: initialize inode->i_lock to locked? */ hlist_add_head(&inode->i_hash, head); spin_unlock(&inode_hash_lock); - spin_unlock(&inode_lock); return 0; } spin_unlock(&inode_hash_lock); __iget(old); spin_unlock(&old->i_lock); - spin_unlock(&inode_lock); wait_on_inode(old); if (unlikely(!hlist_unhashed(&old->i_hash))) { iput(old); @@ -1291,13 +1252,11 @@ void __insert_inode_hash(struct inode *inode, unsigned long hashval) { struct hlist_head *head = inode_hashtable + hash(inode->i_sb, hashval); - spin_lock(&inode_lock); spin_lock(&inode->i_lock); spin_lock(&inode_hash_lock); hlist_add_head(&inode->i_hash, head); spin_unlock(&inode_hash_lock); spin_unlock(&inode->i_lock); - spin_unlock(&inode_lock); } EXPORT_SYMBOL(__insert_inode_hash); @@ -1309,13 +1268,11 @@ EXPORT_SYMBOL(__insert_inode_hash); */ void remove_inode_hash(struct inode *inode) { - spin_lock(&inode_lock); spin_lock(&inode->i_lock); spin_lock(&inode_hash_lock); hlist_del_init(&inode->i_hash); spin_unlock(&inode_hash_lock); spin_unlock(&inode->i_lock); - spin_unlock(&inode_lock); } EXPORT_SYMBOL(remove_inode_hash); @@ -1343,7 +1300,6 @@ void generic_delete_inode(struct inode *inode) WARN_ON(inode->i_state & I_NEW); inode->i_state |= I_FREEING; spin_unlock(&inode->i_lock); - spin_unlock(&inode_lock); atomic_dec(&inodes_stat.nr_inodes); security_inode_delete(inode); @@ -1361,13 +1317,11 @@ void generic_delete_inode(struct inode *inode) truncate_inode_pages(&inode->i_data, 0); clear_inode(inode); } - spin_lock(&inode_lock); spin_lock(&inode->i_lock); spin_lock(&inode_hash_lock); hlist_del_init(&inode->i_hash); spin_unlock(&inode_hash_lock); spin_unlock(&inode->i_lock); - spin_unlock(&inode_lock); wake_up_inode(inode); BUG_ON(inode->i_state != I_CLEAR); destroy_inode(inode); @@ -1397,16 +1351,13 @@ int generic_detach_inode(struct inode *inode) if (sb->s_flags & MS_ACTIVE) { spin_unlock(&inode->i_lock); spin_unlock(&sb_inode_list_lock); - spin_unlock(&inode_lock); return 0; } WARN_ON(inode->i_state & I_NEW); inode->i_state |= I_WILL_FREE; spin_unlock(&inode->i_lock); spin_unlock(&sb_inode_list_lock); - spin_unlock(&inode_lock); write_inode_now(inode, 1); - spin_lock(&inode_lock); spin_lock(&sb_inode_list_lock); spin_lock(&inode->i_lock); WARN_ON(inode->i_state & I_NEW); @@ -1424,7 +1375,6 @@ int generic_detach_inode(struct inode *inode) WARN_ON(inode->i_state & I_NEW); inode->i_state |= I_FREEING; spin_unlock(&inode->i_lock); - spin_unlock(&inode_lock); atomic_dec(&inodes_stat.nr_inodes); return 1; } @@ -1490,17 +1440,12 @@ void iput(struct inode *inode) if (inode) { BUG_ON(inode->i_state == I_CLEAR); -retry1: +retry: spin_lock(&inode->i_lock); if (inode->i_count == 1) { - if (!spin_trylock(&inode_lock)) { -retry2: - spin_unlock(&inode->i_lock); - goto retry1; - } if (!spin_trylock(&sb_inode_list_lock)) { - spin_unlock(&inode_lock); - goto retry2; + spin_unlock(&inode->i_lock); + goto retry; } inode->i_count--; iput_final(inode); @@ -1698,10 +1643,8 @@ static void __wait_on_freeing_inode(struct inode *inode) wq = bit_waitqueue(&inode->i_state, __I_NEW); prepare_to_wait(wq, &wait.wait, TASK_UNINTERRUPTIBLE); spin_unlock(&inode->i_lock); - spin_unlock(&inode_lock); schedule(); finish_wait(wq, &wait.wait); - spin_lock(&inode_lock); } static __initdata unsigned long ihash_entries; |