Skip to content

Commit

Permalink
fs: remove dentry_lru_prune()
Browse files Browse the repository at this point in the history
When pruning a dentry, its ancestor dentry can also be pruned. But
the ancestor dentry does not go through dput(), so it does not get
put on the dentry LRU. Hence associating d_prune with removing the
dentry from the LRU is the wrong.

The fix is remove dentry_lru_prune(). Call file system's d_prune()
callback directly when pruning dentries.

Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
  • Loading branch information
Yan, Zheng authored and Al Viro committed May 4, 2013
1 parent 6b13eb1 commit 61572bb
Showing 1 changed file with 9 additions and 22 deletions.
31 changes: 9 additions & 22 deletions fs/dcache.c
Original file line number Diff line number Diff line change
Expand Up @@ -337,23 +337,6 @@ static void dentry_lru_del(struct dentry *dentry)
}
}

/*
* Remove a dentry that is unreferenced and about to be pruned
* (unhashed and destroyed) from the LRU, and inform the file system.
* This wrapper should be called _prior_ to unhashing a victim dentry.
*/
static void dentry_lru_prune(struct dentry *dentry)
{
if (!list_empty(&dentry->d_lru)) {
if (dentry->d_flags & DCACHE_OP_PRUNE)
dentry->d_op->d_prune(dentry);

spin_lock(&dcache_lru_lock);
__dentry_lru_del(dentry);
spin_unlock(&dcache_lru_lock);
}
}

static void dentry_lru_move_list(struct dentry *dentry, struct list_head *list)
{
spin_lock(&dcache_lru_lock);
Expand Down Expand Up @@ -486,11 +469,13 @@ static inline struct dentry *dentry_kill(struct dentry *dentry, int ref)
if (ref)
dentry->d_count--;
/*
* if dentry was on the d_lru list delete it from there.
* inform the fs via d_prune that this dentry is about to be
* unhashed and destroyed.
*/
dentry_lru_prune(dentry);
if (dentry->d_flags & DCACHE_OP_PRUNE)
dentry->d_op->d_prune(dentry);

dentry_lru_del(dentry);
/* if it was on the hash then remove it */
__d_drop(dentry);
return d_kill(dentry, parent);
Expand Down Expand Up @@ -919,11 +904,13 @@ static void shrink_dcache_for_umount_subtree(struct dentry *dentry)
struct inode *inode;

/*
* remove the dentry from the lru, and inform
* the fs that this dentry is about to be
* inform the fs that this dentry is about to be
* unhashed and destroyed.
*/
dentry_lru_prune(dentry);
if (dentry->d_flags & DCACHE_OP_PRUNE)
dentry->d_op->d_prune(dentry);

dentry_lru_del(dentry);
__d_shrink(dentry);

if (dentry->d_count != 0) {
Expand Down

0 comments on commit 61572bb

Please sign in to comment.