mutex_lock(&dir->i_mutex);
dentry = d_lookup(parent, name);
- if (likely(!dentry)) {
- dentry = d_alloc_and_lookup(parent, name, nd);
- if (IS_ERR(dentry)) {
- mutex_unlock(&dir->i_mutex);
- return PTR_ERR(dentry);
- }
- /* known good */
- status = 1;
- } else if (unlikely(d_need_lookup(dentry))) {
+ if (dentry && d_need_lookup(dentry)) {
dentry = d_inode_lookup(parent, dentry, nd);
if (IS_ERR(dentry)) {
mutex_unlock(&dir->i_mutex);
return PTR_ERR(dentry);
}
- /* known good */
- status = 1;
- } else if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE))
+ } else if (dentry && (dentry->d_flags & DCACHE_OP_REVALIDATE)) {
status = d_revalidate(dentry, nd);
- if (unlikely(status <= 0)) {
- if (status < 0) {
- mutex_unlock(&dir->i_mutex);
- dput(dentry);
- return status;
- }
- if (!d_invalidate(dentry)) {
- dput(dentry);
- dentry = d_alloc_and_lookup(parent, name, nd);
- if (IS_ERR(dentry)) {
+ if (unlikely(status <= 0)) {
+ if (status < 0) {
mutex_unlock(&dir->i_mutex);
- return PTR_ERR(dentry);
+ dput(dentry);
+ return status;
}
- /* known good */
- status = 1;
+ if (!d_invalidate(dentry)) {
+ dput(dentry);
+ dentry = d_alloc_and_lookup(parent, name, nd);
+ if (IS_ERR(dentry)) {
+ mutex_unlock(&dir->i_mutex);
+ return PTR_ERR(dentry);
+ }
+ }
+ }
+ } else if (!dentry) {
+ dentry = d_alloc_and_lookup(parent, name, nd);
+ if (IS_ERR(dentry)) {
+ mutex_unlock(&dir->i_mutex);
+ return PTR_ERR(dentry);
}
}
mutex_unlock(&dir->i_mutex);