diff options
Diffstat (limited to 'fs/dcache.c')
-rw-r--r-- | fs/dcache.c | 45 |
1 files changed, 21 insertions, 24 deletions
diff --git a/fs/dcache.c b/fs/dcache.c index 129a35730994..7108c15685dd 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
@@ -99,12 +99,9 @@ static struct kmem_cache *dentry_cache __read_mostly; | |||
99 | static unsigned int d_hash_mask __read_mostly; | 99 | static unsigned int d_hash_mask __read_mostly; |
100 | static unsigned int d_hash_shift __read_mostly; | 100 | static unsigned int d_hash_shift __read_mostly; |
101 | 101 | ||
102 | struct dcache_hash_bucket { | 102 | static struct hlist_bl_head *dentry_hashtable __read_mostly; |
103 | struct hlist_bl_head head; | ||
104 | }; | ||
105 | static struct dcache_hash_bucket *dentry_hashtable __read_mostly; | ||
106 | 103 | ||
107 | static inline struct dcache_hash_bucket *d_hash(struct dentry *parent, | 104 | static inline struct hlist_bl_head *d_hash(struct dentry *parent, |
108 | unsigned long hash) | 105 | unsigned long hash) |
109 | { | 106 | { |
110 | hash += ((unsigned long) parent ^ GOLDEN_RATIO_PRIME) / L1_CACHE_BYTES; | 107 | hash += ((unsigned long) parent ^ GOLDEN_RATIO_PRIME) / L1_CACHE_BYTES; |
@@ -112,14 +109,14 @@ static inline struct dcache_hash_bucket *d_hash(struct dentry *parent, | |||
112 | return dentry_hashtable + (hash & D_HASHMASK); | 109 | return dentry_hashtable + (hash & D_HASHMASK); |
113 | } | 110 | } |
114 | 111 | ||
115 | static inline void spin_lock_bucket(struct dcache_hash_bucket *b) | 112 | static inline void spin_lock_bucket(struct hlist_bl_head *b) |
116 | { | 113 | { |
117 | bit_spin_lock(0, (unsigned long *)&b->head.first); | 114 | bit_spin_lock(0, (unsigned long *)&b->first); |
118 | } | 115 | } |
119 | 116 | ||
120 | static inline void spin_unlock_bucket(struct dcache_hash_bucket *b) | 117 | static inline void spin_unlock_bucket(struct hlist_bl_head *b) |
121 | { | 118 | { |
122 | __bit_spin_unlock(0, (unsigned long *)&b->head.first); | 119 | __bit_spin_unlock(0, (unsigned long *)&b->first); |
123 | } | 120 | } |
124 | 121 | ||
125 | /* Statistics gathering. */ | 122 | /* Statistics gathering. */ |
@@ -331,15 +328,15 @@ static struct dentry *d_kill(struct dentry *dentry, struct dentry *parent) | |||
331 | void __d_drop(struct dentry *dentry) | 328 | void __d_drop(struct dentry *dentry) |
332 | { | 329 | { |
333 | if (!(dentry->d_flags & DCACHE_UNHASHED)) { | 330 | if (!(dentry->d_flags & DCACHE_UNHASHED)) { |
331 | struct hlist_bl_head *b; | ||
334 | if (unlikely(dentry->d_flags & DCACHE_DISCONNECTED)) { | 332 | if (unlikely(dentry->d_flags & DCACHE_DISCONNECTED)) { |
335 | bit_spin_lock(0, | 333 | b = &dentry->d_sb->s_anon; |
336 | (unsigned long *)&dentry->d_sb->s_anon.first); | 334 | spin_lock_bucket(b); |
337 | dentry->d_flags |= DCACHE_UNHASHED; | 335 | dentry->d_flags |= DCACHE_UNHASHED; |
338 | hlist_bl_del_init(&dentry->d_hash); | 336 | hlist_bl_del_init(&dentry->d_hash); |
339 | __bit_spin_unlock(0, | 337 | spin_unlock_bucket(b); |
340 | (unsigned long *)&dentry->d_sb->s_anon.first); | ||
341 | } else { | 338 | } else { |
342 | struct dcache_hash_bucket *b; | 339 | struct hlist_bl_head *b; |
343 | b = d_hash(dentry->d_parent, dentry->d_name.hash); | 340 | b = d_hash(dentry->d_parent, dentry->d_name.hash); |
344 | spin_lock_bucket(b); | 341 | spin_lock_bucket(b); |
345 | /* | 342 | /* |
@@ -1789,7 +1786,7 @@ struct dentry *__d_lookup_rcu(struct dentry *parent, struct qstr *name, | |||
1789 | unsigned int len = name->len; | 1786 | unsigned int len = name->len; |
1790 | unsigned int hash = name->hash; | 1787 | unsigned int hash = name->hash; |
1791 | const unsigned char *str = name->name; | 1788 | const unsigned char *str = name->name; |
1792 | struct dcache_hash_bucket *b = d_hash(parent, hash); | 1789 | struct hlist_bl_head *b = d_hash(parent, hash); |
1793 | struct hlist_bl_node *node; | 1790 | struct hlist_bl_node *node; |
1794 | struct dentry *dentry; | 1791 | struct dentry *dentry; |
1795 | 1792 | ||
@@ -1813,7 +1810,7 @@ struct dentry *__d_lookup_rcu(struct dentry *parent, struct qstr *name, | |||
1813 | * | 1810 | * |
1814 | * See Documentation/filesystems/path-lookup.txt for more details. | 1811 | * See Documentation/filesystems/path-lookup.txt for more details. |
1815 | */ | 1812 | */ |
1816 | hlist_bl_for_each_entry_rcu(dentry, node, &b->head, d_hash) { | 1813 | hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) { |
1817 | struct inode *i; | 1814 | struct inode *i; |
1818 | const char *tname; | 1815 | const char *tname; |
1819 | int tlen; | 1816 | int tlen; |
@@ -1908,7 +1905,7 @@ struct dentry *__d_lookup(struct dentry *parent, struct qstr *name) | |||
1908 | unsigned int len = name->len; | 1905 | unsigned int len = name->len; |
1909 | unsigned int hash = name->hash; | 1906 | unsigned int hash = name->hash; |
1910 | const unsigned char *str = name->name; | 1907 | const unsigned char *str = name->name; |
1911 | struct dcache_hash_bucket *b = d_hash(parent, hash); | 1908 | struct hlist_bl_head *b = d_hash(parent, hash); |
1912 | struct hlist_bl_node *node; | 1909 | struct hlist_bl_node *node; |
1913 | struct dentry *found = NULL; | 1910 | struct dentry *found = NULL; |
1914 | struct dentry *dentry; | 1911 | struct dentry *dentry; |
@@ -1935,7 +1932,7 @@ struct dentry *__d_lookup(struct dentry *parent, struct qstr *name) | |||
1935 | */ | 1932 | */ |
1936 | rcu_read_lock(); | 1933 | rcu_read_lock(); |
1937 | 1934 | ||
1938 | hlist_bl_for_each_entry_rcu(dentry, node, &b->head, d_hash) { | 1935 | hlist_bl_for_each_entry_rcu(dentry, node, b, d_hash) { |
1939 | const char *tname; | 1936 | const char *tname; |
1940 | int tlen; | 1937 | int tlen; |
1941 | 1938 | ||
@@ -2086,12 +2083,12 @@ again: | |||
2086 | } | 2083 | } |
2087 | EXPORT_SYMBOL(d_delete); | 2084 | EXPORT_SYMBOL(d_delete); |
2088 | 2085 | ||
2089 | static void __d_rehash(struct dentry * entry, struct dcache_hash_bucket *b) | 2086 | static void __d_rehash(struct dentry * entry, struct hlist_bl_head *b) |
2090 | { | 2087 | { |
2091 | BUG_ON(!d_unhashed(entry)); | 2088 | BUG_ON(!d_unhashed(entry)); |
2092 | spin_lock_bucket(b); | 2089 | spin_lock_bucket(b); |
2093 | entry->d_flags &= ~DCACHE_UNHASHED; | 2090 | entry->d_flags &= ~DCACHE_UNHASHED; |
2094 | hlist_bl_add_head_rcu(&entry->d_hash, &b->head); | 2091 | hlist_bl_add_head_rcu(&entry->d_hash, b); |
2095 | spin_unlock_bucket(b); | 2092 | spin_unlock_bucket(b); |
2096 | } | 2093 | } |
2097 | 2094 | ||
@@ -3025,7 +3022,7 @@ static void __init dcache_init_early(void) | |||
3025 | 3022 | ||
3026 | dentry_hashtable = | 3023 | dentry_hashtable = |
3027 | alloc_large_system_hash("Dentry cache", | 3024 | alloc_large_system_hash("Dentry cache", |
3028 | sizeof(struct dcache_hash_bucket), | 3025 | sizeof(struct hlist_bl_head), |
3029 | dhash_entries, | 3026 | dhash_entries, |
3030 | 13, | 3027 | 13, |
3031 | HASH_EARLY, | 3028 | HASH_EARLY, |
@@ -3034,7 +3031,7 @@ static void __init dcache_init_early(void) | |||
3034 | 0); | 3031 | 0); |
3035 | 3032 | ||
3036 | for (loop = 0; loop < (1 << d_hash_shift); loop++) | 3033 | for (loop = 0; loop < (1 << d_hash_shift); loop++) |
3037 | INIT_HLIST_BL_HEAD(&dentry_hashtable[loop].head); | 3034 | INIT_HLIST_BL_HEAD(dentry_hashtable + loop); |
3038 | } | 3035 | } |
3039 | 3036 | ||
3040 | static void __init dcache_init(void) | 3037 | static void __init dcache_init(void) |
@@ -3057,7 +3054,7 @@ static void __init dcache_init(void) | |||
3057 | 3054 | ||
3058 | dentry_hashtable = | 3055 | dentry_hashtable = |
3059 | alloc_large_system_hash("Dentry cache", | 3056 | alloc_large_system_hash("Dentry cache", |
3060 | sizeof(struct dcache_hash_bucket), | 3057 | sizeof(struct hlist_bl_head), |
3061 | dhash_entries, | 3058 | dhash_entries, |
3062 | 13, | 3059 | 13, |
3063 | 0, | 3060 | 0, |
@@ -3066,7 +3063,7 @@ static void __init dcache_init(void) | |||
3066 | 0); | 3063 | 0); |
3067 | 3064 | ||
3068 | for (loop = 0; loop < (1 << d_hash_shift); loop++) | 3065 | for (loop = 0; loop < (1 << d_hash_shift); loop++) |
3069 | INIT_HLIST_BL_HEAD(&dentry_hashtable[loop].head); | 3066 | INIT_HLIST_BL_HEAD(dentry_hashtable + loop); |
3070 | } | 3067 | } |
3071 | 3068 | ||
3072 | /* SLAB cache for __getname() consumers */ | 3069 | /* SLAB cache for __getname() consumers */ |