Skip to content

Commit

Permalink
fuse: delete dentry if timeout is zero
Browse files Browse the repository at this point in the history
Don't hold onto dentry in lru list if need to re-lookup it anyway at next
access.  Only do this if explicitly enabled, otherwise it could result in
performance regression.

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>
  • Loading branch information
Miklos Szeredi committed Sep 12, 2019
1 parent 0cd1eb9 commit 8fab010
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 3 deletions.
28 changes: 25 additions & 3 deletions fs/fuse/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,28 @@ 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;
struct fuse_conn *fc = get_fuse_conn_super(dentry->d_sb);
bool delete = !time && fc->delete_stale;
/*
* 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 ((!delete && (dentry->d_flags & DCACHE_OP_DELETE)) ||
(delete && !(dentry->d_flags & DCACHE_OP_DELETE))) {
spin_lock(&dentry->d_lock);
if (!delete)
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;
}
Expand Down Expand Up @@ -255,8 +271,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,
};
Expand Down
3 changes: 3 additions & 0 deletions fs/fuse/fuse_i.h
Original file line number Diff line number Diff line change
Expand Up @@ -692,6 +692,9 @@ struct fuse_conn {
/* Send DESTROY request */
unsigned int destroy:1;

/* Delete dentries that have gone stale */
unsigned int delete_stale:1;

/** The number of requests waiting for completion */
atomic_t num_waiting;

Expand Down

0 comments on commit 8fab010

Please sign in to comment.