lkml.org 
[lkml]   [2010]   [Jun]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 20/38] union-mount: Free union dirs on removal from dcache
    Date
    If a dentry is removed from dentry cache because its usage count drops
    to zero, the union_dirs in its union stack are freed too.
    ---
    fs/dcache.c | 11 +++++++++++
    1 files changed, 11 insertions(+), 0 deletions(-)

    diff --git a/fs/dcache.c b/fs/dcache.c
    index 54ff5a3..ce54dc5 100644
    --- a/fs/dcache.c
    +++ b/fs/dcache.c
    @@ -34,6 +34,7 @@
    #include <linux/fs_struct.h>
    #include <linux/hardirq.h>
    #include "internal.h"
    +#include "union.h"

    int sysctl_vfs_cache_pressure __read_mostly = 100;
    EXPORT_SYMBOL_GPL(sysctl_vfs_cache_pressure);
    @@ -175,6 +176,7 @@ static struct dentry *d_kill(struct dentry *dentry)
    dentry_stat.nr_dentry--; /* For d_free, below */
    /*drops the locks, at that point nobody can reach this dentry */
    dentry_iput(dentry);
    + d_free_unions(dentry);
    if (IS_ROOT(dentry))
    parent = NULL;
    else
    @@ -696,6 +698,7 @@ static void shrink_dcache_for_umount_subtree(struct dentry *dentry)
    iput(inode);
    }

    + d_free_unions(dentry);
    d_free(dentry);

    /* finished when we fall off the top of the tree,
    @@ -1535,6 +1538,7 @@ void d_delete(struct dentry * dentry)
    isdir = S_ISDIR(dentry->d_inode->i_mode);
    if (atomic_read(&dentry->d_count) == 1) {
    dentry_iput(dentry);
    + d_free_unions(dentry);
    fsnotify_nameremove(dentry, isdir);
    return;
    }
    @@ -1545,6 +1549,13 @@ void d_delete(struct dentry * dentry)
    spin_unlock(&dentry->d_lock);
    spin_unlock(&dcache_lock);

    + /*
    + * Remove any associated unions. While someone still has this
    + * directory open (ref count > 0), we could not have deleted
    + * it unless it was empty, and therefore has no references to
    + * directories below it. So we don't need the unions.
    + */
    + d_free_unions(dentry);
    fsnotify_nameremove(dentry, isdir);
    }
    EXPORT_SYMBOL(d_delete);
    --
    1.6.3.3


    \
     
     \ /
      Last update: 2010-06-15 20:49    [W:4.256 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site