patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / fs / inode.c
index 1ad2a71..f699b90 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/security.h>
 #include <linux/pagemap.h>
 #include <linux/cdev.h>
+#include <linux/vs_base.h>
 
 /*
  * This is needed for the following functions:
@@ -155,8 +156,20 @@ static struct inode *alloc_inode(struct super_block *sb)
                mapping_set_gfp_mask(mapping, GFP_HIGHUSER);
                mapping->assoc_mapping = NULL;
                mapping->backing_dev_info = &default_backing_dev_info;
-               if (sb->s_bdev)
-                       mapping->backing_dev_info = sb->s_bdev->bd_inode->i_mapping->backing_dev_info;
+
+               /*
+                * If the block_device provides a backing_dev_info for client
+                * inodes then use that.  Otherwise the inode share the bdev's
+                * backing_dev_info.
+                */
+               if (sb->s_bdev) {
+                       struct backing_dev_info *bdi;
+
+                       bdi = sb->s_bdev->bd_inode_backing_dev_info;
+                       if (!bdi)
+                               bdi = sb->s_bdev->bd_inode->i_mapping->backing_dev_info;
+                       mapping->backing_dev_info = bdi;
+               }
                memset(&inode->u, 0, sizeof(inode->u));
                inode->i_mapping = mapping;
        }
@@ -190,12 +203,12 @@ void inode_init_once(struct inode *inode)
        init_rwsem(&inode->i_alloc_sem);
        INIT_RADIX_TREE(&inode->i_data.page_tree, GFP_ATOMIC);
        spin_lock_init(&inode->i_data.tree_lock);
-       init_MUTEX(&inode->i_data.i_shared_sem);
+       spin_lock_init(&inode->i_data.i_mmap_lock);
        atomic_set(&inode->i_data.truncate_count, 0);
        INIT_LIST_HEAD(&inode->i_data.private_list);
        spin_lock_init(&inode->i_data.private_lock);
-       INIT_LIST_HEAD(&inode->i_data.i_mmap);
-       INIT_LIST_HEAD(&inode->i_data.i_mmap_shared);
+       INIT_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);
 }
@@ -557,6 +570,7 @@ struct inode *new_inode(struct super_block *sb)
                list_add(&inode->i_list, &inode_in_use);
                inode->i_ino = ++last_ino;
                inode->i_state = 0;
+               inode->i_xid = vx_current_xid();
                spin_unlock(&inode_lock);
        }
        return inode;
@@ -677,13 +691,14 @@ static struct inode * get_new_inode_fast(struct super_block *sb, struct hlist_he
 
 static inline unsigned long hash(struct super_block *sb, unsigned long hashval)
 {
-       unsigned long tmp = hashval + ((unsigned long) sb / L1_CACHE_BYTES);
-       tmp = tmp + (tmp >> I_HASHBITS);
+       unsigned long tmp;
+
+       tmp = (hashval * (unsigned long)sb) ^ (GOLDEN_RATIO_PRIME + hashval) /
+                       L1_CACHE_BYTES;
+       tmp = tmp ^ ((tmp ^ GOLDEN_RATIO_PRIME) >> I_HASHBITS);
        return tmp & I_HASHMASK;
 }
 
-/* Yeah, I know about quadratic hash. Maybe, later. */
-
 /**
  *     iunique - get a unique inode number
  *     @sb: superblock
@@ -1389,11 +1404,8 @@ void __init inode_init(unsigned long mempages)
 
        /* inode slab cache */
        inode_cachep = kmem_cache_create("inode_cache", sizeof(struct inode),
-                                        0, SLAB_HWCACHE_ALIGN, init_once,
-                                        NULL);
-       if (!inode_cachep)
-               panic("cannot create inode slab cache");
-
+                               0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, init_once,
+                               NULL);
        set_shrinker(DEFAULT_SEEKS, shrink_icache_memory);
 }
 
@@ -1414,5 +1426,4 @@ void init_special_inode(struct inode *inode, umode_t mode, dev_t rdev)
                printk(KERN_DEBUG "init_special_inode: bogus i_mode (%o)\n",
                       mode);
 }
-
 EXPORT_SYMBOL(init_special_inode);