remaining links or not.  Caller does *not* evict the pagecache or inode-associated
 metadata buffers; getting rid of those is responsibility of method, as it had
 been for ->delete_inode().
-       ->drop_inode() returns int now; it's called on final iput() with inode_lock
-held and it returns true if filesystems wants the inode to be dropped.  As before,
-generic_drop_inode() is still the default and it's been updated appropriately.
-generic_delete_inode() is also alive and it consists simply of return 1.  Note that
-all actual eviction work is done by caller after ->drop_inode() returns.
+
+       ->drop_inode() returns int now; it's called on final iput() with
+inode->i_lock held and it returns true if filesystems wants the inode to be
+dropped.  As before, generic_drop_inode() is still the default and it's been
+updated appropriately.  generic_delete_inode() is also alive and it consists
+simply of return 1.  Note that all actual eviction work is done by caller after
+->drop_inode() returns.
+
        clear_inode() is gone; use end_writeback() instead.  As before, it must
 be called exactly once on each call of ->evict_inode() (as it used to be for
 each call of ->delete_inode()).  Unlike before, if you are using inode-associated
 so the i_size should not change when hole punching, even when puching the end of
 a file off.
 
+--
+[mandatory]
+
 --
 [mandatory]
        ->get_sb() is gone.  Switch to use of ->mount().  Typically it's just
 
        unsigned long reap = 0;
 
        down_read(&iprune_sem);
-       spin_lock(&inode_lock);
        spin_lock(&inode_lru_lock);
        for (nr_scanned = 0; nr_scanned < nr_to_scan; nr_scanned++) {
                struct inode *inode;
                 */
                if (atomic_read(&inode->i_count) ||
                    (inode->i_state & ~I_REFERENCED)) {
-                       spin_unlock(&inode->i_lock);
                        list_del_init(&inode->i_lru);
+                       spin_unlock(&inode->i_lock);
                        inodes_stat.nr_unused--;
                        continue;
                }
                /* recently referenced inodes get one more pass */
                if (inode->i_state & I_REFERENCED) {
                        inode->i_state &= ~I_REFERENCED;
-                       spin_unlock(&inode->i_lock);
                        list_move(&inode->i_lru, &inode_lru);
+                       spin_unlock(&inode->i_lock);
                        continue;
                }
                if (inode_has_buffers(inode) || inode->i_data.nrpages) {
                        __iget(inode);
                        spin_unlock(&inode->i_lock);
                        spin_unlock(&inode_lru_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);
                        spin_lock(&inode_lru_lock);
 
                        if (inode != list_entry(inode_lru.next,
        else
                __count_vm_events(PGINODESTEAL, reap);
        spin_unlock(&inode_lru_lock);
-       spin_unlock(&inode_lock);
 
        dispose_list(&freeable);
        up_read(&iprune_sem);
 
 struct inode *igrab(struct inode *inode)
 {
-       spin_lock(&inode_lock);
        spin_lock(&inode->i_lock);
        if (!(inode->i_state & (I_FREEING|I_WILL_FREE))) {
                __iget(inode);
                 */
                inode = NULL;
        }
-       spin_unlock(&inode_lock);
        return inode;
 }
 EXPORT_SYMBOL(igrab);
        const struct super_operations *op = inode->i_sb->s_op;
        int drop;
 
-       spin_lock(&inode->i_lock);
        WARN_ON(inode->i_state & I_NEW);
 
        if (op && op->drop_inode)
                if (!(inode->i_state & (I_DIRTY|I_SYNC)))
                        inode_lru_list_add(inode);
                spin_unlock(&inode->i_lock);
-               spin_unlock(&inode_lock);
                return;
        }
 
        if (!drop) {
                inode->i_state |= I_WILL_FREE;
                spin_unlock(&inode->i_lock);
-               spin_unlock(&inode_lock);
                write_inode_now(inode, 1);
-               spin_lock(&inode_lock);
                spin_lock(&inode->i_lock);
                WARN_ON(inode->i_state & I_NEW);
                inode->i_state &= ~I_WILL_FREE;
        inode->i_state |= I_FREEING;
        inode_lru_list_del(inode);
        spin_unlock(&inode->i_lock);
-       spin_unlock(&inode_lock);
 
        evict(inode);
 }
        if (inode) {
                BUG_ON(inode->i_state & I_CLEAR);
 
-               if (atomic_dec_and_lock(&inode->i_count, &inode_lock))
+               if (atomic_dec_and_lock(&inode->i_count, &inode->i_lock))
                        iput_final(inode);
        }
 }