--- linux-2.6.22.19-chopstix/fs/dcookies.c 2009-02-28 03:10:05.000000000 -0500 +++ linux-2.6.22.19-chopstix/fs/dcookies.c.orig 2008-02-25 18:59:40.000000000 -0500 @@ -38,19 +38,14 @@ static LIST_HEAD(dcookie_users); static DEFINE_MUTEX(dcookie_mutex); static struct kmem_cache *dcookie_cache __read_mostly; -static struct list_head *dcookie_hashtable[2] __read_mostly; +static struct list_head *dcookie_hashtable __read_mostly; static size_t hash_size __read_mostly; -unsigned int current_hash = 0; static inline int is_live(void) { return !(list_empty(&dcookie_users)); } -static inline int is_shared(void) -{ - return !(list_empty(&dcookie_users)) && !(list_empty(dcookie_users.next)); -} /* The dentry is locked, its address will do for the cookie */ static inline unsigned long dcookie_value(struct dcookie_struct * dcs) @@ -72,7 +67,7 @@ struct list_head * pos; struct list_head * list; - list = dcookie_hashtable[current_hash] + dcookie_hash(dcookie); + list = dcookie_hashtable + dcookie_hash(dcookie); list_for_each(pos, list) { dcs = list_entry(pos, struct dcookie_struct, hash_list); @@ -88,7 +83,7 @@ static void hash_dcookie(struct dcookie_struct * dcs) { - struct list_head * list = dcookie_hashtable[current_hash] + dcookie_hash(dcookie_value(dcs)); + struct list_head * list = dcookie_hashtable + dcookie_hash(dcookie_value(dcs)); list_add(&dcs->hash_list, list); } @@ -96,7 +91,7 @@ static struct dcookie_struct * alloc_dcookie(struct dentry * dentry, struct vfsmount * vfsmnt) { - struct dcookie_struct * dcs = kmem_cache_alloc(dcookie_cache, GFP_ATOMIC); + struct dcookie_struct * dcs = kmem_cache_alloc(dcookie_cache, GFP_KERNEL); if (!dcs) return NULL; @@ -215,12 +210,8 @@ if (!dcookie_cache) goto out; - dcookie_hashtable[0] = kmalloc(PAGE_SIZE, GFP_KERNEL); - if (!dcookie_hashtable[0]) - goto out_kmem; - - dcookie_hashtable[1] = kmalloc(PAGE_SIZE, GFP_KERNEL); - if (!dcookie_hashtable[1]) + dcookie_hashtable = kmalloc(PAGE_SIZE, GFP_KERNEL); + if (!dcookie_hashtable) goto out_kmem; err = 0; @@ -244,15 +235,7 @@ hash_size = 1UL << hash_bits; /* And initialize the newly allocated array */ - d = dcookie_hashtable[0]; - i = hash_size; - do { - INIT_LIST_HEAD(d); - d++; - i--; - } while (i); - - d = dcookie_hashtable[1]; + d = dcookie_hashtable; i = hash_size; do { INIT_LIST_HEAD(d); @@ -276,30 +259,6 @@ kmem_cache_free(dcookie_cache, dcs); } -/* Switch to the second hash */ -int garbage_collect(void) { - struct list_head * list; - struct list_head * pos; - struct list_head * pos2; - struct dcookie_struct * dcs; - size_t i; - - if (is_shared()) - return -EAGAIN; - - for (i = 0; i < hash_size; ++i) { - list = dcookie_hashtable[current_hash] + i; - list_for_each_safe(pos, pos2, list) { - dcs = list_entry(pos, struct dcookie_struct, hash_list); - list_del(&dcs->hash_list); - free_dcookie(dcs); - } - } - - current_hash = (current_hash & 1) ^ 1; - - return 0; -} static void dcookie_exit(void) { @@ -310,14 +269,7 @@ size_t i; for (i = 0; i < hash_size; ++i) { - list = dcookie_hashtable[0] + i; - list_for_each_safe(pos, pos2, list) { - dcs = list_entry(pos, struct dcookie_struct, hash_list); - list_del(&dcs->hash_list); - free_dcookie(dcs); - } - - list = dcookie_hashtable[1] + i; + list = dcookie_hashtable + i; list_for_each_safe(pos, pos2, list) { dcs = list_entry(pos, struct dcookie_struct, hash_list); list_del(&dcs->hash_list); @@ -325,8 +277,7 @@ } } - kfree(dcookie_hashtable[0]); - kfree(dcookie_hashtable[1]); + kfree(dcookie_hashtable); kmem_cache_destroy(dcookie_cache); }