patch-2.2.19 linux/fs/dcache.c
Next file: linux/fs/dquot.c
Previous file: linux/fs/coda/file.c
Back to the patch index
Back to the overall index
- Lines: 47
- Date:
Sun Mar 25 11:37:38 2001
- Orig file:
v2.2.18/fs/dcache.c
- Orig date:
Sun Mar 25 11:12:32 2001
diff -u --new-file --recursive --exclude-from /usr/src/exclude v2.2.18/fs/dcache.c linux/fs/dcache.c
@@ -253,10 +253,15 @@
if (tmp == &dentry_unused)
break;
- dentry_stat.nr_unused--;
list_del(tmp);
- INIT_LIST_HEAD(tmp);
dentry = list_entry(tmp, struct dentry, d_lru);
+ if (dentry->d_flags & DCACHE_REFERENCED) {
+ dentry->d_flags &= ~DCACHE_REFERENCED;
+ list_add(&dentry->d_lru, &dentry_unused);
+ continue;
+ }
+ dentry_stat.nr_unused--;
+ INIT_LIST_HEAD(tmp);
if (!dentry->d_count) {
i_nr -= prune_one_dentry(dentry);
if (!i_nr)
@@ -475,9 +480,9 @@
*/
void shrink_dcache_memory(int priority, unsigned int gfp_mask)
{
- if (gfp_mask & __GFP_IO) {
+ if (gfp_mask & __GFP_IO && !current->fs_locks) {
int count = 0;
- if (priority)
+ if (priority > 1)
count = dentry_stat.nr_unused / priority;
prune_dcache(count, -1);
}
@@ -568,7 +573,7 @@
static inline struct list_head * d_hash(struct dentry * parent, unsigned long hash)
{
hash += (unsigned long) parent / L1_CACHE_BYTES;
- hash = hash ^ (hash >> D_HASHBITS) ^ (hash >> D_HASHBITS*2);
+ hash = hash ^ (hash >> D_HASHBITS);
return dentry_hashtable + (hash & D_HASHMASK);
}
@@ -598,6 +603,7 @@
if (memcmp(dentry->d_name.name, str, len))
continue;
}
+ dentry->d_flags |= DCACHE_REFERENCED;
return dget(dentry);
}
return NULL;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)