Lines Matching +full:2 +full:nd
630 #define EMBEDDED_LEVELS 2
657 #define ND_ROOT_GRABBED 2
697 static bool nd_alloc_stack(struct nameidata *nd) in nd_alloc_stack() argument
702 nd->flags & LOOKUP_RCU ? GFP_ATOMIC : GFP_KERNEL); in nd_alloc_stack()
705 memcpy(p, nd->internal, sizeof(nd->internal)); in nd_alloc_stack()
706 nd->stack = p; in nd_alloc_stack()
729 static void drop_links(struct nameidata *nd) in drop_links() argument
731 int i = nd->depth; in drop_links()
733 struct saved *last = nd->stack + i; in drop_links()
739 static void leave_rcu(struct nameidata *nd) in leave_rcu() argument
741 nd->flags &= ~LOOKUP_RCU; in leave_rcu()
742 nd->seq = nd->next_seq = 0; in leave_rcu()
746 static void terminate_walk(struct nameidata *nd) in terminate_walk() argument
748 drop_links(nd); in terminate_walk()
749 if (!(nd->flags & LOOKUP_RCU)) { in terminate_walk()
751 path_put(&nd->path); in terminate_walk()
752 for (i = 0; i < nd->depth; i++) in terminate_walk()
753 path_put(&nd->stack[i].link); in terminate_walk()
754 if (nd->state & ND_ROOT_GRABBED) { in terminate_walk()
755 path_put(&nd->root); in terminate_walk()
756 nd->state &= ~ND_ROOT_GRABBED; in terminate_walk()
759 leave_rcu(nd); in terminate_walk()
761 nd->depth = 0; in terminate_walk()
762 nd->path.mnt = NULL; in terminate_walk()
763 nd->path.dentry = NULL; in terminate_walk()
783 static inline bool legitimize_path(struct nameidata *nd, in legitimize_path() argument
786 return __legitimize_path(path, seq, nd->m_seq); in legitimize_path()
789 static bool legitimize_links(struct nameidata *nd) in legitimize_links() argument
792 if (unlikely(nd->flags & LOOKUP_CACHED)) { in legitimize_links()
793 drop_links(nd); in legitimize_links()
794 nd->depth = 0; in legitimize_links()
797 for (i = 0; i < nd->depth; i++) { in legitimize_links()
798 struct saved *last = nd->stack + i; in legitimize_links()
799 if (unlikely(!legitimize_path(nd, &last->link, last->seq))) { in legitimize_links()
800 drop_links(nd); in legitimize_links()
801 nd->depth = i + 1; in legitimize_links()
808 static bool legitimize_root(struct nameidata *nd) in legitimize_root() argument
810 /* Nothing to do if nd->root is zero or is managed by the VFS user. */ in legitimize_root()
811 if (!nd->root.mnt || (nd->state & ND_ROOT_PRESET)) in legitimize_root()
813 nd->state |= ND_ROOT_GRABBED; in legitimize_root()
814 return legitimize_path(nd, &nd->root, nd->root_seq); in legitimize_root()
818 * Path walking has 2 modes, rcu-walk and ref-walk (see
830 * @nd: nameidata pathwalk data
833 * try_to_unlazy attempts to legitimize the current nd->path and nd->root
839 static bool try_to_unlazy(struct nameidata *nd) in try_to_unlazy() argument
841 struct dentry *parent = nd->path.dentry; in try_to_unlazy()
843 BUG_ON(!(nd->flags & LOOKUP_RCU)); in try_to_unlazy()
845 if (unlikely(!legitimize_links(nd))) in try_to_unlazy()
847 if (unlikely(!legitimize_path(nd, &nd->path, nd->seq))) in try_to_unlazy()
849 if (unlikely(!legitimize_root(nd))) in try_to_unlazy()
851 leave_rcu(nd); in try_to_unlazy()
852 BUG_ON(nd->inode != parent->d_inode); in try_to_unlazy()
856 nd->path.mnt = NULL; in try_to_unlazy()
857 nd->path.dentry = NULL; in try_to_unlazy()
859 leave_rcu(nd); in try_to_unlazy()
865 * @nd: nameidata pathwalk data
871 * nd->path and nd->root for ref-walk mode. Must be called from rcu-walk context.
875 static bool try_to_unlazy_next(struct nameidata *nd, struct dentry *dentry) in try_to_unlazy_next() argument
878 BUG_ON(!(nd->flags & LOOKUP_RCU)); in try_to_unlazy_next()
880 if (unlikely(!legitimize_links(nd))) in try_to_unlazy_next()
882 res = __legitimize_mnt(nd->path.mnt, nd->m_seq); in try_to_unlazy_next()
888 if (unlikely(!lockref_get_not_dead(&nd->path.dentry->d_lockref))) in try_to_unlazy_next()
900 if (read_seqcount_retry(&dentry->d_seq, nd->next_seq)) in try_to_unlazy_next()
906 if (unlikely(!legitimize_root(nd))) in try_to_unlazy_next()
908 leave_rcu(nd); in try_to_unlazy_next()
912 nd->path.mnt = NULL; in try_to_unlazy_next()
914 nd->path.dentry = NULL; in try_to_unlazy_next()
916 leave_rcu(nd); in try_to_unlazy_next()
919 leave_rcu(nd); in try_to_unlazy_next()
935 * @nd: pointer nameidata
937 * If we had been in RCU mode, drop out of it and legitimize nd->path.
941 * need to drop nd->path.
943 static int complete_walk(struct nameidata *nd) in complete_walk() argument
945 struct dentry *dentry = nd->path.dentry; in complete_walk()
948 if (nd->flags & LOOKUP_RCU) { in complete_walk()
950 * We don't want to zero nd->root for scoped-lookups or in complete_walk()
951 * externally-managed nd->root. in complete_walk()
953 if (!(nd->state & ND_ROOT_PRESET)) in complete_walk()
954 if (!(nd->flags & LOOKUP_IS_SCOPED)) in complete_walk()
955 nd->root.mnt = NULL; in complete_walk()
956 nd->flags &= ~LOOKUP_CACHED; in complete_walk()
957 if (!try_to_unlazy(nd)) in complete_walk()
961 if (unlikely(nd->flags & LOOKUP_IS_SCOPED)) { in complete_walk()
978 if (!path_is_under(&nd->path, &nd->root)) in complete_walk()
982 if (likely(!(nd->state & ND_JUMPED))) in complete_walk()
988 status = dentry->d_op->d_weak_revalidate(dentry, nd->flags); in complete_walk()
998 static int set_root(struct nameidata *nd) in set_root() argument
1007 if (WARN_ON(nd->flags & LOOKUP_IS_SCOPED)) in set_root()
1010 if (nd->flags & LOOKUP_RCU) { in set_root()
1015 nd->root = fs->root; in set_root()
1016 nd->root_seq = __read_seqcount_begin(&nd->root.dentry->d_seq); in set_root()
1019 get_fs_root(fs, &nd->root); in set_root()
1020 nd->state |= ND_ROOT_GRABBED; in set_root()
1025 static int nd_jump_root(struct nameidata *nd) in nd_jump_root() argument
1027 if (unlikely(nd->flags & LOOKUP_BENEATH)) in nd_jump_root()
1029 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) { in nd_jump_root()
1031 if (nd->path.mnt != NULL && nd->path.mnt != nd->root.mnt) in nd_jump_root()
1034 if (!nd->root.mnt) { in nd_jump_root()
1035 int error = set_root(nd); in nd_jump_root()
1039 if (nd->flags & LOOKUP_RCU) { in nd_jump_root()
1041 nd->path = nd->root; in nd_jump_root()
1042 d = nd->path.dentry; in nd_jump_root()
1043 nd->inode = d->d_inode; in nd_jump_root()
1044 nd->seq = nd->root_seq; in nd_jump_root()
1045 if (read_seqcount_retry(&d->d_seq, nd->seq)) in nd_jump_root()
1048 path_put(&nd->path); in nd_jump_root()
1049 nd->path = nd->root; in nd_jump_root()
1050 path_get(&nd->path); in nd_jump_root()
1051 nd->inode = nd->path.dentry->d_inode; in nd_jump_root()
1053 nd->state |= ND_JUMPED; in nd_jump_root()
1064 struct nameidata *nd = current->nameidata; in nd_jump_link() local
1066 if (unlikely(nd->flags & LOOKUP_NO_MAGICLINKS)) in nd_jump_link()
1070 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) { in nd_jump_link()
1071 if (nd->path.mnt != path->mnt) in nd_jump_link()
1075 if (unlikely(nd->flags & LOOKUP_IS_SCOPED)) in nd_jump_link()
1078 path_put(&nd->path); in nd_jump_link()
1079 nd->path = *path; in nd_jump_link()
1080 nd->inode = nd->path.dentry->d_inode; in nd_jump_link()
1081 nd->state |= ND_JUMPED; in nd_jump_link()
1089 static inline void put_link(struct nameidata *nd) in put_link() argument
1091 struct saved *last = nd->stack + --nd->depth; in put_link()
1093 if (!(nd->flags & LOOKUP_RCU)) in put_link()
1153 * @nd: nameidata pathwalk data
1167 static inline int may_follow_link(struct nameidata *nd, const struct inode *inode) in may_follow_link() argument
1175 idmap = mnt_idmap(nd->path.mnt); in may_follow_link()
1182 if ((nd->dir_mode & (S_ISVTX|S_IWOTH)) != (S_ISVTX|S_IWOTH)) in may_follow_link()
1186 if (vfsuid_valid(nd->dir_vfsuid) && vfsuid_eq(nd->dir_vfsuid, vfsuid)) in may_follow_link()
1189 if (nd->flags & LOOKUP_RCU) in may_follow_link()
1192 audit_inode(nd->name, nd->stack[0].link.dentry, 0); in may_follow_link()
1281 * @nd: nameidata pathwalk data
1291 * If the sysctl_protected_fifos (or sysctl_protected_regular) is set to 2
1303 static int may_create_in_sticky(struct mnt_idmap *idmap, struct nameidata *nd, in may_create_in_sticky() argument
1306 umode_t dir_mode = nd->dir_mode; in may_create_in_sticky()
1307 vfsuid_t dir_vfsuid = nd->dir_vfsuid, i_vfsuid; in may_create_in_sticky()
1332 if (sysctl_protected_fifos >= 2 && S_ISFIFO(inode->i_mode)) { in may_create_in_sticky()
1338 if (sysctl_protected_regular >= 2 && S_ISREG(inode->i_mode)) { in may_create_in_sticky()
1568 static bool __follow_mount_rcu(struct nameidata *nd, struct path *path) in __follow_mount_rcu() argument
1576 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) in __follow_mount_rcu()
1596 nd->state |= ND_JUMPED; in __follow_mount_rcu()
1597 nd->next_seq = read_seqcount_begin(&dentry->d_seq); in __follow_mount_rcu()
1601 if (read_seqretry(&mount_lock, nd->m_seq)) in __follow_mount_rcu()
1605 if (read_seqretry(&mount_lock, nd->m_seq)) in __follow_mount_rcu()
1612 static inline int handle_mounts(struct nameidata *nd, struct dentry *dentry, in handle_mounts() argument
1618 path->mnt = nd->path.mnt; in handle_mounts()
1620 if (nd->flags & LOOKUP_RCU) { in handle_mounts()
1621 unsigned int seq = nd->next_seq; in handle_mounts()
1622 if (likely(__follow_mount_rcu(nd, path))) in handle_mounts()
1624 // *path and nd->next_seq might've been clobbered in handle_mounts()
1625 path->mnt = nd->path.mnt; in handle_mounts()
1627 nd->next_seq = seq; in handle_mounts()
1628 if (!try_to_unlazy_next(nd, dentry)) in handle_mounts()
1631 ret = traverse_mounts(path, &jumped, &nd->total_link_count, nd->flags); in handle_mounts()
1633 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) in handle_mounts()
1636 nd->state |= ND_JUMPED; in handle_mounts()
1640 if (path->mnt != nd->path.mnt) in handle_mounts()
1704 * @nd: current nameidata
1716 static struct dentry *lookup_fast(struct nameidata *nd) in lookup_fast() argument
1718 struct dentry *dentry, *parent = nd->path.dentry; in lookup_fast()
1726 if (nd->flags & LOOKUP_RCU) { in lookup_fast()
1727 dentry = __d_lookup_rcu(parent, &nd->last, &nd->next_seq); in lookup_fast()
1729 if (!try_to_unlazy(nd)) in lookup_fast()
1738 if (read_seqcount_retry(&parent->d_seq, nd->seq)) in lookup_fast()
1741 status = d_revalidate(nd->inode, &nd->last, dentry, nd->flags); in lookup_fast()
1744 if (!try_to_unlazy_next(nd, dentry)) in lookup_fast()
1748 status = d_revalidate(nd->inode, &nd->last, in lookup_fast()
1749 dentry, nd->flags); in lookup_fast()
1751 dentry = __d_lookup(parent, &nd->last); in lookup_fast()
1754 status = d_revalidate(nd->inode, &nd->last, dentry, nd->flags); in lookup_fast()
1816 struct nameidata *restrict nd) in may_lookup() argument
1820 mask = nd->flags & LOOKUP_RCU ? MAY_NOT_BLOCK : 0; in may_lookup()
1821 err = inode_permission(idmap, nd->inode, mask | MAY_EXEC); in may_lookup()
1826 if (!(nd->flags & LOOKUP_RCU)) in may_lookup()
1830 if (!try_to_unlazy(nd)) in may_lookup()
1836 return inode_permission(idmap, nd->inode, MAY_EXEC); in may_lookup()
1839 static int reserve_stack(struct nameidata *nd, struct path *link) in reserve_stack() argument
1841 if (unlikely(nd->total_link_count++ >= MAXSYMLINKS)) in reserve_stack()
1844 if (likely(nd->depth != EMBEDDED_LEVELS)) in reserve_stack()
1846 if (likely(nd->stack != nd->internal)) in reserve_stack()
1848 if (likely(nd_alloc_stack(nd))) in reserve_stack()
1851 if (nd->flags & LOOKUP_RCU) { in reserve_stack()
1854 bool grabbed_link = legitimize_path(nd, link, nd->next_seq); in reserve_stack()
1856 if (!try_to_unlazy(nd) || !grabbed_link) in reserve_stack()
1859 if (nd_alloc_stack(nd)) in reserve_stack()
1865 enum {WALK_TRAILING = 1, WALK_MORE = 2, WALK_NOFOLLOW = 4};
1867 static const char *pick_link(struct nameidata *nd, struct path *link, in pick_link() argument
1872 int error = reserve_stack(nd, link); in pick_link()
1875 if (!(nd->flags & LOOKUP_RCU)) in pick_link()
1879 last = nd->stack + nd->depth++; in pick_link()
1882 last->seq = nd->next_seq; in pick_link()
1885 error = may_follow_link(nd, inode); in pick_link()
1890 if (unlikely(nd->flags & LOOKUP_NO_SYMLINKS) || in pick_link()
1894 if (!(nd->flags & LOOKUP_RCU)) { in pick_link()
1898 if (!try_to_unlazy(nd)) in pick_link()
1904 nd->flags & LOOKUP_RCU); in pick_link()
1913 if (nd->flags & LOOKUP_RCU) { in pick_link()
1915 if (res == ERR_PTR(-ECHILD) && try_to_unlazy(nd)) in pick_link()
1926 error = nd_jump_root(nd); in pick_link()
1935 put_link(nd); in pick_link()
1945 * NOTE: dentry must be what nd->next_seq had been sampled from.
1947 static const char *step_into(struct nameidata *nd, int flags, in step_into() argument
1952 int err = handle_mounts(nd, dentry, &path); in step_into()
1958 ((flags & WALK_TRAILING) && !(nd->flags & LOOKUP_FOLLOW)) || in step_into()
1961 if (nd->flags & LOOKUP_RCU) { in step_into()
1962 if (read_seqcount_retry(&path.dentry->d_seq, nd->next_seq)) in step_into()
1967 dput(nd->path.dentry); in step_into()
1968 if (nd->path.mnt != path.mnt) in step_into()
1969 mntput(nd->path.mnt); in step_into()
1971 nd->path = path; in step_into()
1972 nd->inode = inode; in step_into()
1973 nd->seq = nd->next_seq; in step_into()
1976 if (nd->flags & LOOKUP_RCU) { in step_into()
1978 if (read_seqcount_retry(&path.dentry->d_seq, nd->next_seq)) in step_into()
1981 if (path.mnt == nd->path.mnt) in step_into()
1984 return pick_link(nd, &path, inode, flags); in step_into()
1987 static struct dentry *follow_dotdot_rcu(struct nameidata *nd) in follow_dotdot_rcu() argument
1991 if (path_equal(&nd->path, &nd->root)) in follow_dotdot_rcu()
1993 if (unlikely(nd->path.dentry == nd->path.mnt->mnt_root)) { in follow_dotdot_rcu()
1996 if (!choose_mountpoint_rcu(real_mount(nd->path.mnt), in follow_dotdot_rcu()
1997 &nd->root, &path, &seq)) in follow_dotdot_rcu()
1999 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) in follow_dotdot_rcu()
2001 nd->path = path; in follow_dotdot_rcu()
2002 nd->inode = path.dentry->d_inode; in follow_dotdot_rcu()
2003 nd->seq = seq; in follow_dotdot_rcu()
2005 if (read_seqretry(&mount_lock, nd->m_seq)) in follow_dotdot_rcu()
2009 old = nd->path.dentry; in follow_dotdot_rcu()
2011 nd->next_seq = read_seqcount_begin(&parent->d_seq); in follow_dotdot_rcu()
2013 if (read_seqcount_retry(&old->d_seq, nd->seq)) in follow_dotdot_rcu()
2015 if (unlikely(!path_connected(nd->path.mnt, parent))) in follow_dotdot_rcu()
2019 if (read_seqretry(&mount_lock, nd->m_seq)) in follow_dotdot_rcu()
2021 if (unlikely(nd->flags & LOOKUP_BENEATH)) in follow_dotdot_rcu()
2023 nd->next_seq = nd->seq; in follow_dotdot_rcu()
2024 return nd->path.dentry; in follow_dotdot_rcu()
2027 static struct dentry *follow_dotdot(struct nameidata *nd) in follow_dotdot() argument
2031 if (path_equal(&nd->path, &nd->root)) in follow_dotdot()
2033 if (unlikely(nd->path.dentry == nd->path.mnt->mnt_root)) { in follow_dotdot()
2036 if (!choose_mountpoint(real_mount(nd->path.mnt), in follow_dotdot()
2037 &nd->root, &path)) in follow_dotdot()
2039 path_put(&nd->path); in follow_dotdot()
2040 nd->path = path; in follow_dotdot()
2041 nd->inode = path.dentry->d_inode; in follow_dotdot()
2042 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) in follow_dotdot()
2046 parent = dget_parent(nd->path.dentry); in follow_dotdot()
2047 if (unlikely(!path_connected(nd->path.mnt, parent))) { in follow_dotdot()
2054 if (unlikely(nd->flags & LOOKUP_BENEATH)) in follow_dotdot()
2056 return dget(nd->path.dentry); in follow_dotdot()
2059 static const char *handle_dots(struct nameidata *nd, int type) in handle_dots() argument
2065 if (!nd->root.mnt) { in handle_dots()
2066 error = ERR_PTR(set_root(nd)); in handle_dots()
2070 if (nd->flags & LOOKUP_RCU) in handle_dots()
2071 parent = follow_dotdot_rcu(nd); in handle_dots()
2073 parent = follow_dotdot(nd); in handle_dots()
2076 error = step_into(nd, WALK_NOFOLLOW, parent); in handle_dots()
2080 if (unlikely(nd->flags & LOOKUP_IS_SCOPED)) { in handle_dots()
2084 * above nd->root (and so userspace should retry or use in handle_dots()
2088 if (__read_seqcount_retry(&mount_lock.seqcount, nd->m_seq)) in handle_dots()
2090 if (__read_seqcount_retry(&rename_lock.seqcount, nd->r_seq)) in handle_dots()
2097 static const char *walk_component(struct nameidata *nd, int flags) in walk_component() argument
2105 if (unlikely(nd->last_type != LAST_NORM)) { in walk_component()
2106 if (!(flags & WALK_MORE) && nd->depth) in walk_component()
2107 put_link(nd); in walk_component()
2108 return handle_dots(nd, nd->last_type); in walk_component()
2110 dentry = lookup_fast(nd); in walk_component()
2114 dentry = lookup_slow(&nd->last, nd->path.dentry, nd->flags); in walk_component()
2118 if (!(flags & WALK_MORE) && nd->depth) in walk_component()
2119 put_link(nd); in walk_component()
2120 return step_into(nd, flags, dentry); in walk_component()
2158 * influence out to 2^6 = 64 state bits.
2161 * deltas or 64*63/2 = 2016 two-bit input deltas, and finding the
2170 * Input delta: 1-bit 2-bit
2172 * 2 rounds: 2753.7 140389.8
2176 * (64*128) (64*63/2 * 128)
2200 * Input delta: 1-bit 2-bit
2202 * 2 rounds: 1246.4 25475.4
2206 * (32*64) (32*31/2 * 64)
2278 static inline const char *hash_name(struct nameidata *nd, in hash_name() argument
2282 unsigned long a, b, x, y = (unsigned long)nd->path.dentry; in hash_name()
2299 nd->last.hash = fold_hash(a, y); in hash_name()
2300 nd->last.len = len; in hash_name()
2321 nd->last.hash = fold_hash(x, y); in hash_name()
2322 nd->last.len = len; in hash_name()
2367 static inline const char *hash_name(struct nameidata *nd, const char *name, unsigned long *lastword) in hash_name() argument
2369 unsigned long hash = init_name_hash(nd->path.dentry); in hash_name()
2384 nd->last.hash = end_name_hash(hash); in hash_name()
2385 nd->last.len = len; in hash_name()
2401 * Returns 0 and nd will have valid dentry and mnt on success.
2404 static int link_path_walk(const char *name, struct nameidata *nd) in link_path_walk() argument
2406 int depth = 0; // depth <= nd->depth in link_path_walk()
2409 nd->last_type = LAST_ROOT; in link_path_walk()
2410 nd->flags |= LOOKUP_PARENT; in link_path_walk()
2416 nd->dir_mode = 0; // short-circuit the 'hardening' idiocy in link_path_walk()
2426 idmap = mnt_idmap(nd->path.mnt); in link_path_walk()
2427 err = may_lookup(idmap, nd); in link_path_walk()
2431 nd->last.name = name; in link_path_walk()
2432 name = hash_name(nd, name, &lastword); in link_path_walk()
2436 nd->last_type = LAST_DOTDOT; in link_path_walk()
2437 nd->state |= ND_JUMPED; in link_path_walk()
2441 nd->last_type = LAST_DOT; in link_path_walk()
2445 nd->last_type = LAST_NORM; in link_path_walk()
2446 nd->state &= ~ND_JUMPED; in link_path_walk()
2448 struct dentry *parent = nd->path.dentry; in link_path_walk()
2450 err = parent->d_op->d_hash(parent, &nd->last); in link_path_walk()
2469 nd->dir_vfsuid = i_uid_into_vfsuid(idmap, nd->inode); in link_path_walk()
2470 nd->dir_mode = nd->inode->i_mode; in link_path_walk()
2471 nd->flags &= ~LOOKUP_PARENT; in link_path_walk()
2475 name = nd->stack[--depth].name; in link_path_walk()
2476 link = walk_component(nd, 0); in link_path_walk()
2479 link = walk_component(nd, WALK_MORE); in link_path_walk()
2485 nd->stack[depth++].name = name; in link_path_walk()
2489 if (unlikely(!d_can_lookup(nd->path.dentry))) { in link_path_walk()
2490 if (nd->flags & LOOKUP_RCU) { in link_path_walk()
2491 if (!try_to_unlazy(nd)) in link_path_walk()
2500 static const char *path_init(struct nameidata *nd, unsigned flags) in path_init() argument
2503 const char *s = nd->pathname; in path_init()
2514 nd->seq = nd->next_seq = 0; in path_init()
2516 nd->flags = flags; in path_init()
2517 nd->state |= ND_JUMPED; in path_init()
2519 nd->m_seq = __read_seqcount_begin(&mount_lock.seqcount); in path_init()
2520 nd->r_seq = __read_seqcount_begin(&rename_lock.seqcount); in path_init()
2523 if (nd->state & ND_ROOT_PRESET) { in path_init()
2524 struct dentry *root = nd->root.dentry; in path_init()
2528 nd->path = nd->root; in path_init()
2529 nd->inode = inode; in path_init()
2531 nd->seq = read_seqcount_begin(&nd->path.dentry->d_seq); in path_init()
2532 nd->root_seq = nd->seq; in path_init()
2534 path_get(&nd->path); in path_init()
2539 nd->root.mnt = NULL; in path_init()
2541 /* Absolute pathname -- fetch the root (LOOKUP_IN_ROOT uses nd->dfd). */ in path_init()
2543 error = nd_jump_root(nd); in path_init()
2550 if (nd->dfd == AT_FDCWD) { in path_init()
2557 nd->path = fs->pwd; in path_init()
2558 nd->inode = nd->path.dentry->d_inode; in path_init()
2559 nd->seq = __read_seqcount_begin(&nd->path.dentry->d_seq); in path_init()
2562 get_fs_pwd(current->fs, &nd->path); in path_init()
2563 nd->inode = nd->path.dentry->d_inode; in path_init()
2567 CLASS(fd_raw, f)(nd->dfd); in path_init()
2584 nd->path = fd_file(f)->f_path; in path_init()
2586 nd->inode = nd->path.dentry->d_inode; in path_init()
2587 nd->seq = read_seqcount_begin(&nd->path.dentry->d_seq); in path_init()
2589 path_get(&nd->path); in path_init()
2590 nd->inode = nd->path.dentry->d_inode; in path_init()
2596 nd->root = nd->path; in path_init()
2598 nd->root_seq = nd->seq; in path_init()
2600 path_get(&nd->root); in path_init()
2601 nd->state |= ND_ROOT_GRABBED; in path_init()
2607 static inline const char *lookup_last(struct nameidata *nd) in lookup_last() argument
2609 if (nd->last_type == LAST_NORM && nd->last.name[nd->last.len]) in lookup_last()
2610 nd->flags |= LOOKUP_FOLLOW | LOOKUP_DIRECTORY; in lookup_last()
2612 return walk_component(nd, WALK_TRAILING); in lookup_last()
2615 static int handle_lookup_down(struct nameidata *nd) in handle_lookup_down() argument
2617 if (!(nd->flags & LOOKUP_RCU)) in handle_lookup_down()
2618 dget(nd->path.dentry); in handle_lookup_down()
2619 nd->next_seq = nd->seq; in handle_lookup_down()
2620 return PTR_ERR(step_into(nd, WALK_NOFOLLOW, nd->path.dentry)); in handle_lookup_down()
2623 /* Returns 0 and nd will be valid on success; Returns error, otherwise. */
2624 static int path_lookupat(struct nameidata *nd, unsigned flags, struct path *path) in path_lookupat() argument
2626 const char *s = path_init(nd, flags); in path_lookupat()
2630 err = handle_lookup_down(nd); in path_lookupat()
2635 while (!(err = link_path_walk(s, nd)) && in path_lookupat()
2636 (s = lookup_last(nd)) != NULL) in path_lookupat()
2638 if (!err && unlikely(nd->flags & LOOKUP_MOUNTPOINT)) { in path_lookupat()
2639 err = handle_lookup_down(nd); in path_lookupat()
2640 nd->state &= ~ND_JUMPED; // no d_weak_revalidate(), please... in path_lookupat()
2643 err = complete_walk(nd); in path_lookupat()
2645 if (!err && nd->flags & LOOKUP_DIRECTORY) in path_lookupat()
2646 if (!d_can_lookup(nd->path.dentry)) in path_lookupat()
2649 *path = nd->path; in path_lookupat()
2650 nd->path.mnt = NULL; in path_lookupat()
2651 nd->path.dentry = NULL; in path_lookupat()
2653 terminate_walk(nd); in path_lookupat()
2661 struct nameidata nd; in filename_lookup() local
2664 set_nameidata(&nd, dfd, name, root); in filename_lookup()
2665 retval = path_lookupat(&nd, flags | LOOKUP_RCU, path); in filename_lookup()
2667 retval = path_lookupat(&nd, flags, path); in filename_lookup()
2669 retval = path_lookupat(&nd, flags | LOOKUP_REVAL, path); in filename_lookup()
2678 /* Returns 0 and nd will be valid on success; Returns error, otherwise. */
2679 static int path_parentat(struct nameidata *nd, unsigned flags, in path_parentat() argument
2682 const char *s = path_init(nd, flags); in path_parentat()
2683 int err = link_path_walk(s, nd); in path_parentat()
2685 err = complete_walk(nd); in path_parentat()
2687 *parent = nd->path; in path_parentat()
2688 nd->path.mnt = NULL; in path_parentat()
2689 nd->path.dentry = NULL; in path_parentat()
2691 terminate_walk(nd); in path_parentat()
2702 struct nameidata nd; in __filename_parentat() local
2706 set_nameidata(&nd, dfd, name, root); in __filename_parentat()
2707 retval = path_parentat(&nd, flags | LOOKUP_RCU, parent); in __filename_parentat()
2709 retval = path_parentat(&nd, flags, parent); in __filename_parentat()
2711 retval = path_parentat(&nd, flags | LOOKUP_REVAL, parent); in __filename_parentat()
2713 *last = nd.last; in __filename_parentat()
2714 *type = nd.last_type; in __filename_parentat()
3096 * 2. We should have write and exec permissions on dir
3159 * 2. We can't do it if dir is read-only (done in permission())
3498 static struct dentry *atomic_open(struct nameidata *nd, struct dentry *dentry, in atomic_open() argument
3503 struct inode *dir = nd->path.dentry->d_inode; in atomic_open()
3506 if (nd->flags & LOOKUP_DIRECTORY) in atomic_open()
3510 file->f_path.mnt = nd->path.mnt; in atomic_open()
3553 static struct dentry *lookup_open(struct nameidata *nd, struct file *file, in lookup_open() argument
3558 struct dentry *dir = nd->path.dentry; in lookup_open()
3570 dentry = d_lookup(dir, &nd->last); in lookup_open()
3573 dentry = d_alloc_parallel(dir, &nd->last, &wq); in lookup_open()
3580 error = d_revalidate(dir_inode, &nd->last, dentry, nd->flags); in lookup_open()
3595 audit_inode(nd->name, dir, AUDIT_INODE_PARENT); in lookup_open()
3608 idmap = mnt_idmap(nd->path.mnt); in lookup_open()
3614 create_error = may_o_create(idmap, &nd->path, in lookup_open()
3622 dentry = atomic_open(nd, dentry, file, open_flag, mode); in lookup_open()
3630 nd->flags); in lookup_open()
3667 static inline bool trailing_slashes(struct nameidata *nd) in trailing_slashes() argument
3669 return (bool)nd->last.name[nd->last.len]; in trailing_slashes()
3672 static struct dentry *lookup_fast_for_open(struct nameidata *nd, int open_flag) in lookup_fast_for_open() argument
3677 if (trailing_slashes(nd)) in lookup_fast_for_open()
3685 if (trailing_slashes(nd)) in lookup_fast_for_open()
3686 nd->flags |= LOOKUP_FOLLOW | LOOKUP_DIRECTORY; in lookup_fast_for_open()
3688 dentry = lookup_fast(nd); in lookup_fast_for_open()
3695 if (!(nd->flags & LOOKUP_RCU)) in lookup_fast_for_open()
3703 static const char *open_last_lookups(struct nameidata *nd, in open_last_lookups() argument
3706 struct dentry *dir = nd->path.dentry; in open_last_lookups()
3712 nd->flags |= op->intent; in open_last_lookups()
3714 if (nd->last_type != LAST_NORM) { in open_last_lookups()
3715 if (nd->depth) in open_last_lookups()
3716 put_link(nd); in open_last_lookups()
3717 return handle_dots(nd, nd->last_type); in open_last_lookups()
3721 dentry = lookup_fast_for_open(nd, open_flag); in open_last_lookups()
3729 if (WARN_ON_ONCE(nd->flags & LOOKUP_RCU)) in open_last_lookups()
3732 if (nd->flags & LOOKUP_RCU) { in open_last_lookups()
3733 if (!try_to_unlazy(nd)) in open_last_lookups()
3739 got_write = !mnt_want_write(nd->path.mnt); in open_last_lookups()
3750 dentry = lookup_open(nd, file, op, got_write); in open_last_lookups()
3763 mnt_drop_write(nd->path.mnt); in open_last_lookups()
3769 dput(nd->path.dentry); in open_last_lookups()
3770 nd->path.dentry = dentry; in open_last_lookups()
3775 if (nd->depth) in open_last_lookups()
3776 put_link(nd); in open_last_lookups()
3777 res = step_into(nd, WALK_TRAILING, dentry); in open_last_lookups()
3779 nd->flags &= ~(LOOKUP_OPEN|LOOKUP_CREATE|LOOKUP_EXCL); in open_last_lookups()
3786 static int do_open(struct nameidata *nd, in do_open() argument
3796 error = complete_walk(nd); in do_open()
3801 audit_inode(nd->name, nd->path.dentry, 0); in do_open()
3802 idmap = mnt_idmap(nd->path.mnt); in do_open()
3806 if (d_is_dir(nd->path.dentry)) in do_open()
3808 error = may_create_in_sticky(idmap, nd, in do_open()
3809 d_backing_inode(nd->path.dentry)); in do_open()
3813 if ((nd->flags & LOOKUP_DIRECTORY) && !d_can_lookup(nd->path.dentry)) in do_open()
3822 } else if (d_is_reg(nd->path.dentry) && open_flag & O_TRUNC) { in do_open()
3823 error = mnt_want_write(nd->path.mnt); in do_open()
3828 error = may_open(idmap, &nd->path, acc_mode, open_flag); in do_open()
3830 error = vfs_open(&nd->path, file); in do_open()
3840 mnt_drop_write(nd->path.mnt); in do_open()
3934 static int do_tmpfile(struct nameidata *nd, unsigned flags, in do_tmpfile() argument
3939 int error = path_lookupat(nd, flags | LOOKUP_DIRECTORY, &path); in do_tmpfile()
3949 audit_inode(nd->name, file->f_path.dentry, 0); in do_tmpfile()
3957 static int do_o_path(struct nameidata *nd, unsigned flags, struct file *file) in do_o_path() argument
3960 int error = path_lookupat(nd, flags, &path); in do_o_path()
3962 audit_inode(nd->name, path.dentry, 0); in do_o_path()
3969 static struct file *path_openat(struct nameidata *nd, in path_openat() argument
3980 error = do_tmpfile(nd, flags, op, file); in path_openat()
3982 error = do_o_path(nd, flags, file); in path_openat()
3984 const char *s = path_init(nd, flags); in path_openat()
3985 while (!(error = link_path_walk(s, nd)) && in path_openat()
3986 (s = open_last_lookups(nd, file, op)) != NULL) in path_openat()
3989 error = do_open(nd, file, op); in path_openat()
3990 terminate_walk(nd); in path_openat()
4011 struct nameidata nd; in do_filp_open() local
4015 set_nameidata(&nd, dfd, pathname, NULL); in do_filp_open()
4016 filp = path_openat(&nd, op, flags | LOOKUP_RCU); in do_filp_open()
4018 filp = path_openat(&nd, op, flags); in do_filp_open()
4020 filp = path_openat(&nd, op, flags | LOOKUP_REVAL); in do_filp_open()
4028 struct nameidata nd; in do_file_open_root() local
4040 set_nameidata(&nd, -1, filename, root); in do_file_open_root()
4041 file = path_openat(&nd, op, flags | LOOKUP_RCU); in do_file_open_root()
4043 file = path_openat(&nd, op, flags); in do_file_open_root()
4045 file = path_openat(&nd, op, flags | LOOKUP_REVAL); in do_file_open_root()
4941 * we'd better make sure that there's no link(2) for them.