diff -Nur linux-2.6.1-mm3.orig/fs/dcache.c linux-2.6.1-mm3/fs/dcache.c --- linux-2.6.1-mm3.orig/fs/dcache.c 2004-01-14 13:48:09.000000000 -0800 +++ linux-2.6.1-mm3/fs/dcache.c 2004-01-14 14:02:02.000000000 -0800 @@ -49,6 +49,7 @@ */ #define D_HASHBITS d_hash_shift #define D_HASHMASK d_hash_mask +#define D_HASHMAX (2*1024*1024UL) /* max number of entries */ static unsigned int d_hash_mask; static unsigned int d_hash_shift; @@ -1552,9 +1553,9 @@ set_shrinker(DEFAULT_SEEKS, shrink_dcache_memory); - mempages >>= 1; - mempages *= sizeof(struct hlist_head); - for (order = 0; (order < 10) && (((1UL << order) << PAGE_SHIFT) < mempages); order++) + mempages = (mempages << PAGE_SHIFT) >> 13; + mempages = min(D_HASHMAX, mempages) * sizeof(struct hlist_head); + for (order = 0; ((1UL << order) << PAGE_SHIFT) < mempages; order++) ; do { diff -Nur linux-2.6.1-mm3.orig/fs/inode.c linux-2.6.1-mm3/fs/inode.c --- linux-2.6.1-mm3.orig/fs/inode.c 2004-01-14 13:48:09.000000000 -0800 +++ linux-2.6.1-mm3/fs/inode.c 2004-01-14 14:01:34.000000000 -0800 @@ -53,6 +53,7 @@ */ #define I_HASHBITS i_hash_shift #define I_HASHMASK i_hash_mask +#define I_HASHMAX (2*1024*1024UL) /* max number of entries */ static unsigned int i_hash_mask; static unsigned int i_hash_shift; @@ -1328,9 +1329,9 @@ for (i = 0; i < ARRAY_SIZE(i_wait_queue_heads); i++) init_waitqueue_head(&i_wait_queue_heads[i].wqh); - mempages >>= 2; - mempages *= sizeof(struct hlist_head); - for (order = 0; (order < 10) && (((1UL << order) << PAGE_SHIFT) < mempages); order++) + mempages = (mempages << PAGE_SHIFT) >> 14; + mempages = min(I_HASHMAX, mempages) * sizeof(struct hlist_head); + for (order = 0; ((1UL << order) << PAGE_SHIFT) < mempages; order++) ; do {