Everything arriving into if (!dentry) will have need_reval = 1.
Indeed, the only way to get there with need_reval reset to 0 would
be via
if (unlikely(d_need_lookup(dentry)))
goto unlazy;
if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE)) {
status = d_revalidate(dentry, nd);
if (unlikely(status <= 0)) {
if (status != -ECHILD)
need_reval = 0;
goto unlazy;
...
unlazy:
/* no assignments to dentry */
if (dentry && unlikely(d_need_lookup(dentry))) {
dput(dentry);
dentry = NULL;
}
and if d_need_lookup() had already been false the first time around, it
will remain false on the second call as well.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
return PTR_ERR(dentry);
}
/* known good */
- need_reval = 0;
status = 1;
} else if (unlikely(d_need_lookup(dentry))) {
dentry = d_inode_lookup(parent, dentry, nd);
return PTR_ERR(dentry);
}
/* known good */
- need_reval = 0;
status = 1;
- }
- if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE) && need_reval)
+ } else if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE))
status = d_revalidate(dentry, nd);
if (unlikely(status <= 0)) {
if (status < 0) {
return PTR_ERR(dentry);
}
/* known good */
- need_reval = 0;
status = 1;
}
}
if (!d_invalidate(dentry)) {
dput(dentry);
dentry = NULL;
- need_reval = 1;
goto retry;
}
}