From 61057fd3fd0643e15d06510bdc25c0418a5d19d2 Mon Sep 17 00:00:00 2001 From: Nick Piggin Date: Fri, 14 Jan 2011 02:36:19 +0000 Subject: [PATCH] --- yaml --- r: 230860 b: refs/heads/master c: 90dbb77ba48dddb87445d238e84cd137cf97dd98 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/namei.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index cb7d3888a5f6..ee85080d0bd0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: bb20c18db6fbb5e6ba499c76473a487d35073467 +refs/heads/master: 90dbb77ba48dddb87445d238e84cd137cf97dd98 diff --git a/trunk/fs/namei.c b/trunk/fs/namei.c index 0f02359ce685..14c73edca9ce 100644 --- a/trunk/fs/namei.c +++ b/trunk/fs/namei.c @@ -479,6 +479,14 @@ static int nameidata_dentry_drop_rcu(struct nameidata *nd, struct dentry *dentry struct fs_struct *fs = current->fs; struct dentry *parent = nd->path.dentry; + /* + * It can be possible to revalidate the dentry that we started + * the path walk with. force_reval_path may also revalidate the + * dentry already committed to the nameidata. + */ + if (unlikely(parent == dentry)) + return nameidata_drop_rcu(nd); + BUG_ON(!(nd->flags & LOOKUP_RCU)); if (nd->root.mnt) { spin_lock(&fs->lock);