untangling do_lookup() - isolate !dentry stuff from the rest of it.
Duplicate the revalidation-related parts into if (!dentry) branch. Next step will be to pull them under i_mutex. This and the next 8 commits are more or less a splitup of patch by Miklos; folks, when you are working with something that convoluted, carve your patches up into easily reviewed steps, especially when a lot of codepaths involved are rarely hit... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
cda309de25
commit
3f6c7c71a2
1 changed files with 16 additions and 1 deletions
17
fs/namei.c
17
fs/namei.c
|
@ -1194,6 +1194,21 @@ retry:
|
||||||
status = 1;
|
status = 1;
|
||||||
}
|
}
|
||||||
mutex_unlock(&dir->i_mutex);
|
mutex_unlock(&dir->i_mutex);
|
||||||
|
if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE) && need_reval)
|
||||||
|
status = d_revalidate(dentry, nd);
|
||||||
|
if (unlikely(status <= 0)) {
|
||||||
|
if (status < 0) {
|
||||||
|
dput(dentry);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
if (!d_invalidate(dentry)) {
|
||||||
|
dput(dentry);
|
||||||
|
dentry = NULL;
|
||||||
|
need_reval = 1;
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE) && need_reval)
|
if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE) && need_reval)
|
||||||
status = d_revalidate(dentry, nd);
|
status = d_revalidate(dentry, nd);
|
||||||
|
@ -1209,7 +1224,7 @@ retry:
|
||||||
goto retry;
|
goto retry;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
done:
|
||||||
path->mnt = mnt;
|
path->mnt = mnt;
|
||||||
path->dentry = dentry;
|
path->dentry = dentry;
|
||||||
err = follow_managed(path, nd->flags);
|
err = follow_managed(path, nd->flags);
|
||||||
|
|
Loading…
Add table
Reference in a new issue