|
@@ -749,24 +749,6 @@ drop_root_mnt:
|
|
|
return -ECHILD;
|
|
|
}
|
|
|
|
|
|
-static int unlazy_link(struct nameidata *nd, struct path *link, unsigned seq)
|
|
|
-{
|
|
|
- if (unlikely(!legitimize_path(nd, link, seq))) {
|
|
|
- drop_links(nd);
|
|
|
- nd->depth = 0;
|
|
|
- nd->flags &= ~LOOKUP_RCU;
|
|
|
- nd->path.mnt = NULL;
|
|
|
- nd->path.dentry = NULL;
|
|
|
- if (!(nd->flags & LOOKUP_ROOT))
|
|
|
- nd->root.mnt = NULL;
|
|
|
- rcu_read_unlock();
|
|
|
- } else if (likely(unlazy_walk(nd, NULL, 0)) == 0) {
|
|
|
- return 0;
|
|
|
- }
|
|
|
- path_put(link);
|
|
|
- return -ECHILD;
|
|
|
-}
|
|
|
-
|
|
|
static inline int d_revalidate(struct dentry *dentry, unsigned int flags)
|
|
|
{
|
|
|
return dentry->d_op->d_revalidate(dentry, flags);
|
|
@@ -1706,9 +1688,17 @@ static int pick_link(struct nameidata *nd, struct path *link,
|
|
|
error = nd_alloc_stack(nd);
|
|
|
if (unlikely(error)) {
|
|
|
if (error == -ECHILD) {
|
|
|
- if (unlikely(unlazy_link(nd, link, seq)))
|
|
|
- return -ECHILD;
|
|
|
- error = nd_alloc_stack(nd);
|
|
|
+ if (unlikely(!legitimize_path(nd, link, seq))) {
|
|
|
+ drop_links(nd);
|
|
|
+ nd->depth = 0;
|
|
|
+ nd->flags &= ~LOOKUP_RCU;
|
|
|
+ nd->path.mnt = NULL;
|
|
|
+ nd->path.dentry = NULL;
|
|
|
+ if (!(nd->flags & LOOKUP_ROOT))
|
|
|
+ nd->root.mnt = NULL;
|
|
|
+ rcu_read_unlock();
|
|
|
+ } else if (likely(unlazy_walk(nd, NULL, 0)) == 0)
|
|
|
+ error = nd_alloc_stack(nd);
|
|
|
}
|
|
|
if (error) {
|
|
|
path_put(link);
|