Lines Matching refs:nd

627 static bool nd_alloc_stack(struct nameidata *nd)  in nd_alloc_stack()  argument
632 nd->flags & LOOKUP_RCU ? GFP_ATOMIC : GFP_KERNEL); in nd_alloc_stack()
635 memcpy(p, nd->internal, sizeof(nd->internal)); in nd_alloc_stack()
636 nd->stack = p; in nd_alloc_stack()
657 static void drop_links(struct nameidata *nd) in drop_links() argument
659 int i = nd->depth; in drop_links()
661 struct saved *last = nd->stack + i; in drop_links()
667 static void terminate_walk(struct nameidata *nd) in terminate_walk() argument
669 drop_links(nd); in terminate_walk()
670 if (!(nd->flags & LOOKUP_RCU)) { in terminate_walk()
672 path_put(&nd->path); in terminate_walk()
673 for (i = 0; i < nd->depth; i++) in terminate_walk()
674 path_put(&nd->stack[i].link); in terminate_walk()
675 if (nd->state & ND_ROOT_GRABBED) { in terminate_walk()
676 path_put(&nd->root); in terminate_walk()
677 nd->state &= ~ND_ROOT_GRABBED; in terminate_walk()
680 nd->flags &= ~LOOKUP_RCU; in terminate_walk()
683 nd->depth = 0; in terminate_walk()
684 nd->path.mnt = NULL; in terminate_walk()
685 nd->path.dentry = NULL; in terminate_walk()
705 static inline bool legitimize_path(struct nameidata *nd, in legitimize_path() argument
708 return __legitimize_path(path, seq, nd->m_seq); in legitimize_path()
711 static bool legitimize_links(struct nameidata *nd) in legitimize_links() argument
714 if (unlikely(nd->flags & LOOKUP_CACHED)) { in legitimize_links()
715 drop_links(nd); in legitimize_links()
716 nd->depth = 0; in legitimize_links()
719 for (i = 0; i < nd->depth; i++) { in legitimize_links()
720 struct saved *last = nd->stack + i; in legitimize_links()
721 if (unlikely(!legitimize_path(nd, &last->link, last->seq))) { in legitimize_links()
722 drop_links(nd); in legitimize_links()
723 nd->depth = i + 1; in legitimize_links()
730 static bool legitimize_root(struct nameidata *nd) in legitimize_root() argument
737 if (!nd->root.mnt && (nd->flags & LOOKUP_IS_SCOPED)) in legitimize_root()
740 if (!nd->root.mnt || (nd->state & ND_ROOT_PRESET)) in legitimize_root()
742 nd->state |= ND_ROOT_GRABBED; in legitimize_root()
743 return legitimize_path(nd, &nd->root, nd->root_seq); in legitimize_root()
768 static bool try_to_unlazy(struct nameidata *nd) in try_to_unlazy() argument
770 struct dentry *parent = nd->path.dentry; in try_to_unlazy()
772 BUG_ON(!(nd->flags & LOOKUP_RCU)); in try_to_unlazy()
774 nd->flags &= ~LOOKUP_RCU; in try_to_unlazy()
775 if (unlikely(!legitimize_links(nd))) in try_to_unlazy()
777 if (unlikely(!legitimize_path(nd, &nd->path, nd->seq))) in try_to_unlazy()
779 if (unlikely(!legitimize_root(nd))) in try_to_unlazy()
782 BUG_ON(nd->inode != parent->d_inode); in try_to_unlazy()
786 nd->path.mnt = NULL; in try_to_unlazy()
787 nd->path.dentry = NULL; in try_to_unlazy()
806 static bool try_to_unlazy_next(struct nameidata *nd, struct dentry *dentry, unsigned seq) in try_to_unlazy_next() argument
808 BUG_ON(!(nd->flags & LOOKUP_RCU)); in try_to_unlazy_next()
810 nd->flags &= ~LOOKUP_RCU; in try_to_unlazy_next()
811 if (unlikely(!legitimize_links(nd))) in try_to_unlazy_next()
813 if (unlikely(!legitimize_mnt(nd->path.mnt, nd->m_seq))) in try_to_unlazy_next()
815 if (unlikely(!lockref_get_not_dead(&nd->path.dentry->d_lockref))) in try_to_unlazy_next()
833 if (unlikely(!legitimize_root(nd))) in try_to_unlazy_next()
839 nd->path.mnt = NULL; in try_to_unlazy_next()
841 nd->path.dentry = NULL; in try_to_unlazy_next()
869 static int complete_walk(struct nameidata *nd) in complete_walk() argument
871 struct dentry *dentry = nd->path.dentry; in complete_walk()
874 if (nd->flags & LOOKUP_RCU) { in complete_walk()
879 if (!(nd->state & ND_ROOT_PRESET)) in complete_walk()
880 if (!(nd->flags & LOOKUP_IS_SCOPED)) in complete_walk()
881 nd->root.mnt = NULL; in complete_walk()
882 nd->flags &= ~LOOKUP_CACHED; in complete_walk()
883 if (!try_to_unlazy(nd)) in complete_walk()
887 if (unlikely(nd->flags & LOOKUP_IS_SCOPED)) { in complete_walk()
904 if (!path_is_under(&nd->path, &nd->root)) in complete_walk()
908 if (likely(!(nd->state & ND_JUMPED))) in complete_walk()
914 status = dentry->d_op->d_weak_revalidate(dentry, nd->flags); in complete_walk()
924 static int set_root(struct nameidata *nd) in set_root() argument
933 if (WARN_ON(nd->flags & LOOKUP_IS_SCOPED)) in set_root()
936 if (nd->flags & LOOKUP_RCU) { in set_root()
941 nd->root = fs->root; in set_root()
942 nd->root_seq = __read_seqcount_begin(&nd->root.dentry->d_seq); in set_root()
945 get_fs_root(fs, &nd->root); in set_root()
946 nd->state |= ND_ROOT_GRABBED; in set_root()
951 static int nd_jump_root(struct nameidata *nd) in nd_jump_root() argument
953 if (unlikely(nd->flags & LOOKUP_BENEATH)) in nd_jump_root()
955 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) { in nd_jump_root()
957 if (nd->path.mnt != NULL && nd->path.mnt != nd->root.mnt) in nd_jump_root()
960 if (!nd->root.mnt) { in nd_jump_root()
961 int error = set_root(nd); in nd_jump_root()
965 if (nd->flags & LOOKUP_RCU) { in nd_jump_root()
967 nd->path = nd->root; in nd_jump_root()
968 d = nd->path.dentry; in nd_jump_root()
969 nd->inode = d->d_inode; in nd_jump_root()
970 nd->seq = nd->root_seq; in nd_jump_root()
971 if (unlikely(read_seqcount_retry(&d->d_seq, nd->seq))) in nd_jump_root()
974 path_put(&nd->path); in nd_jump_root()
975 nd->path = nd->root; in nd_jump_root()
976 path_get(&nd->path); in nd_jump_root()
977 nd->inode = nd->path.dentry->d_inode; in nd_jump_root()
979 nd->state |= ND_JUMPED; in nd_jump_root()
990 struct nameidata *nd = current->nameidata; in nd_jump_link() local
992 if (unlikely(nd->flags & LOOKUP_NO_MAGICLINKS)) in nd_jump_link()
996 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) { in nd_jump_link()
997 if (nd->path.mnt != path->mnt) in nd_jump_link()
1001 if (unlikely(nd->flags & LOOKUP_IS_SCOPED)) in nd_jump_link()
1004 path_put(&nd->path); in nd_jump_link()
1005 nd->path = *path; in nd_jump_link()
1006 nd->inode = nd->path.dentry->d_inode; in nd_jump_link()
1007 nd->state |= ND_JUMPED; in nd_jump_link()
1015 static inline void put_link(struct nameidata *nd) in put_link() argument
1017 struct saved *last = nd->stack + --nd->depth; in put_link()
1019 if (!(nd->flags & LOOKUP_RCU)) in put_link()
1043 static inline int may_follow_link(struct nameidata *nd, const struct inode *inode) in may_follow_link() argument
1051 mnt_userns = mnt_user_ns(nd->path.mnt); in may_follow_link()
1058 if ((nd->dir_mode & (S_ISVTX|S_IWOTH)) != (S_ISVTX|S_IWOTH)) in may_follow_link()
1062 if (uid_valid(nd->dir_uid) && uid_eq(nd->dir_uid, i_uid)) in may_follow_link()
1065 if (nd->flags & LOOKUP_RCU) in may_follow_link()
1068 audit_inode(nd->name, nd->stack[0].link.dentry, 0); in may_follow_link()
1180 struct nameidata *nd, struct inode *const inode) in may_create_in_sticky() argument
1182 umode_t dir_mode = nd->dir_mode; in may_create_in_sticky()
1183 kuid_t dir_uid = nd->dir_uid; in may_create_in_sticky()
1425 static bool __follow_mount_rcu(struct nameidata *nd, struct path *path, in __follow_mount_rcu() argument
1434 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) in __follow_mount_rcu()
1454 nd->state |= ND_JUMPED; in __follow_mount_rcu()
1466 if (read_seqretry(&mount_lock, nd->m_seq)) in __follow_mount_rcu()
1473 static inline int handle_mounts(struct nameidata *nd, struct dentry *dentry, in handle_mounts() argument
1480 path->mnt = nd->path.mnt; in handle_mounts()
1482 if (nd->flags & LOOKUP_RCU) { in handle_mounts()
1486 if (likely(__follow_mount_rcu(nd, path, inode, seqp))) in handle_mounts()
1488 if (!try_to_unlazy_next(nd, dentry, seq)) in handle_mounts()
1491 path->mnt = nd->path.mnt; in handle_mounts()
1494 ret = traverse_mounts(path, &jumped, &nd->total_link_count, nd->flags); in handle_mounts()
1496 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) in handle_mounts()
1499 nd->state |= ND_JUMPED; in handle_mounts()
1503 if (path->mnt != nd->path.mnt) in handle_mounts()
1566 static struct dentry *lookup_fast(struct nameidata *nd, in lookup_fast() argument
1570 struct dentry *dentry, *parent = nd->path.dentry; in lookup_fast()
1578 if (nd->flags & LOOKUP_RCU) { in lookup_fast()
1580 dentry = __d_lookup_rcu(parent, &nd->last, &seq); in lookup_fast()
1582 if (!try_to_unlazy(nd)) in lookup_fast()
1602 if (unlikely(__read_seqcount_retry(&parent->d_seq, nd->seq))) in lookup_fast()
1606 status = d_revalidate(dentry, nd->flags); in lookup_fast()
1609 if (!try_to_unlazy_next(nd, dentry, seq)) in lookup_fast()
1613 status = d_revalidate(dentry, nd->flags); in lookup_fast()
1615 dentry = __d_lookup(parent, &nd->last); in lookup_fast()
1618 status = d_revalidate(dentry, nd->flags); in lookup_fast()
1680 struct nameidata *nd) in may_lookup() argument
1682 if (nd->flags & LOOKUP_RCU) { in may_lookup()
1683 int err = inode_permission(mnt_userns, nd->inode, MAY_EXEC|MAY_NOT_BLOCK); in may_lookup()
1684 if (err != -ECHILD || !try_to_unlazy(nd)) in may_lookup()
1687 return inode_permission(mnt_userns, nd->inode, MAY_EXEC); in may_lookup()
1690 static int reserve_stack(struct nameidata *nd, struct path *link, unsigned seq) in reserve_stack() argument
1692 if (unlikely(nd->total_link_count++ >= MAXSYMLINKS)) in reserve_stack()
1695 if (likely(nd->depth != EMBEDDED_LEVELS)) in reserve_stack()
1697 if (likely(nd->stack != nd->internal)) in reserve_stack()
1699 if (likely(nd_alloc_stack(nd))) in reserve_stack()
1702 if (nd->flags & LOOKUP_RCU) { in reserve_stack()
1705 bool grabbed_link = legitimize_path(nd, link, seq); in reserve_stack()
1707 if (!try_to_unlazy(nd) != 0 || !grabbed_link) in reserve_stack()
1710 if (nd_alloc_stack(nd)) in reserve_stack()
1718 static const char *pick_link(struct nameidata *nd, struct path *link, in pick_link() argument
1723 int error = reserve_stack(nd, link, seq); in pick_link()
1726 if (!(nd->flags & LOOKUP_RCU)) in pick_link()
1730 last = nd->stack + nd->depth++; in pick_link()
1736 error = may_follow_link(nd, inode); in pick_link()
1741 if (unlikely(nd->flags & LOOKUP_NO_SYMLINKS) || in pick_link()
1745 if (!(nd->flags & LOOKUP_RCU)) { in pick_link()
1749 if (!try_to_unlazy(nd)) in pick_link()
1755 nd->flags & LOOKUP_RCU); in pick_link()
1764 if (nd->flags & LOOKUP_RCU) { in pick_link()
1766 if (res == ERR_PTR(-ECHILD) && try_to_unlazy(nd)) in pick_link()
1777 error = nd_jump_root(nd); in pick_link()
1786 put_link(nd); in pick_link()
1796 static const char *step_into(struct nameidata *nd, int flags, in step_into() argument
1800 int err = handle_mounts(nd, dentry, &path, &inode, &seq); in step_into()
1805 ((flags & WALK_TRAILING) && !(nd->flags & LOOKUP_FOLLOW)) || in step_into()
1808 if (!(nd->flags & LOOKUP_RCU)) { in step_into()
1809 dput(nd->path.dentry); in step_into()
1810 if (nd->path.mnt != path.mnt) in step_into()
1811 mntput(nd->path.mnt); in step_into()
1813 nd->path = path; in step_into()
1814 nd->inode = inode; in step_into()
1815 nd->seq = seq; in step_into()
1818 if (nd->flags & LOOKUP_RCU) { in step_into()
1823 if (path.mnt == nd->path.mnt) in step_into()
1826 return pick_link(nd, &path, inode, seq, flags); in step_into()
1829 static struct dentry *follow_dotdot_rcu(struct nameidata *nd, in follow_dotdot_rcu() argument
1835 if (path_equal(&nd->path, &nd->root)) in follow_dotdot_rcu()
1837 if (unlikely(nd->path.dentry == nd->path.mnt->mnt_root)) { in follow_dotdot_rcu()
1840 if (!choose_mountpoint_rcu(real_mount(nd->path.mnt), in follow_dotdot_rcu()
1841 &nd->root, &path, &seq)) in follow_dotdot_rcu()
1843 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) in follow_dotdot_rcu()
1845 nd->path = path; in follow_dotdot_rcu()
1846 nd->inode = path.dentry->d_inode; in follow_dotdot_rcu()
1847 nd->seq = seq; in follow_dotdot_rcu()
1848 if (unlikely(read_seqretry(&mount_lock, nd->m_seq))) in follow_dotdot_rcu()
1852 old = nd->path.dentry; in follow_dotdot_rcu()
1856 if (unlikely(read_seqcount_retry(&old->d_seq, nd->seq))) in follow_dotdot_rcu()
1858 if (unlikely(!path_connected(nd->path.mnt, parent))) in follow_dotdot_rcu()
1862 if (unlikely(read_seqretry(&mount_lock, nd->m_seq))) in follow_dotdot_rcu()
1864 if (unlikely(nd->flags & LOOKUP_BENEATH)) in follow_dotdot_rcu()
1869 static struct dentry *follow_dotdot(struct nameidata *nd, in follow_dotdot() argument
1875 if (path_equal(&nd->path, &nd->root)) in follow_dotdot()
1877 if (unlikely(nd->path.dentry == nd->path.mnt->mnt_root)) { in follow_dotdot()
1880 if (!choose_mountpoint(real_mount(nd->path.mnt), in follow_dotdot()
1881 &nd->root, &path)) in follow_dotdot()
1883 path_put(&nd->path); in follow_dotdot()
1884 nd->path = path; in follow_dotdot()
1885 nd->inode = path.dentry->d_inode; in follow_dotdot()
1886 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) in follow_dotdot()
1890 parent = dget_parent(nd->path.dentry); in follow_dotdot()
1891 if (unlikely(!path_connected(nd->path.mnt, parent))) { in follow_dotdot()
1900 if (unlikely(nd->flags & LOOKUP_BENEATH)) in follow_dotdot()
1902 dget(nd->path.dentry); in follow_dotdot()
1906 static const char *handle_dots(struct nameidata *nd, int type) in handle_dots() argument
1914 if (!nd->root.mnt) { in handle_dots()
1915 error = ERR_PTR(set_root(nd)); in handle_dots()
1919 if (nd->flags & LOOKUP_RCU) in handle_dots()
1920 parent = follow_dotdot_rcu(nd, &inode, &seq); in handle_dots()
1922 parent = follow_dotdot(nd, &inode, &seq); in handle_dots()
1926 error = step_into(nd, WALK_NOFOLLOW, in handle_dots()
1927 nd->path.dentry, nd->inode, nd->seq); in handle_dots()
1929 error = step_into(nd, WALK_NOFOLLOW, in handle_dots()
1934 if (unlikely(nd->flags & LOOKUP_IS_SCOPED)) { in handle_dots()
1942 if (unlikely(__read_seqcount_retry(&mount_lock.seqcount, nd->m_seq))) in handle_dots()
1944 if (unlikely(__read_seqcount_retry(&rename_lock.seqcount, nd->r_seq))) in handle_dots()
1951 static const char *walk_component(struct nameidata *nd, int flags) in walk_component() argument
1961 if (unlikely(nd->last_type != LAST_NORM)) { in walk_component()
1962 if (!(flags & WALK_MORE) && nd->depth) in walk_component()
1963 put_link(nd); in walk_component()
1964 return handle_dots(nd, nd->last_type); in walk_component()
1966 dentry = lookup_fast(nd, &inode, &seq); in walk_component()
1970 dentry = lookup_slow(&nd->last, nd->path.dentry, nd->flags); in walk_component()
1974 if (!(flags & WALK_MORE) && nd->depth) in walk_component()
1975 put_link(nd); in walk_component()
1976 return step_into(nd, flags, dentry, inode, seq); in walk_component()
2215 static int link_path_walk(const char *name, struct nameidata *nd) in link_path_walk() argument
2220 nd->last_type = LAST_ROOT; in link_path_walk()
2221 nd->flags |= LOOKUP_PARENT; in link_path_walk()
2227 nd->dir_mode = 0; // short-circuit the 'hardening' idiocy in link_path_walk()
2238 mnt_userns = mnt_user_ns(nd->path.mnt); in link_path_walk()
2239 err = may_lookup(mnt_userns, nd); in link_path_walk()
2243 hash_len = hash_name(nd->path.dentry, name); in link_path_walk()
2250 nd->state |= ND_JUMPED; in link_path_walk()
2257 struct dentry *parent = nd->path.dentry; in link_path_walk()
2258 nd->state &= ~ND_JUMPED; in link_path_walk()
2269 nd->last.hash_len = hash_len; in link_path_walk()
2270 nd->last.name = name; in link_path_walk()
2271 nd->last_type = type; in link_path_walk()
2287 nd->dir_uid = i_uid_into_mnt(mnt_userns, nd->inode); in link_path_walk()
2288 nd->dir_mode = nd->inode->i_mode; in link_path_walk()
2289 nd->flags &= ~LOOKUP_PARENT; in link_path_walk()
2293 name = nd->stack[--depth].name; in link_path_walk()
2294 link = walk_component(nd, 0); in link_path_walk()
2297 link = walk_component(nd, WALK_MORE); in link_path_walk()
2303 nd->stack[depth++].name = name; in link_path_walk()
2307 if (unlikely(!d_can_lookup(nd->path.dentry))) { in link_path_walk()
2308 if (nd->flags & LOOKUP_RCU) { in link_path_walk()
2309 if (!try_to_unlazy(nd)) in link_path_walk()
2318 static const char *path_init(struct nameidata *nd, unsigned flags) in path_init() argument
2321 const char *s = nd->name->name; in path_init()
2332 nd->flags = flags; in path_init()
2333 nd->state |= ND_JUMPED; in path_init()
2335 nd->m_seq = __read_seqcount_begin(&mount_lock.seqcount); in path_init()
2336 nd->r_seq = __read_seqcount_begin(&rename_lock.seqcount); in path_init()
2339 if (nd->state & ND_ROOT_PRESET) { in path_init()
2340 struct dentry *root = nd->root.dentry; in path_init()
2344 nd->path = nd->root; in path_init()
2345 nd->inode = inode; in path_init()
2347 nd->seq = read_seqcount_begin(&nd->path.dentry->d_seq); in path_init()
2348 nd->root_seq = nd->seq; in path_init()
2350 path_get(&nd->path); in path_init()
2355 nd->root.mnt = NULL; in path_init()
2359 error = nd_jump_root(nd); in path_init()
2366 if (nd->dfd == AT_FDCWD) { in path_init()
2373 nd->path = fs->pwd; in path_init()
2374 nd->inode = nd->path.dentry->d_inode; in path_init()
2375 nd->seq = __read_seqcount_begin(&nd->path.dentry->d_seq); in path_init()
2378 get_fs_pwd(current->fs, &nd->path); in path_init()
2379 nd->inode = nd->path.dentry->d_inode; in path_init()
2383 struct fd f = fdget_raw(nd->dfd); in path_init()
2396 nd->path = f.file->f_path; in path_init()
2398 nd->inode = nd->path.dentry->d_inode; in path_init()
2399 nd->seq = read_seqcount_begin(&nd->path.dentry->d_seq); in path_init()
2401 path_get(&nd->path); in path_init()
2402 nd->inode = nd->path.dentry->d_inode; in path_init()
2409 nd->root = nd->path; in path_init()
2411 nd->root_seq = nd->seq; in path_init()
2413 path_get(&nd->root); in path_init()
2414 nd->state |= ND_ROOT_GRABBED; in path_init()
2420 static inline const char *lookup_last(struct nameidata *nd) in lookup_last() argument
2422 if (nd->last_type == LAST_NORM && nd->last.name[nd->last.len]) in lookup_last()
2423 nd->flags |= LOOKUP_FOLLOW | LOOKUP_DIRECTORY; in lookup_last()
2425 return walk_component(nd, WALK_TRAILING); in lookup_last()
2428 static int handle_lookup_down(struct nameidata *nd) in handle_lookup_down() argument
2430 if (!(nd->flags & LOOKUP_RCU)) in handle_lookup_down()
2431 dget(nd->path.dentry); in handle_lookup_down()
2432 return PTR_ERR(step_into(nd, WALK_NOFOLLOW, in handle_lookup_down()
2433 nd->path.dentry, nd->inode, nd->seq)); in handle_lookup_down()
2437 static int path_lookupat(struct nameidata *nd, unsigned flags, struct path *path) in path_lookupat() argument
2439 const char *s = path_init(nd, flags); in path_lookupat()
2443 err = handle_lookup_down(nd); in path_lookupat()
2448 while (!(err = link_path_walk(s, nd)) && in path_lookupat()
2449 (s = lookup_last(nd)) != NULL) in path_lookupat()
2451 if (!err && unlikely(nd->flags & LOOKUP_MOUNTPOINT)) { in path_lookupat()
2452 err = handle_lookup_down(nd); in path_lookupat()
2453 nd->state &= ~ND_JUMPED; // no d_weak_revalidate(), please... in path_lookupat()
2456 err = complete_walk(nd); in path_lookupat()
2458 if (!err && nd->flags & LOOKUP_DIRECTORY) in path_lookupat()
2459 if (!d_can_lookup(nd->path.dentry)) in path_lookupat()
2462 *path = nd->path; in path_lookupat()
2463 nd->path.mnt = NULL; in path_lookupat()
2464 nd->path.dentry = NULL; in path_lookupat()
2466 terminate_walk(nd); in path_lookupat()
2474 struct nameidata nd; in filename_lookup() local
2477 set_nameidata(&nd, dfd, name, root); in filename_lookup()
2478 retval = path_lookupat(&nd, flags | LOOKUP_RCU, path); in filename_lookup()
2480 retval = path_lookupat(&nd, flags, path); in filename_lookup()
2482 retval = path_lookupat(&nd, flags | LOOKUP_REVAL, path); in filename_lookup()
2492 static int path_parentat(struct nameidata *nd, unsigned flags, in path_parentat() argument
2495 const char *s = path_init(nd, flags); in path_parentat()
2496 int err = link_path_walk(s, nd); in path_parentat()
2498 err = complete_walk(nd); in path_parentat()
2500 *parent = nd->path; in path_parentat()
2501 nd->path.mnt = NULL; in path_parentat()
2502 nd->path.dentry = NULL; in path_parentat()
2504 terminate_walk(nd); in path_parentat()
2514 struct nameidata nd; in filename_parentat() local
2518 set_nameidata(&nd, dfd, name, NULL); in filename_parentat()
2519 retval = path_parentat(&nd, flags | LOOKUP_RCU, parent); in filename_parentat()
2521 retval = path_parentat(&nd, flags, parent); in filename_parentat()
2523 retval = path_parentat(&nd, flags | LOOKUP_REVAL, parent); in filename_parentat()
2525 *last = nd.last; in filename_parentat()
2526 *type = nd.last_type; in filename_parentat()
3131 static struct dentry *atomic_open(struct nameidata *nd, struct dentry *dentry, in atomic_open() argument
3136 struct inode *dir = nd->path.dentry->d_inode; in atomic_open()
3139 if (nd->flags & LOOKUP_DIRECTORY) in atomic_open()
3143 file->f_path.mnt = nd->path.mnt; in atomic_open()
3186 static struct dentry *lookup_open(struct nameidata *nd, struct file *file, in lookup_open() argument
3191 struct dentry *dir = nd->path.dentry; in lookup_open()
3203 dentry = d_lookup(dir, &nd->last); in lookup_open()
3206 dentry = d_alloc_parallel(dir, &nd->last, &wq); in lookup_open()
3213 error = d_revalidate(dentry, nd->flags); in lookup_open()
3238 mnt_userns = mnt_user_ns(nd->path.mnt); in lookup_open()
3245 create_error = may_o_create(mnt_userns, &nd->path, in lookup_open()
3253 dentry = atomic_open(nd, dentry, file, open_flag, mode); in lookup_open()
3261 nd->flags); in lookup_open()
3298 static const char *open_last_lookups(struct nameidata *nd, in open_last_lookups() argument
3301 struct dentry *dir = nd->path.dentry; in open_last_lookups()
3309 nd->flags |= op->intent; in open_last_lookups()
3311 if (nd->last_type != LAST_NORM) { in open_last_lookups()
3312 if (nd->depth) in open_last_lookups()
3313 put_link(nd); in open_last_lookups()
3314 return handle_dots(nd, nd->last_type); in open_last_lookups()
3318 if (nd->last.name[nd->last.len]) in open_last_lookups()
3319 nd->flags |= LOOKUP_FOLLOW | LOOKUP_DIRECTORY; in open_last_lookups()
3321 dentry = lookup_fast(nd, &inode, &seq); in open_last_lookups()
3327 BUG_ON(nd->flags & LOOKUP_RCU); in open_last_lookups()
3330 if (nd->flags & LOOKUP_RCU) { in open_last_lookups()
3331 if (!try_to_unlazy(nd)) in open_last_lookups()
3334 audit_inode(nd->name, dir, AUDIT_INODE_PARENT); in open_last_lookups()
3336 if (unlikely(nd->last.name[nd->last.len])) in open_last_lookups()
3341 got_write = !mnt_want_write(nd->path.mnt); in open_last_lookups()
3352 dentry = lookup_open(nd, file, op, got_write); in open_last_lookups()
3361 mnt_drop_write(nd->path.mnt); in open_last_lookups()
3367 dput(nd->path.dentry); in open_last_lookups()
3368 nd->path.dentry = dentry; in open_last_lookups()
3373 if (nd->depth) in open_last_lookups()
3374 put_link(nd); in open_last_lookups()
3375 res = step_into(nd, WALK_TRAILING, dentry, inode, seq); in open_last_lookups()
3377 nd->flags &= ~(LOOKUP_OPEN|LOOKUP_CREATE|LOOKUP_EXCL); in open_last_lookups()
3384 static int do_open(struct nameidata *nd, in do_open() argument
3394 error = complete_walk(nd); in do_open()
3399 audit_inode(nd->name, nd->path.dentry, 0); in do_open()
3400 mnt_userns = mnt_user_ns(nd->path.mnt); in do_open()
3404 if (d_is_dir(nd->path.dentry)) in do_open()
3406 error = may_create_in_sticky(mnt_userns, nd, in do_open()
3407 d_backing_inode(nd->path.dentry)); in do_open()
3411 if ((nd->flags & LOOKUP_DIRECTORY) && !d_can_lookup(nd->path.dentry)) in do_open()
3420 } else if (d_is_reg(nd->path.dentry) && open_flag & O_TRUNC) { in do_open()
3421 error = mnt_want_write(nd->path.mnt); in do_open()
3426 error = may_open(mnt_userns, &nd->path, acc_mode, open_flag); in do_open()
3428 error = vfs_open(&nd->path, file); in do_open()
3438 mnt_drop_write(nd->path.mnt); in do_open()
3497 static int do_tmpfile(struct nameidata *nd, unsigned flags, in do_tmpfile() argument
3504 int error = path_lookupat(nd, flags | LOOKUP_DIRECTORY, &path); in do_tmpfile()
3517 audit_inode(nd->name, child, 0); in do_tmpfile()
3529 static int do_o_path(struct nameidata *nd, unsigned flags, struct file *file) in do_o_path() argument
3532 int error = path_lookupat(nd, flags, &path); in do_o_path()
3534 audit_inode(nd->name, path.dentry, 0); in do_o_path()
3541 static struct file *path_openat(struct nameidata *nd, in path_openat() argument
3552 error = do_tmpfile(nd, flags, op, file); in path_openat()
3554 error = do_o_path(nd, flags, file); in path_openat()
3556 const char *s = path_init(nd, flags); in path_openat()
3557 while (!(error = link_path_walk(s, nd)) && in path_openat()
3558 (s = open_last_lookups(nd, file, op)) != NULL) in path_openat()
3561 error = do_open(nd, file, op); in path_openat()
3562 terminate_walk(nd); in path_openat()
3583 struct nameidata nd; in do_filp_open() local
3587 set_nameidata(&nd, dfd, pathname, NULL); in do_filp_open()
3588 filp = path_openat(&nd, op, flags | LOOKUP_RCU); in do_filp_open()
3590 filp = path_openat(&nd, op, flags); in do_filp_open()
3592 filp = path_openat(&nd, op, flags | LOOKUP_REVAL); in do_filp_open()
3600 struct nameidata nd; in do_file_open_root() local
3612 set_nameidata(&nd, -1, filename, root); in do_file_open_root()
3613 file = path_openat(&nd, op, flags | LOOKUP_RCU); in do_file_open_root()
3615 file = path_openat(&nd, op, flags); in do_file_open_root()
3617 file = path_openat(&nd, op, flags | LOOKUP_REVAL); in do_file_open_root()