Commit 265ac902 authored by Nick Piggin's avatar Nick Piggin Committed by Al Viro

fs: improve DCACHE_REFERENCED usage

dentry referenced bit is only set when installing the dentry back
onto the LRU. However with lazy LRU, the dentry can already be on
the LRU list at dput time, thus missing out on setting the referenced
bit. Fix this.
Signed-off-by: default avatarNick Piggin <npiggin@suse.de>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 312d3ca8
...@@ -246,13 +246,16 @@ void dput(struct dentry *dentry) ...@@ -246,13 +246,16 @@ void dput(struct dentry *dentry)
if (dentry->d_op->d_delete(dentry)) if (dentry->d_op->d_delete(dentry))
goto unhash_it; goto unhash_it;
} }
/* Unreachable? Get rid of it */ /* Unreachable? Get rid of it */
if (d_unhashed(dentry)) if (d_unhashed(dentry))
goto kill_it; goto kill_it;
if (list_empty(&dentry->d_lru)) {
dentry->d_flags |= DCACHE_REFERENCED; /* Otherwise leave it cached and ensure it's on the LRU */
dentry->d_flags |= DCACHE_REFERENCED;
if (list_empty(&dentry->d_lru))
dentry_lru_add(dentry); dentry_lru_add(dentry);
}
spin_unlock(&dentry->d_lock); spin_unlock(&dentry->d_lock);
spin_unlock(&dcache_lock); spin_unlock(&dcache_lock);
return; return;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment