Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.24-rc6 /fs/inode.c

Filename:/fs/inode.c
Lines Added:35
Lines Deleted:17
Also changed in: (Previous) 2.6.24-rc5  2.6.24-rc4  2.6.24-rc3  2.6.24-rc2  2.6.24-rc1  2.6.23-git19 
(Following) 2.6.24-rc7  2.6.24-rc8  2.6.24  2.6.24-git6  2.6.24-git7  2.6.24-git8 

Location
[  2.6.24-rc6
  [  fs
     o  inode.c

Patch

diff --git a/fs/inode.c b/fs/inode.c
index 29f5068..ed35383 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -99,6 +99,15 @@ struct inodes_stat_t inodes_stat;
 
 static struct kmem_cache * inode_cachep __read_mostly;
 
+static void wake_up_inode(struct inode *inode)
+{
+   /*
+    * Prevent speculative execution through spin_unlock(&inode_lock);
+    */
+   smp_mb();
+   wake_up_bit(&inode->i_state, __I_LOCK);
+}
+
 static struct inode *alloc_inode(struct super_block *sb)
 {
    static const struct address_space_operations empty_aops;
@@ -142,6 +151,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 +208,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 +215,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);
@@ -209,7 +224,7 @@ void inode_init_once(struct inode *inode)
 
 EXPORT_SYMBOL(inode_init_once);
 
-static void init_once(void * foo, struct kmem_cache * cachep, unsigned long flags)
+static void init_once(struct kmem_cache * cachep, void *foo)
 {
    struct inode * inode = (struct inode *) foo;
 
@@ -226,7 +241,7 @@ void __iget(struct inode * inode)
       return;
    }
    atomic_inc(&inode->i_count);
-   if (!(inode->i_state & (I_DIRTY|I_LOCK)))
+   if (!(inode->i_state & (I_DIRTY|I_SYNC)))
       list_move(&inode->i_list, &inode_in_use);
    inodes_stat.nr_unused--;
 }
@@ -247,7 +262,7 @@ void clear_inode(struct inode *inode)
    BUG_ON(inode->i_data.nrpages);
    BUG_ON(!(inode->i_state & I_FREEING));
    BUG_ON(inode->i_state & I_CLEAR);
-   wait_on_inode(inode);
+   inode_sync_wait(inode);
    DQUOT_DROP(inode);
    if (inode->i_sb->s_op->clear_inode)
       inode->i_sb->s_op->clear_inode(inode);
@@ -561,6 +576,18 @@ EXPORT_SYMBOL(new_inode);
 
 void unlock_new_inode(struct inode *inode)
 {
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+   if (inode->i_mode & S_IFDIR) {
+      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);
+      lockdep_set_class(&inode->i_mutex, &type->i_mutex_dir_key);
+   }
+#endif
    /*
     * This is special!  We do not need the spinlock
     * when clearing I_LOCK, because we're guaranteed
@@ -1053,7 +1080,7 @@ static void generic_forget_inode(struct inode *inode)
    struct super_block *sb = inode->i_sb;
 
    if (!hlist_unhashed(&inode->i_hash)) {
-      if (!(inode->i_state & (I_DIRTY|I_LOCK)))
+      if (!(inode->i_state & (I_DIRTY|I_SYNC)))
          list_move(&inode->i_list, &inode_unused);
       inodes_stat.nr_unused++;
       if (sb->s_flags & MS_ACTIVE) {
@@ -1296,15 +1323,6 @@ static void __wait_on_freeing_inode(struct inode *inode)
    spin_lock(&inode_lock);
 }
 
-void wake_up_inode(struct inode *inode)
-{
-   /*
-    * Prevent speculative execution through spin_unlock(&inode_lock);
-    */
-   smp_mb();
-   wake_up_bit(&inode->i_state, __I_LOCK);
-}
-
 /*
  * We rarely want to lock two inodes that do not have a parent/child
  * relationship (such as directory, child inode) simultaneously. The
@@ -1378,7 +1396,7 @@ void __init inode_init_early(void)
       INIT_HLIST_HEAD(&inode_hashtable[loop]);
 }
 
-void __init inode_init(unsigned long mempages)
+void __init inode_init(void)
 {
    int loop;
 


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.