From b94be42652c1200ab2df50e2aa292aade51ae264 Mon Sep 17 00:00:00 2001 From: Josef Bacik Date: Sun, 18 Sep 2011 10:34:03 -0400 Subject: [PATCH] --- yaml --- r: 263983 b: refs/heads/master c: a66e7cc626f42de6c745963fe0d807518fa49d39 h: refs/heads/master i: 263981: fe77060fe9035f44870cc306c59ef5492e49519c 263979: cad5c0aacb8967e1cecfe74bb4395112191635a9 263975: 801de5a9790b5365290d54e7d536a46f7f6fc0f2 263967: 33f6cc9e7adbd5a47bc3ad89ad4ca03a4af0c98f v: v3 --- [refs] | 2 +- trunk/fs/btrfs/inode.c | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 9b4f67520089..ea0d3a660bbc 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 48802c8ae2a9d618ec734a61283d645ad527e06c +refs/heads/master: a66e7cc626f42de6c745963fe0d807518fa49d39 diff --git a/trunk/fs/btrfs/inode.c b/trunk/fs/btrfs/inode.c index 377e9bb0974f..b2d004ad66a0 100644 --- a/trunk/fs/btrfs/inode.c +++ b/trunk/fs/btrfs/inode.c @@ -4018,7 +4018,8 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry) memcpy(&location, dentry->d_fsdata, sizeof(struct btrfs_key)); kfree(dentry->d_fsdata); dentry->d_fsdata = NULL; - d_clear_need_lookup(dentry); + /* This thing is hashed, drop it for now */ + d_drop(dentry); } else { ret = btrfs_inode_by_name(dir, dentry, &location); } @@ -4085,7 +4086,15 @@ static void btrfs_dentry_release(struct dentry *dentry) static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) { - return d_splice_alias(btrfs_lookup_dentry(dir, dentry), dentry); + struct dentry *ret; + + ret = d_splice_alias(btrfs_lookup_dentry(dir, dentry), dentry); + if (unlikely(d_need_lookup(dentry))) { + spin_lock(&dentry->d_lock); + dentry->d_flags &= ~DCACHE_NEED_LOOKUP; + spin_unlock(&dentry->d_lock); + } + return ret; } unsigned char btrfs_filetype_table[] = {