Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[sfrench/cifs-2.6.git] / fs / inode.c
index 320e088d0b28ba57648586314a23d9f011b61a72..f97de0aeb3b69dcd320668ccbf6bbeb6e9d57932 100644 (file)
@@ -142,6 +142,15 @@ static struct inode *alloc_inode(struct super_block *sb)
                        return NULL;
                }
 
+               spin_lock_init(&inode->i_lock);
+               lockdep_set_class(&inode->i_lock, &sb->s_type->i_lock_key);
+
+               mutex_init(&inode->i_mutex);
+               lockdep_set_class(&inode->i_mutex, &sb->s_type->i_mutex_key);
+
+               init_rwsem(&inode->i_alloc_sem);
+               lockdep_set_class(&inode->i_alloc_sem, &sb->s_type->i_alloc_sem_key);
+
                mapping->a_ops = &empty_aops;
                mapping->host = inode;
                mapping->flags = 0;
@@ -190,8 +199,6 @@ void inode_init_once(struct inode *inode)
        INIT_HLIST_NODE(&inode->i_hash);
        INIT_LIST_HEAD(&inode->i_dentry);
        INIT_LIST_HEAD(&inode->i_devices);
-       mutex_init(&inode->i_mutex);
-       init_rwsem(&inode->i_alloc_sem);
        INIT_RADIX_TREE(&inode->i_data.page_tree, GFP_ATOMIC);
        rwlock_init(&inode->i_data.tree_lock);
        spin_lock_init(&inode->i_data.i_mmap_lock);
@@ -199,7 +206,6 @@ void inode_init_once(struct inode *inode)
        spin_lock_init(&inode->i_data.private_lock);
        INIT_RAW_PRIO_TREE_ROOT(&inode->i_data.i_mmap);
        INIT_LIST_HEAD(&inode->i_data.i_mmap_nonlinear);
-       spin_lock_init(&inode->i_lock);
        i_size_ordered_init(inode);
 #ifdef CONFIG_INOTIFY
        INIT_LIST_HEAD(&inode->inotify_watches);
@@ -561,6 +567,18 @@ EXPORT_SYMBOL(new_inode);
 
 void unlock_new_inode(struct inode *inode)
 {
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+       struct file_system_type *type = inode->i_sb->s_type;
+       /*
+        * ensure nobody is actually holding i_mutex
+        */
+       mutex_destroy(&inode->i_mutex);
+       mutex_init(&inode->i_mutex);
+       if (inode->i_mode & S_IFDIR)
+               lockdep_set_class(&inode->i_mutex, &type->i_mutex_dir_key);
+       else
+               lockdep_set_class(&inode->i_mutex, &type->i_mutex_key);
+#endif
        /*
         * This is special!  We do not need the spinlock
         * when clearing I_LOCK, because we're guaranteed
@@ -1388,8 +1406,7 @@ void __init inode_init(unsigned long mempages)
                                         0,
                                         (SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|
                                         SLAB_MEM_SPREAD),
-                                        init_once,
-                                        NULL);
+                                        init_once);
        register_shrinker(&icache_shrinker);
 
        /* Hash may have been set up in inode_init_early */