aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/btrfs/btrfs_inode.h20
-rw-r--r--fs/btrfs/disk-io.c2
-rw-r--r--fs/btrfs/inode.c6
3 files changed, 25 insertions, 3 deletions
diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h
index 71f074e1870b..ac0b39db27d1 100644
--- a/fs/btrfs/btrfs_inode.h
+++ b/fs/btrfs/btrfs_inode.h
@@ -19,6 +19,7 @@
19#ifndef __BTRFS_I__ 19#ifndef __BTRFS_I__
20#define __BTRFS_I__ 20#define __BTRFS_I__
21 21
22#include <linux/hash.h>
22#include "extent_map.h" 23#include "extent_map.h"
23#include "extent_io.h" 24#include "extent_io.h"
24#include "ordered-data.h" 25#include "ordered-data.h"
@@ -179,6 +180,25 @@ static inline struct btrfs_inode *BTRFS_I(struct inode *inode)
179 return container_of(inode, struct btrfs_inode, vfs_inode); 180 return container_of(inode, struct btrfs_inode, vfs_inode);
180} 181}
181 182
183static inline unsigned long btrfs_inode_hash(u64 objectid,
184 const struct btrfs_root *root)
185{
186 u64 h = objectid ^ (root->objectid * GOLDEN_RATIO_PRIME);
187
188#if BITS_PER_LONG == 32
189 h = (h >> 32) ^ (h & 0xffffffff);
190#endif
191
192 return (unsigned long)h;
193}
194
195static inline void btrfs_insert_inode_hash(struct inode *inode)
196{
197 unsigned long h = btrfs_inode_hash(inode->i_ino, BTRFS_I(inode)->root);
198
199 __insert_inode_hash(inode, h);
200}
201
182static inline u64 btrfs_ino(struct inode *inode) 202static inline u64 btrfs_ino(struct inode *inode)
183{ 203{
184 u64 ino = BTRFS_I(inode)->location.objectid; 204 u64 ino = BTRFS_I(inode)->location.objectid;
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index ade6c0e79616..d205bddc7776 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -2294,7 +2294,7 @@ int open_ctree(struct super_block *sb,
2294 sizeof(struct btrfs_key)); 2294 sizeof(struct btrfs_key));
2295 set_bit(BTRFS_INODE_DUMMY, 2295 set_bit(BTRFS_INODE_DUMMY,
2296 &BTRFS_I(fs_info->btree_inode)->runtime_flags); 2296 &BTRFS_I(fs_info->btree_inode)->runtime_flags);
2297 insert_inode_hash(fs_info->btree_inode); 2297 btrfs_insert_inode_hash(fs_info->btree_inode);
2298 2298
2299 spin_lock_init(&fs_info->block_group_cache_lock); 2299 spin_lock_init(&fs_info->block_group_cache_lock);
2300 fs_info->block_group_cache_tree = RB_ROOT; 2300 fs_info->block_group_cache_tree = RB_ROOT;
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 1ca49eaba3bb..bb242f2fb51e 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -4837,10 +4837,12 @@ static struct inode *btrfs_iget_locked(struct super_block *s,
4837{ 4837{
4838 struct inode *inode; 4838 struct inode *inode;
4839 struct btrfs_iget_args args; 4839 struct btrfs_iget_args args;
4840 unsigned long hashval = btrfs_inode_hash(objectid, root);
4841
4840 args.ino = objectid; 4842 args.ino = objectid;
4841 args.root = root; 4843 args.root = root;
4842 4844
4843 inode = iget5_locked(s, objectid, btrfs_find_actor, 4845 inode = iget5_locked(s, hashval, btrfs_find_actor,
4844 btrfs_init_locked_inode, 4846 btrfs_init_locked_inode,
4845 (void *)&args); 4847 (void *)&args);
4846 return inode; 4848 return inode;
@@ -5460,7 +5462,7 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,
5460 BTRFS_INODE_NODATASUM; 5462 BTRFS_INODE_NODATASUM;
5461 } 5463 }
5462 5464
5463 insert_inode_hash(inode); 5465 btrfs_insert_inode_hash(inode);
5464 inode_tree_add(inode); 5466 inode_tree_add(inode);
5465 5467
5466 trace_btrfs_inode_new(inode); 5468 trace_btrfs_inode_new(inode);