lkml.org 
[lkml]   [2019]   [May]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 01/30] fuse: delete dentry if timeout is zero
    Date
    From: Miklos Szeredi <mszeredi@redhat.com>

    Don't hold onto dentry in lru list if need to re-lookup it anyway at next
    access.

    More advanced version of this patch would periodically flush out dentries
    from the lru which have gone stale.

    Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
    ---
    fs/fuse/dir.c | 26 +++++++++++++++++++++++---
    1 file changed, 23 insertions(+), 3 deletions(-)

    diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
    index dd0f64f7bc06..fd8636e67ae9 100644
    --- a/fs/fuse/dir.c
    +++ b/fs/fuse/dir.c
    @@ -29,12 +29,26 @@ union fuse_dentry {
    struct rcu_head rcu;
    };

    -static inline void fuse_dentry_settime(struct dentry *entry, u64 time)
    +static void fuse_dentry_settime(struct dentry *dentry, u64 time)
    {
    - ((union fuse_dentry *) entry->d_fsdata)->time = time;
    + /*
    + * Mess with DCACHE_OP_DELETE because dput() will be faster without it.
    + * Don't care about races, either way it's just an optimization
    + */
    + if ((time && (dentry->d_flags & DCACHE_OP_DELETE)) ||
    + (!time && !(dentry->d_flags & DCACHE_OP_DELETE))) {
    + spin_lock(&dentry->d_lock);
    + if (time)
    + dentry->d_flags &= ~DCACHE_OP_DELETE;
    + else
    + dentry->d_flags |= DCACHE_OP_DELETE;
    + spin_unlock(&dentry->d_lock);
    + }
    +
    + ((union fuse_dentry *) dentry->d_fsdata)->time = time;
    }

    -static inline u64 fuse_dentry_time(struct dentry *entry)
    +static inline u64 fuse_dentry_time(const struct dentry *entry)
    {
    return ((union fuse_dentry *) entry->d_fsdata)->time;
    }
    @@ -255,8 +269,14 @@ static void fuse_dentry_release(struct dentry *dentry)
    kfree_rcu(fd, rcu);
    }

    +static int fuse_dentry_delete(const struct dentry *dentry)
    +{
    + return time_before64(fuse_dentry_time(dentry), get_jiffies_64());
    +}
    +
    const struct dentry_operations fuse_dentry_operations = {
    .d_revalidate = fuse_dentry_revalidate,
    + .d_delete = fuse_dentry_delete,
    .d_init = fuse_dentry_init,
    .d_release = fuse_dentry_release,
    };
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-05-15 21:32    [W:3.153 / U:0.388 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site