Lines Matching refs:nd

789 static bool nd_alloc_stack(struct nameidata *nd)  in nd_alloc_stack()  argument
794 nd->flags & LOOKUP_RCU ? GFP_ATOMIC : GFP_KERNEL); in nd_alloc_stack()
797 memcpy(p, nd->internal, sizeof(nd->internal)); in nd_alloc_stack()
798 nd->stack = p; in nd_alloc_stack()
821 static void drop_links(struct nameidata *nd) in drop_links() argument
823 int i = nd->depth; in drop_links()
825 struct saved *last = nd->stack + i; in drop_links()
831 static void leave_rcu(struct nameidata *nd) in leave_rcu() argument
833 nd->flags &= ~LOOKUP_RCU; in leave_rcu()
834 nd->seq = nd->next_seq = 0; in leave_rcu()
838 static void terminate_walk(struct nameidata *nd) in terminate_walk() argument
840 if (unlikely(nd->depth)) in terminate_walk()
841 drop_links(nd); in terminate_walk()
842 if (!(nd->flags & LOOKUP_RCU)) { in terminate_walk()
844 path_put(&nd->path); in terminate_walk()
845 for (i = 0; i < nd->depth; i++) in terminate_walk()
846 path_put(&nd->stack[i].link); in terminate_walk()
847 if (nd->state & ND_ROOT_GRABBED) { in terminate_walk()
848 path_put(&nd->root); in terminate_walk()
849 nd->state &= ~ND_ROOT_GRABBED; in terminate_walk()
852 leave_rcu(nd); in terminate_walk()
854 nd->depth = 0; in terminate_walk()
855 nd->path.mnt = NULL; in terminate_walk()
856 nd->path.dentry = NULL; in terminate_walk()
876 static inline bool legitimize_path(struct nameidata *nd, in legitimize_path() argument
879 return __legitimize_path(path, seq, nd->m_seq); in legitimize_path()
882 static bool legitimize_links(struct nameidata *nd) in legitimize_links() argument
886 VFS_BUG_ON(nd->flags & LOOKUP_CACHED); in legitimize_links()
888 for (i = 0; i < nd->depth; i++) { in legitimize_links()
889 struct saved *last = nd->stack + i; in legitimize_links()
890 if (unlikely(!legitimize_path(nd, &last->link, last->seq))) { in legitimize_links()
891 drop_links(nd); in legitimize_links()
892 nd->depth = i + 1; in legitimize_links()
899 static bool legitimize_root(struct nameidata *nd) in legitimize_root() argument
902 if (!nd->root.mnt || (nd->state & ND_ROOT_PRESET)) in legitimize_root()
904 nd->state |= ND_ROOT_GRABBED; in legitimize_root()
905 return legitimize_path(nd, &nd->root, nd->root_seq); in legitimize_root()
930 static bool try_to_unlazy(struct nameidata *nd) in try_to_unlazy() argument
932 struct dentry *parent = nd->path.dentry; in try_to_unlazy()
934 VFS_BUG_ON(!(nd->flags & LOOKUP_RCU)); in try_to_unlazy()
936 if (unlikely(nd->flags & LOOKUP_CACHED)) { in try_to_unlazy()
937 drop_links(nd); in try_to_unlazy()
938 nd->depth = 0; in try_to_unlazy()
941 if (unlikely(nd->depth && !legitimize_links(nd))) in try_to_unlazy()
943 if (unlikely(!legitimize_path(nd, &nd->path, nd->seq))) in try_to_unlazy()
945 if (unlikely(!legitimize_root(nd))) in try_to_unlazy()
947 leave_rcu(nd); in try_to_unlazy()
948 BUG_ON(nd->inode != parent->d_inode); in try_to_unlazy()
952 nd->path.mnt = NULL; in try_to_unlazy()
953 nd->path.dentry = NULL; in try_to_unlazy()
955 leave_rcu(nd); in try_to_unlazy()
971 static bool try_to_unlazy_next(struct nameidata *nd, struct dentry *dentry) in try_to_unlazy_next() argument
975 VFS_BUG_ON(!(nd->flags & LOOKUP_RCU)); in try_to_unlazy_next()
977 if (unlikely(nd->flags & LOOKUP_CACHED)) { in try_to_unlazy_next()
978 drop_links(nd); in try_to_unlazy_next()
979 nd->depth = 0; in try_to_unlazy_next()
982 if (unlikely(nd->depth && !legitimize_links(nd))) in try_to_unlazy_next()
984 res = __legitimize_mnt(nd->path.mnt, nd->m_seq); in try_to_unlazy_next()
990 if (unlikely(!lockref_get_not_dead(&nd->path.dentry->d_lockref))) in try_to_unlazy_next()
1002 if (read_seqcount_retry(&dentry->d_seq, nd->next_seq)) in try_to_unlazy_next()
1008 if (unlikely(!legitimize_root(nd))) in try_to_unlazy_next()
1010 leave_rcu(nd); in try_to_unlazy_next()
1014 nd->path.mnt = NULL; in try_to_unlazy_next()
1016 nd->path.dentry = NULL; in try_to_unlazy_next()
1018 leave_rcu(nd); in try_to_unlazy_next()
1021 leave_rcu(nd); in try_to_unlazy_next()
1045 static int complete_walk(struct nameidata *nd) in complete_walk() argument
1047 struct dentry *dentry = nd->path.dentry; in complete_walk()
1050 if (nd->flags & LOOKUP_RCU) { in complete_walk()
1055 if (likely(!(nd->state & ND_ROOT_PRESET))) in complete_walk()
1056 if (likely(!(nd->flags & LOOKUP_IS_SCOPED))) in complete_walk()
1057 nd->root.mnt = NULL; in complete_walk()
1058 nd->flags &= ~LOOKUP_CACHED; in complete_walk()
1059 if (!try_to_unlazy(nd)) in complete_walk()
1063 if (unlikely(nd->flags & LOOKUP_IS_SCOPED)) { in complete_walk()
1080 if (!path_is_under(&nd->path, &nd->root)) in complete_walk()
1084 if (likely(!(nd->state & ND_JUMPED))) in complete_walk()
1090 status = dentry->d_op->d_weak_revalidate(dentry, nd->flags); in complete_walk()
1100 static int set_root(struct nameidata *nd) in set_root() argument
1109 if (WARN_ON(nd->flags & LOOKUP_IS_SCOPED)) in set_root()
1112 if (nd->flags & LOOKUP_RCU) { in set_root()
1117 nd->root = fs->root; in set_root()
1118 nd->root_seq = __read_seqcount_begin(&nd->root.dentry->d_seq); in set_root()
1121 get_fs_root(fs, &nd->root); in set_root()
1122 nd->state |= ND_ROOT_GRABBED; in set_root()
1127 static int nd_jump_root(struct nameidata *nd) in nd_jump_root() argument
1129 if (unlikely(nd->flags & LOOKUP_BENEATH)) in nd_jump_root()
1131 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) { in nd_jump_root()
1133 if (nd->path.mnt != NULL && nd->path.mnt != nd->root.mnt) in nd_jump_root()
1136 if (!nd->root.mnt) { in nd_jump_root()
1137 int error = set_root(nd); in nd_jump_root()
1141 if (nd->flags & LOOKUP_RCU) { in nd_jump_root()
1143 nd->path = nd->root; in nd_jump_root()
1144 d = nd->path.dentry; in nd_jump_root()
1145 nd->inode = d->d_inode; in nd_jump_root()
1146 nd->seq = nd->root_seq; in nd_jump_root()
1147 if (read_seqcount_retry(&d->d_seq, nd->seq)) in nd_jump_root()
1150 path_put(&nd->path); in nd_jump_root()
1151 nd->path = nd->root; in nd_jump_root()
1152 path_get(&nd->path); in nd_jump_root()
1153 nd->inode = nd->path.dentry->d_inode; in nd_jump_root()
1155 nd->state |= ND_JUMPED; in nd_jump_root()
1166 struct nameidata *nd = current->nameidata; in nd_jump_link() local
1168 if (unlikely(nd->flags & LOOKUP_NO_MAGICLINKS)) in nd_jump_link()
1172 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) { in nd_jump_link()
1173 if (nd->path.mnt != path->mnt) in nd_jump_link()
1177 if (unlikely(nd->flags & LOOKUP_IS_SCOPED)) in nd_jump_link()
1180 path_put(&nd->path); in nd_jump_link()
1181 nd->path = *path; in nd_jump_link()
1182 nd->inode = nd->path.dentry->d_inode; in nd_jump_link()
1183 nd->state |= ND_JUMPED; in nd_jump_link()
1191 static inline void put_link(struct nameidata *nd) in put_link() argument
1193 struct saved *last = nd->stack + --nd->depth; in put_link()
1195 if (!(nd->flags & LOOKUP_RCU)) in put_link()
1269 static inline int may_follow_link(struct nameidata *nd, const struct inode *inode) in may_follow_link() argument
1277 idmap = mnt_idmap(nd->path.mnt); in may_follow_link()
1284 if ((nd->dir_mode & (S_ISVTX|S_IWOTH)) != (S_ISVTX|S_IWOTH)) in may_follow_link()
1288 if (vfsuid_valid(nd->dir_vfsuid) && vfsuid_eq(nd->dir_vfsuid, vfsuid)) in may_follow_link()
1291 if (nd->flags & LOOKUP_RCU) in may_follow_link()
1294 audit_inode(nd->name, nd->stack[0].link.dentry, 0); in may_follow_link()
1405 static int may_create_in_sticky(struct mnt_idmap *idmap, struct nameidata *nd, in may_create_in_sticky() argument
1408 umode_t dir_mode = nd->dir_mode; in may_create_in_sticky()
1409 vfsuid_t dir_vfsuid = nd->dir_vfsuid, i_vfsuid; in may_create_in_sticky()
1682 static bool __follow_mount_rcu(struct nameidata *nd, struct path *path) in __follow_mount_rcu() argument
1687 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) in __follow_mount_rcu()
1707 nd->state |= ND_JUMPED; in __follow_mount_rcu()
1708 nd->next_seq = read_seqcount_begin(&dentry->d_seq); in __follow_mount_rcu()
1712 if (read_seqretry(&mount_lock, nd->m_seq)) in __follow_mount_rcu()
1716 if (read_seqretry(&mount_lock, nd->m_seq)) in __follow_mount_rcu()
1723 static inline int handle_mounts(struct nameidata *nd, struct dentry *dentry, in handle_mounts() argument
1729 path->mnt = nd->path.mnt; in handle_mounts()
1731 if (nd->flags & LOOKUP_RCU) { in handle_mounts()
1732 unsigned int seq = nd->next_seq; in handle_mounts()
1735 if (likely(__follow_mount_rcu(nd, path))) in handle_mounts()
1738 path->mnt = nd->path.mnt; in handle_mounts()
1740 nd->next_seq = seq; in handle_mounts()
1741 if (unlikely(!try_to_unlazy_next(nd, dentry))) in handle_mounts()
1744 ret = traverse_mounts(path, &jumped, &nd->total_link_count, nd->flags); in handle_mounts()
1746 nd->state |= ND_JUMPED; in handle_mounts()
1749 if (path->mnt != nd->path.mnt) in handle_mounts()
1839 static struct dentry *lookup_fast(struct nameidata *nd) in lookup_fast() argument
1841 struct dentry *dentry, *parent = nd->path.dentry; in lookup_fast()
1849 if (nd->flags & LOOKUP_RCU) { in lookup_fast()
1850 dentry = __d_lookup_rcu(parent, &nd->last, &nd->next_seq); in lookup_fast()
1852 if (!try_to_unlazy(nd)) in lookup_fast()
1861 if (read_seqcount_retry(&parent->d_seq, nd->seq)) in lookup_fast()
1864 status = d_revalidate(nd->inode, &nd->last, dentry, nd->flags); in lookup_fast()
1867 if (!try_to_unlazy_next(nd, dentry)) in lookup_fast()
1871 status = d_revalidate(nd->inode, &nd->last, in lookup_fast()
1872 dentry, nd->flags); in lookup_fast()
1874 dentry = __d_lookup(parent, &nd->last); in lookup_fast()
1877 status = d_revalidate(nd->inode, &nd->last, dentry, nd->flags); in lookup_fast()
1953 struct nameidata *restrict nd) in may_lookup() argument
1957 mask = nd->flags & LOOKUP_RCU ? MAY_NOT_BLOCK : 0; in may_lookup()
1958 err = lookup_inode_permission_may_exec(idmap, nd->inode, mask); in may_lookup()
1963 if (!(nd->flags & LOOKUP_RCU)) in may_lookup()
1967 if (!try_to_unlazy(nd)) in may_lookup()
1973 return lookup_inode_permission_may_exec(idmap, nd->inode, 0); in may_lookup()
1976 static int reserve_stack(struct nameidata *nd, struct path *link) in reserve_stack() argument
1978 if (unlikely(nd->total_link_count++ >= MAXSYMLINKS)) in reserve_stack()
1981 if (likely(nd->depth != EMBEDDED_LEVELS)) in reserve_stack()
1983 if (likely(nd->stack != nd->internal)) in reserve_stack()
1985 if (likely(nd_alloc_stack(nd))) in reserve_stack()
1988 if (nd->flags & LOOKUP_RCU) { in reserve_stack()
1991 bool grabbed_link = legitimize_path(nd, link, nd->next_seq); in reserve_stack()
1993 if (!try_to_unlazy(nd) || !grabbed_link) in reserve_stack()
1996 if (nd_alloc_stack(nd)) in reserve_stack()
2004 static noinline const char *pick_link(struct nameidata *nd, struct path *link, in pick_link() argument
2011 if (nd->flags & LOOKUP_RCU) { in pick_link()
2013 if (read_seqcount_retry(&link->dentry->d_seq, nd->next_seq)) in pick_link()
2016 if (link->mnt == nd->path.mnt) in pick_link()
2020 error = reserve_stack(nd, link); in pick_link()
2022 if (!(nd->flags & LOOKUP_RCU)) in pick_link()
2026 last = nd->stack + nd->depth++; in pick_link()
2029 last->seq = nd->next_seq; in pick_link()
2032 error = may_follow_link(nd, inode); in pick_link()
2037 if (unlikely(nd->flags & LOOKUP_NO_SYMLINKS) || in pick_link()
2042 if (nd->flags & LOOKUP_RCU) { in pick_link()
2043 if (!try_to_unlazy(nd)) in pick_link()
2051 nd->flags & LOOKUP_RCU); in pick_link()
2060 if (nd->flags & LOOKUP_RCU) { in pick_link()
2062 if (res == ERR_PTR(-ECHILD) && try_to_unlazy(nd)) in pick_link()
2073 error = nd_jump_root(nd); in pick_link()
2082 put_link(nd); in pick_link()
2094 static noinline const char *step_into_slowpath(struct nameidata *nd, int flags, in step_into_slowpath() argument
2101 err = handle_mounts(nd, dentry, &path); in step_into_slowpath()
2106 ((flags & WALK_TRAILING) && !(nd->flags & LOOKUP_FOLLOW)) || in step_into_slowpath()
2109 if (nd->flags & LOOKUP_RCU) { in step_into_slowpath()
2110 if (read_seqcount_retry(&path.dentry->d_seq, nd->next_seq)) in step_into_slowpath()
2115 dput(nd->path.dentry); in step_into_slowpath()
2116 if (nd->path.mnt != path.mnt) in step_into_slowpath()
2117 mntput(nd->path.mnt); in step_into_slowpath()
2119 nd->path = path; in step_into_slowpath()
2120 nd->inode = inode; in step_into_slowpath()
2121 nd->seq = nd->next_seq; in step_into_slowpath()
2124 return pick_link(nd, &path, inode, flags); in step_into_slowpath()
2127 static __always_inline const char *step_into(struct nameidata *nd, int flags, in step_into() argument
2136 if (likely((nd->flags & LOOKUP_RCU) && in step_into()
2139 if (read_seqcount_retry(&dentry->d_seq, nd->next_seq)) in step_into()
2143 nd->path.dentry = dentry; in step_into()
2145 nd->inode = inode; in step_into()
2146 nd->seq = nd->next_seq; in step_into()
2149 return step_into_slowpath(nd, flags, dentry); in step_into()
2152 static struct dentry *follow_dotdot_rcu(struct nameidata *nd) in follow_dotdot_rcu() argument
2156 if (path_equal(&nd->path, &nd->root)) in follow_dotdot_rcu()
2158 if (unlikely(nd->path.dentry == nd->path.mnt->mnt_root)) { in follow_dotdot_rcu()
2161 if (!choose_mountpoint_rcu(real_mount(nd->path.mnt), in follow_dotdot_rcu()
2162 &nd->root, &path, &seq)) in follow_dotdot_rcu()
2164 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) in follow_dotdot_rcu()
2166 nd->path = path; in follow_dotdot_rcu()
2167 nd->inode = path.dentry->d_inode; in follow_dotdot_rcu()
2168 nd->seq = seq; in follow_dotdot_rcu()
2170 if (read_seqretry(&mount_lock, nd->m_seq)) in follow_dotdot_rcu()
2174 old = nd->path.dentry; in follow_dotdot_rcu()
2176 nd->next_seq = read_seqcount_begin(&parent->d_seq); in follow_dotdot_rcu()
2178 if (read_seqcount_retry(&old->d_seq, nd->seq)) in follow_dotdot_rcu()
2180 if (unlikely(!path_connected(nd->path.mnt, parent))) in follow_dotdot_rcu()
2184 if (read_seqretry(&mount_lock, nd->m_seq)) in follow_dotdot_rcu()
2186 if (unlikely(nd->flags & LOOKUP_BENEATH)) in follow_dotdot_rcu()
2188 nd->next_seq = nd->seq; in follow_dotdot_rcu()
2189 return nd->path.dentry; in follow_dotdot_rcu()
2192 static struct dentry *follow_dotdot(struct nameidata *nd) in follow_dotdot() argument
2196 if (path_equal(&nd->path, &nd->root)) in follow_dotdot()
2198 if (unlikely(nd->path.dentry == nd->path.mnt->mnt_root)) { in follow_dotdot()
2201 if (!choose_mountpoint(real_mount(nd->path.mnt), in follow_dotdot()
2202 &nd->root, &path)) in follow_dotdot()
2204 path_put(&nd->path); in follow_dotdot()
2205 nd->path = path; in follow_dotdot()
2206 nd->inode = path.dentry->d_inode; in follow_dotdot()
2207 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) in follow_dotdot()
2211 parent = dget_parent(nd->path.dentry); in follow_dotdot()
2212 if (unlikely(!path_connected(nd->path.mnt, parent))) { in follow_dotdot()
2219 if (unlikely(nd->flags & LOOKUP_BENEATH)) in follow_dotdot()
2221 return dget(nd->path.dentry); in follow_dotdot()
2224 static const char *handle_dots(struct nameidata *nd, int type) in handle_dots() argument
2230 if (!nd->root.mnt) { in handle_dots()
2231 error = ERR_PTR(set_root(nd)); in handle_dots()
2235 if (nd->flags & LOOKUP_RCU) in handle_dots()
2236 parent = follow_dotdot_rcu(nd); in handle_dots()
2238 parent = follow_dotdot(nd); in handle_dots()
2241 error = step_into(nd, WALK_NOFOLLOW, parent); in handle_dots()
2245 if (unlikely(nd->flags & LOOKUP_IS_SCOPED)) { in handle_dots()
2253 if (__read_seqcount_retry(&mount_lock.seqcount, nd->m_seq)) in handle_dots()
2255 if (__read_seqcount_retry(&rename_lock.seqcount, nd->r_seq)) in handle_dots()
2262 static __always_inline const char *walk_component(struct nameidata *nd, int flags) in walk_component() argument
2270 if (unlikely(nd->last_type != LAST_NORM)) { in walk_component()
2271 if (unlikely(nd->depth) && !(flags & WALK_MORE)) in walk_component()
2272 put_link(nd); in walk_component()
2273 return handle_dots(nd, nd->last_type); in walk_component()
2275 dentry = lookup_fast(nd); in walk_component()
2279 dentry = lookup_slow(&nd->last, nd->path.dentry, nd->flags); in walk_component()
2283 if (unlikely(nd->depth) && !(flags & WALK_MORE)) in walk_component()
2284 put_link(nd); in walk_component()
2285 return step_into(nd, flags, dentry); in walk_component()
2443 static inline const char *hash_name(struct nameidata *nd, in hash_name() argument
2447 unsigned long a, b, x, y = (unsigned long)nd->path.dentry; in hash_name()
2464 nd->last.hash = fold_hash(a, y); in hash_name()
2465 nd->last.len = len; in hash_name()
2486 nd->last.hash = fold_hash(x, y); in hash_name()
2487 nd->last.len = len; in hash_name()
2532 static inline const char *hash_name(struct nameidata *nd, const char *name, unsigned long *lastword) in hash_name() argument
2534 unsigned long hash = init_name_hash(nd->path.dentry); in hash_name()
2549 nd->last.hash = end_name_hash(hash); in hash_name()
2550 nd->last.len = len; in hash_name()
2569 static int link_path_walk(const char *name, struct nameidata *nd) in link_path_walk() argument
2574 nd->last_type = LAST_ROOT; in link_path_walk()
2575 nd->flags |= LOOKUP_PARENT; in link_path_walk()
2584 nd->dir_mode = 0; // short-circuit the 'hardening' idiocy in link_path_walk()
2594 idmap = mnt_idmap(nd->path.mnt); in link_path_walk()
2595 err = may_lookup(idmap, nd); in link_path_walk()
2599 nd->last.name = name; in link_path_walk()
2600 name = hash_name(nd, name, &lastword); in link_path_walk()
2604 nd->last_type = LAST_DOTDOT; in link_path_walk()
2605 nd->state |= ND_JUMPED; in link_path_walk()
2609 nd->last_type = LAST_DOT; in link_path_walk()
2613 nd->last_type = LAST_NORM; in link_path_walk()
2614 nd->state &= ~ND_JUMPED; in link_path_walk()
2616 struct dentry *parent = nd->path.dentry; in link_path_walk()
2618 err = parent->d_op->d_hash(parent, &nd->last); in link_path_walk()
2637 nd->dir_vfsuid = i_uid_into_vfsuid(idmap, nd->inode); in link_path_walk()
2638 nd->dir_mode = nd->inode->i_mode; in link_path_walk()
2639 nd->flags &= ~LOOKUP_PARENT; in link_path_walk()
2643 name = nd->stack[--depth].name; in link_path_walk()
2644 link = walk_component(nd, 0); in link_path_walk()
2647 link = walk_component(nd, WALK_MORE); in link_path_walk()
2653 nd->stack[depth++].name = name; in link_path_walk()
2657 if (unlikely(!d_can_lookup(nd->path.dentry))) { in link_path_walk()
2658 if (nd->flags & LOOKUP_RCU) { in link_path_walk()
2659 if (!try_to_unlazy(nd)) in link_path_walk()
2668 static const char *path_init(struct nameidata *nd, unsigned flags) in path_init() argument
2671 const char *s = nd->pathname; in path_init()
2682 nd->seq = nd->next_seq = 0; in path_init()
2684 nd->flags = flags; in path_init()
2685 nd->state |= ND_JUMPED; in path_init()
2687 nd->m_seq = __read_seqcount_begin(&mount_lock.seqcount); in path_init()
2688 nd->r_seq = __read_seqcount_begin(&rename_lock.seqcount); in path_init()
2691 if (unlikely(nd->state & ND_ROOT_PRESET)) { in path_init()
2692 struct dentry *root = nd->root.dentry; in path_init()
2696 nd->path = nd->root; in path_init()
2697 nd->inode = inode; in path_init()
2699 nd->seq = read_seqcount_begin(&nd->path.dentry->d_seq); in path_init()
2700 nd->root_seq = nd->seq; in path_init()
2702 path_get(&nd->path); in path_init()
2707 nd->root.mnt = NULL; in path_init()
2711 error = nd_jump_root(nd); in path_init()
2718 if (nd->dfd == AT_FDCWD) { in path_init()
2725 nd->path = fs->pwd; in path_init()
2726 nd->inode = nd->path.dentry->d_inode; in path_init()
2727 nd->seq = __read_seqcount_begin(&nd->path.dentry->d_seq); in path_init()
2730 get_fs_pwd(current->fs, &nd->path); in path_init()
2731 nd->inode = nd->path.dentry->d_inode; in path_init()
2735 CLASS(fd_raw, f)(nd->dfd); in path_init()
2752 nd->path = fd_file(f)->f_path; in path_init()
2754 nd->inode = nd->path.dentry->d_inode; in path_init()
2755 nd->seq = read_seqcount_begin(&nd->path.dentry->d_seq); in path_init()
2757 path_get(&nd->path); in path_init()
2758 nd->inode = nd->path.dentry->d_inode; in path_init()
2764 nd->root = nd->path; in path_init()
2766 nd->root_seq = nd->seq; in path_init()
2768 path_get(&nd->root); in path_init()
2769 nd->state |= ND_ROOT_GRABBED; in path_init()
2775 static inline const char *lookup_last(struct nameidata *nd) in lookup_last() argument
2777 if (nd->last_type == LAST_NORM && nd->last.name[nd->last.len]) in lookup_last()
2778 nd->flags |= LOOKUP_FOLLOW | LOOKUP_DIRECTORY; in lookup_last()
2780 return walk_component(nd, WALK_TRAILING); in lookup_last()
2783 static int handle_lookup_down(struct nameidata *nd) in handle_lookup_down() argument
2785 if (!(nd->flags & LOOKUP_RCU)) in handle_lookup_down()
2786 dget(nd->path.dentry); in handle_lookup_down()
2787 nd->next_seq = nd->seq; in handle_lookup_down()
2788 return PTR_ERR(step_into(nd, WALK_NOFOLLOW, nd->path.dentry)); in handle_lookup_down()
2792 static int path_lookupat(struct nameidata *nd, unsigned flags, struct path *path) in path_lookupat() argument
2794 const char *s = path_init(nd, flags); in path_lookupat()
2798 err = handle_lookup_down(nd); in path_lookupat()
2803 while (!(err = link_path_walk(s, nd)) && in path_lookupat()
2804 (s = lookup_last(nd)) != NULL) in path_lookupat()
2806 if (!err && unlikely(nd->flags & LOOKUP_MOUNTPOINT)) { in path_lookupat()
2807 err = handle_lookup_down(nd); in path_lookupat()
2808 nd->state &= ~ND_JUMPED; // no d_weak_revalidate(), please... in path_lookupat()
2811 err = complete_walk(nd); in path_lookupat()
2813 if (!err && nd->flags & LOOKUP_DIRECTORY) in path_lookupat()
2814 if (!d_can_lookup(nd->path.dentry)) in path_lookupat()
2817 *path = nd->path; in path_lookupat()
2818 nd->path.mnt = NULL; in path_lookupat()
2819 nd->path.dentry = NULL; in path_lookupat()
2821 terminate_walk(nd); in path_lookupat()
2829 struct nameidata nd; in filename_lookup() local
2832 set_nameidata(&nd, dfd, name, root); in filename_lookup()
2833 retval = path_lookupat(&nd, flags | LOOKUP_RCU, path); in filename_lookup()
2835 retval = path_lookupat(&nd, flags, path); in filename_lookup()
2837 retval = path_lookupat(&nd, flags | LOOKUP_REVAL, path); in filename_lookup()
2847 static int path_parentat(struct nameidata *nd, unsigned flags, in path_parentat() argument
2850 const char *s = path_init(nd, flags); in path_parentat()
2851 int err = link_path_walk(s, nd); in path_parentat()
2853 err = complete_walk(nd); in path_parentat()
2855 *parent = nd->path; in path_parentat()
2856 nd->path.mnt = NULL; in path_parentat()
2857 nd->path.dentry = NULL; in path_parentat()
2859 terminate_walk(nd); in path_parentat()
2870 struct nameidata nd; in __filename_parentat() local
2874 set_nameidata(&nd, dfd, name, root); in __filename_parentat()
2875 retval = path_parentat(&nd, flags | LOOKUP_RCU, parent); in __filename_parentat()
2877 retval = path_parentat(&nd, flags, parent); in __filename_parentat()
2879 retval = path_parentat(&nd, flags | LOOKUP_REVAL, parent); in __filename_parentat()
2881 *last = nd.last; in __filename_parentat()
2882 *type = nd.last_type; in __filename_parentat()
4378 static struct dentry *lookup_open(struct nameidata *nd, struct file *file, in lookup_open() argument
4383 struct dentry *dir = nd->path.dentry; in lookup_open()
4395 dentry = d_lookup(dir, &nd->last); in lookup_open()
4398 dentry = d_alloc_parallel(dir, &nd->last, &wq); in lookup_open()
4405 error = d_revalidate(dir_inode, &nd->last, dentry, nd->flags); in lookup_open()
4420 audit_inode(nd->name, dir, AUDIT_INODE_PARENT); in lookup_open()
4433 idmap = mnt_idmap(nd->path.mnt); in lookup_open()
4439 create_error = may_o_create(idmap, &nd->path, in lookup_open()
4447 if (nd->flags & LOOKUP_DIRECTORY) in lookup_open()
4449 dentry = atomic_open(&nd->path, dentry, file, open_flag, mode); in lookup_open()
4457 nd->flags); in lookup_open()
4499 static inline bool trailing_slashes(struct nameidata *nd) in trailing_slashes() argument
4501 return (bool)nd->last.name[nd->last.len]; in trailing_slashes()
4504 static struct dentry *lookup_fast_for_open(struct nameidata *nd, int open_flag) in lookup_fast_for_open() argument
4509 if (trailing_slashes(nd)) in lookup_fast_for_open()
4517 if (trailing_slashes(nd)) in lookup_fast_for_open()
4518 nd->flags |= LOOKUP_FOLLOW | LOOKUP_DIRECTORY; in lookup_fast_for_open()
4520 dentry = lookup_fast(nd); in lookup_fast_for_open()
4527 if (!(nd->flags & LOOKUP_RCU)) in lookup_fast_for_open()
4535 static const char *open_last_lookups(struct nameidata *nd, in open_last_lookups() argument
4539 struct dentry *dir = nd->path.dentry; in open_last_lookups()
4545 nd->flags |= op->intent; in open_last_lookups()
4547 if (nd->last_type != LAST_NORM) { in open_last_lookups()
4548 if (nd->depth) in open_last_lookups()
4549 put_link(nd); in open_last_lookups()
4550 return handle_dots(nd, nd->last_type); in open_last_lookups()
4554 dentry = lookup_fast_for_open(nd, open_flag); in open_last_lookups()
4562 if (WARN_ON_ONCE(nd->flags & LOOKUP_RCU)) in open_last_lookups()
4565 if (nd->flags & LOOKUP_RCU) { in open_last_lookups()
4566 if (!try_to_unlazy(nd)) in open_last_lookups()
4572 got_write = !mnt_want_write(nd->path.mnt); in open_last_lookups()
4583 dentry = lookup_open(nd, file, op, got_write, &delegated_inode); in open_last_lookups()
4596 mnt_drop_write(nd->path.mnt); in open_last_lookups()
4610 dput(nd->path.dentry); in open_last_lookups()
4611 nd->path.dentry = dentry; in open_last_lookups()
4616 if (nd->depth) in open_last_lookups()
4617 put_link(nd); in open_last_lookups()
4618 res = step_into(nd, WALK_TRAILING, dentry); in open_last_lookups()
4620 nd->flags &= ~(LOOKUP_OPEN|LOOKUP_CREATE|LOOKUP_EXCL); in open_last_lookups()
4627 static int do_open(struct nameidata *nd, in do_open() argument
4637 error = complete_walk(nd); in do_open()
4642 audit_inode(nd->name, nd->path.dentry, 0); in do_open()
4643 idmap = mnt_idmap(nd->path.mnt); in do_open()
4647 if (d_is_dir(nd->path.dentry)) in do_open()
4649 error = may_create_in_sticky(idmap, nd, in do_open()
4650 d_backing_inode(nd->path.dentry)); in do_open()
4654 if ((nd->flags & LOOKUP_DIRECTORY) && !d_can_lookup(nd->path.dentry)) in do_open()
4663 } else if (d_is_reg(nd->path.dentry) && open_flag & O_TRUNC) { in do_open()
4664 error = mnt_want_write(nd->path.mnt); in do_open()
4669 error = may_open(idmap, &nd->path, acc_mode, open_flag); in do_open()
4671 error = vfs_open(&nd->path, file); in do_open()
4681 mnt_drop_write(nd->path.mnt); in do_open()
4775 static int do_tmpfile(struct nameidata *nd, unsigned flags, in do_tmpfile() argument
4780 int error = path_lookupat(nd, flags | LOOKUP_DIRECTORY, &path); in do_tmpfile()
4790 audit_inode(nd->name, file->f_path.dentry, 0); in do_tmpfile()
4798 static int do_o_path(struct nameidata *nd, unsigned flags, struct file *file) in do_o_path() argument
4801 int error = path_lookupat(nd, flags, &path); in do_o_path()
4803 audit_inode(nd->name, path.dentry, 0); in do_o_path()
4810 static struct file *path_openat(struct nameidata *nd, in path_openat() argument
4821 error = do_tmpfile(nd, flags, op, file); in path_openat()
4823 error = do_o_path(nd, flags, file); in path_openat()
4825 const char *s = path_init(nd, flags); in path_openat()
4826 while (!(error = link_path_walk(s, nd)) && in path_openat()
4827 (s = open_last_lookups(nd, file, op)) != NULL) in path_openat()
4830 error = do_open(nd, file, op); in path_openat()
4831 terminate_walk(nd); in path_openat()
4852 struct nameidata nd; in do_file_open() local
4858 set_nameidata(&nd, dfd, pathname, NULL); in do_file_open()
4859 filp = path_openat(&nd, op, flags | LOOKUP_RCU); in do_file_open()
4861 filp = path_openat(&nd, op, flags); in do_file_open()
4863 filp = path_openat(&nd, op, flags | LOOKUP_REVAL); in do_file_open()
4871 struct nameidata nd; in do_file_open_root() local
4882 set_nameidata(&nd, -1, filename, root); in do_file_open_root()
4883 file = path_openat(&nd, op, flags | LOOKUP_RCU); in do_file_open_root()
4885 file = path_openat(&nd, op, flags); in do_file_open_root()
4887 file = path_openat(&nd, op, flags | LOOKUP_REVAL); in do_file_open_root()