Lines Matching refs:nd
553 static bool nd_alloc_stack(struct nameidata *nd) in nd_alloc_stack() argument
558 nd->flags & LOOKUP_RCU ? GFP_ATOMIC : GFP_KERNEL); in nd_alloc_stack()
561 memcpy(p, nd->internal, sizeof(nd->internal)); in nd_alloc_stack()
562 nd->stack = p; in nd_alloc_stack()
583 static void drop_links(struct nameidata *nd) in drop_links() argument
585 int i = nd->depth; in drop_links()
587 struct saved *last = nd->stack + i; in drop_links()
593 static void terminate_walk(struct nameidata *nd) in terminate_walk() argument
595 drop_links(nd); in terminate_walk()
596 if (!(nd->flags & LOOKUP_RCU)) { in terminate_walk()
598 path_put(&nd->path); in terminate_walk()
599 for (i = 0; i < nd->depth; i++) in terminate_walk()
600 path_put(&nd->stack[i].link); in terminate_walk()
601 if (nd->flags & LOOKUP_ROOT_GRABBED) { in terminate_walk()
602 path_put(&nd->root); in terminate_walk()
603 nd->flags &= ~LOOKUP_ROOT_GRABBED; in terminate_walk()
606 nd->flags &= ~LOOKUP_RCU; in terminate_walk()
609 nd->depth = 0; in terminate_walk()
610 nd->path.mnt = NULL; in terminate_walk()
611 nd->path.dentry = NULL; in terminate_walk()
631 static inline bool legitimize_path(struct nameidata *nd, in legitimize_path() argument
634 return __legitimize_path(path, seq, nd->m_seq); in legitimize_path()
637 static bool legitimize_links(struct nameidata *nd) in legitimize_links() argument
640 if (unlikely(nd->flags & LOOKUP_CACHED)) { in legitimize_links()
641 drop_links(nd); in legitimize_links()
642 nd->depth = 0; in legitimize_links()
645 for (i = 0; i < nd->depth; i++) { in legitimize_links()
646 struct saved *last = nd->stack + i; in legitimize_links()
647 if (unlikely(!legitimize_path(nd, &last->link, last->seq))) { in legitimize_links()
648 drop_links(nd); in legitimize_links()
649 nd->depth = i + 1; in legitimize_links()
656 static bool legitimize_root(struct nameidata *nd) in legitimize_root() argument
663 if (!nd->root.mnt && (nd->flags & LOOKUP_IS_SCOPED)) in legitimize_root()
666 if (!nd->root.mnt || (nd->flags & LOOKUP_ROOT)) in legitimize_root()
668 nd->flags |= LOOKUP_ROOT_GRABBED; in legitimize_root()
669 return legitimize_path(nd, &nd->root, nd->root_seq); in legitimize_root()
694 static bool try_to_unlazy(struct nameidata *nd) in try_to_unlazy() argument
696 struct dentry *parent = nd->path.dentry; in try_to_unlazy()
698 BUG_ON(!(nd->flags & LOOKUP_RCU)); in try_to_unlazy()
700 nd->flags &= ~LOOKUP_RCU; in try_to_unlazy()
701 if (unlikely(!legitimize_links(nd))) in try_to_unlazy()
703 if (unlikely(!legitimize_path(nd, &nd->path, nd->seq))) in try_to_unlazy()
705 if (unlikely(!legitimize_root(nd))) in try_to_unlazy()
708 BUG_ON(nd->inode != parent->d_inode); in try_to_unlazy()
712 nd->path.mnt = NULL; in try_to_unlazy()
713 nd->path.dentry = NULL; in try_to_unlazy()
732 static bool try_to_unlazy_next(struct nameidata *nd, struct dentry *dentry, unsigned seq) in try_to_unlazy_next() argument
734 BUG_ON(!(nd->flags & LOOKUP_RCU)); in try_to_unlazy_next()
736 nd->flags &= ~LOOKUP_RCU; in try_to_unlazy_next()
737 if (unlikely(!legitimize_links(nd))) in try_to_unlazy_next()
739 if (unlikely(!legitimize_mnt(nd->path.mnt, nd->m_seq))) in try_to_unlazy_next()
741 if (unlikely(!lockref_get_not_dead(&nd->path.dentry->d_lockref))) in try_to_unlazy_next()
759 if (unlikely(!legitimize_root(nd))) in try_to_unlazy_next()
765 nd->path.mnt = NULL; in try_to_unlazy_next()
767 nd->path.dentry = NULL; in try_to_unlazy_next()
787 static void success_walk_trace(struct nameidata *nd) in success_walk_trace() argument
789 struct path *pt = &nd->path; in success_walk_trace()
790 struct inode *i = nd->inode; in success_walk_trace()
870 static int complete_walk(struct nameidata *nd) in complete_walk() argument
872 struct dentry *dentry = nd->path.dentry; in complete_walk()
875 if (nd->flags & LOOKUP_RCU) { in complete_walk()
880 if (!(nd->flags & (LOOKUP_ROOT | 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->flags & LOOKUP_JUMPED))) { in complete_walk()
909 success_walk_trace(nd); in complete_walk()
914 success_walk_trace(nd); in complete_walk()
918 status = dentry->d_op->d_weak_revalidate(dentry, nd->flags); in complete_walk()
920 success_walk_trace(nd); in complete_walk()
930 static int set_root(struct nameidata *nd) in set_root() argument
939 if (WARN_ON(nd->flags & LOOKUP_IS_SCOPED)) in set_root()
942 if (nd->flags & LOOKUP_RCU) { in set_root()
947 nd->root = fs->root; in set_root()
948 nd->root_seq = __read_seqcount_begin(&nd->root.dentry->d_seq); in set_root()
951 get_fs_root(fs, &nd->root); in set_root()
952 nd->flags |= LOOKUP_ROOT_GRABBED; in set_root()
957 static int nd_jump_root(struct nameidata *nd) in nd_jump_root() argument
959 if (unlikely(nd->flags & LOOKUP_BENEATH)) in nd_jump_root()
961 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) { in nd_jump_root()
963 if (nd->path.mnt != NULL && nd->path.mnt != nd->root.mnt) in nd_jump_root()
966 if (!nd->root.mnt) { in nd_jump_root()
967 int error = set_root(nd); in nd_jump_root()
971 if (nd->flags & LOOKUP_RCU) { in nd_jump_root()
973 nd->path = nd->root; in nd_jump_root()
974 d = nd->path.dentry; in nd_jump_root()
975 nd->inode = d->d_inode; in nd_jump_root()
976 nd->seq = nd->root_seq; in nd_jump_root()
977 if (unlikely(read_seqcount_retry(&d->d_seq, nd->seq))) in nd_jump_root()
980 path_put(&nd->path); in nd_jump_root()
981 nd->path = nd->root; in nd_jump_root()
982 path_get(&nd->path); in nd_jump_root()
983 nd->inode = nd->path.dentry->d_inode; in nd_jump_root()
985 nd->flags |= LOOKUP_JUMPED; in nd_jump_root()
996 struct nameidata *nd = current->nameidata; in nd_jump_link() local
998 if (unlikely(nd->flags & LOOKUP_NO_MAGICLINKS)) in nd_jump_link()
1002 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) { in nd_jump_link()
1003 if (nd->path.mnt != path->mnt) in nd_jump_link()
1007 if (unlikely(nd->flags & LOOKUP_IS_SCOPED)) in nd_jump_link()
1010 path_put(&nd->path); in nd_jump_link()
1011 nd->path = *path; in nd_jump_link()
1012 nd->inode = nd->path.dentry->d_inode; in nd_jump_link()
1013 nd->flags |= LOOKUP_JUMPED; in nd_jump_link()
1021 static inline void put_link(struct nameidata *nd) in put_link() argument
1023 struct saved *last = nd->stack + --nd->depth; in put_link()
1025 if (!(nd->flags & LOOKUP_RCU)) in put_link()
1049 static inline int may_follow_link(struct nameidata *nd, const struct inode *inode) in may_follow_link() argument
1059 if ((nd->dir_mode & (S_ISVTX|S_IWOTH)) != (S_ISVTX|S_IWOTH)) in may_follow_link()
1063 if (uid_valid(nd->dir_uid) && uid_eq(nd->dir_uid, inode->i_uid)) in may_follow_link()
1066 if (nd->flags & LOOKUP_RCU) in may_follow_link()
1069 audit_inode(nd->name, nd->stack[0].link.dentry, 0); in may_follow_link()
1406 static bool __follow_mount_rcu(struct nameidata *nd, struct path *path, in __follow_mount_rcu() argument
1415 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) in __follow_mount_rcu()
1435 nd->flags |= LOOKUP_JUMPED; in __follow_mount_rcu()
1445 if (read_seqretry(&mount_lock, nd->m_seq)) in __follow_mount_rcu()
1449 if (read_seqretry(&mount_lock, nd->m_seq)) in __follow_mount_rcu()
1456 static inline int handle_mounts(struct nameidata *nd, struct dentry *dentry, in handle_mounts() argument
1463 path->mnt = nd->path.mnt; in handle_mounts()
1465 if (nd->flags & LOOKUP_RCU) { in handle_mounts()
1469 if (likely(__follow_mount_rcu(nd, path, inode, seqp))) in handle_mounts()
1471 if (!try_to_unlazy_next(nd, dentry, seq)) in handle_mounts()
1474 path->mnt = nd->path.mnt; in handle_mounts()
1477 ret = traverse_mounts(path, &jumped, &nd->total_link_count, nd->flags); in handle_mounts()
1479 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) in handle_mounts()
1482 nd->flags |= LOOKUP_JUMPED; in handle_mounts()
1486 if (path->mnt != nd->path.mnt) in handle_mounts()
1549 static struct dentry *lookup_fast(struct nameidata *nd, in lookup_fast() argument
1553 struct dentry *dentry, *parent = nd->path.dentry; in lookup_fast()
1561 if (nd->flags & LOOKUP_RCU) { in lookup_fast()
1563 dentry = __d_lookup_rcu(parent, &nd->last, &seq); in lookup_fast()
1565 if (!try_to_unlazy(nd)) in lookup_fast()
1585 if (unlikely(__read_seqcount_retry(&parent->d_seq, nd->seq))) in lookup_fast()
1589 status = d_revalidate(dentry, nd->flags); in lookup_fast()
1592 if (!try_to_unlazy_next(nd, dentry, seq)) in lookup_fast()
1596 status = d_revalidate(dentry, nd->flags); in lookup_fast()
1598 dentry = __d_lookup(parent, &nd->last); in lookup_fast()
1601 status = d_revalidate(dentry, nd->flags); in lookup_fast()
1662 static inline int may_lookup(struct nameidata *nd) in may_lookup() argument
1664 if (nd->flags & LOOKUP_RCU) { in may_lookup()
1665 int err = inode_permission(nd->inode, MAY_EXEC|MAY_NOT_BLOCK); in may_lookup()
1666 if (err != -ECHILD || !try_to_unlazy(nd)) in may_lookup()
1669 return inode_permission(nd->inode, MAY_EXEC); in may_lookup()
1672 static int reserve_stack(struct nameidata *nd, struct path *link, unsigned seq) in reserve_stack() argument
1674 if (unlikely(nd->total_link_count++ >= MAXSYMLINKS)) in reserve_stack()
1677 if (likely(nd->depth != EMBEDDED_LEVELS)) in reserve_stack()
1679 if (likely(nd->stack != nd->internal)) in reserve_stack()
1681 if (likely(nd_alloc_stack(nd))) in reserve_stack()
1684 if (nd->flags & LOOKUP_RCU) { in reserve_stack()
1687 bool grabbed_link = legitimize_path(nd, link, seq); in reserve_stack()
1689 if (!try_to_unlazy(nd) != 0 || !grabbed_link) in reserve_stack()
1692 if (nd_alloc_stack(nd)) in reserve_stack()
1700 static const char *pick_link(struct nameidata *nd, struct path *link, in pick_link() argument
1705 int error = reserve_stack(nd, link, seq); in pick_link()
1708 if (!(nd->flags & LOOKUP_RCU)) in pick_link()
1712 last = nd->stack + nd->depth++; in pick_link()
1718 error = may_follow_link(nd, inode); in pick_link()
1723 if (unlikely(nd->flags & LOOKUP_NO_SYMLINKS) || in pick_link()
1727 if (!(nd->flags & LOOKUP_RCU)) { in pick_link()
1731 if (!try_to_unlazy(nd)) in pick_link()
1737 nd->flags & LOOKUP_RCU); in pick_link()
1746 if (nd->flags & LOOKUP_RCU) { in pick_link()
1748 if (res == ERR_PTR(-ECHILD) && try_to_unlazy(nd)) in pick_link()
1759 error = nd_jump_root(nd); in pick_link()
1768 put_link(nd); in pick_link()
1778 static const char *step_into(struct nameidata *nd, int flags, in step_into() argument
1782 int err = handle_mounts(nd, dentry, &path, &inode, &seq); in step_into()
1787 ((flags & WALK_TRAILING) && !(nd->flags & LOOKUP_FOLLOW)) || in step_into()
1790 if (!(nd->flags & LOOKUP_RCU)) { in step_into()
1791 dput(nd->path.dentry); in step_into()
1792 if (nd->path.mnt != path.mnt) in step_into()
1793 mntput(nd->path.mnt); in step_into()
1795 nd->path = path; in step_into()
1796 nd->inode = inode; in step_into()
1797 nd->seq = seq; in step_into()
1800 if (nd->flags & LOOKUP_RCU) { in step_into()
1805 if (path.mnt == nd->path.mnt) in step_into()
1808 return pick_link(nd, &path, inode, seq, flags); in step_into()
1811 static struct dentry *follow_dotdot_rcu(struct nameidata *nd, in follow_dotdot_rcu() argument
1817 if (path_equal(&nd->path, &nd->root)) in follow_dotdot_rcu()
1819 if (unlikely(nd->path.dentry == nd->path.mnt->mnt_root)) { in follow_dotdot_rcu()
1822 if (!choose_mountpoint_rcu(real_mount(nd->path.mnt), in follow_dotdot_rcu()
1823 &nd->root, &path, &seq)) in follow_dotdot_rcu()
1825 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) in follow_dotdot_rcu()
1827 nd->path = path; in follow_dotdot_rcu()
1828 nd->inode = path.dentry->d_inode; in follow_dotdot_rcu()
1829 nd->seq = seq; in follow_dotdot_rcu()
1830 if (unlikely(read_seqretry(&mount_lock, nd->m_seq))) in follow_dotdot_rcu()
1834 old = nd->path.dentry; in follow_dotdot_rcu()
1838 if (unlikely(read_seqcount_retry(&old->d_seq, nd->seq))) in follow_dotdot_rcu()
1840 if (unlikely(!path_connected(nd->path.mnt, parent))) in follow_dotdot_rcu()
1844 if (unlikely(read_seqretry(&mount_lock, nd->m_seq))) in follow_dotdot_rcu()
1846 if (unlikely(nd->flags & LOOKUP_BENEATH)) in follow_dotdot_rcu()
1851 static struct dentry *follow_dotdot(struct nameidata *nd, in follow_dotdot() argument
1857 if (path_equal(&nd->path, &nd->root)) in follow_dotdot()
1859 if (unlikely(nd->path.dentry == nd->path.mnt->mnt_root)) { in follow_dotdot()
1862 if (!choose_mountpoint(real_mount(nd->path.mnt), in follow_dotdot()
1863 &nd->root, &path)) in follow_dotdot()
1865 path_put(&nd->path); in follow_dotdot()
1866 nd->path = path; in follow_dotdot()
1867 nd->inode = path.dentry->d_inode; in follow_dotdot()
1868 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) in follow_dotdot()
1872 parent = dget_parent(nd->path.dentry); in follow_dotdot()
1873 if (unlikely(!path_connected(nd->path.mnt, parent))) { in follow_dotdot()
1882 if (unlikely(nd->flags & LOOKUP_BENEATH)) in follow_dotdot()
1884 dget(nd->path.dentry); in follow_dotdot()
1888 static const char *handle_dots(struct nameidata *nd, int type) in handle_dots() argument
1896 if (!nd->root.mnt) { in handle_dots()
1897 error = ERR_PTR(set_root(nd)); in handle_dots()
1901 if (nd->flags & LOOKUP_RCU) in handle_dots()
1902 parent = follow_dotdot_rcu(nd, &inode, &seq); in handle_dots()
1904 parent = follow_dotdot(nd, &inode, &seq); in handle_dots()
1908 error = step_into(nd, WALK_NOFOLLOW, in handle_dots()
1909 nd->path.dentry, nd->inode, nd->seq); in handle_dots()
1911 error = step_into(nd, WALK_NOFOLLOW, in handle_dots()
1916 if (unlikely(nd->flags & LOOKUP_IS_SCOPED)) { in handle_dots()
1924 if (unlikely(__read_seqcount_retry(&mount_lock.seqcount, nd->m_seq))) in handle_dots()
1926 if (unlikely(__read_seqcount_retry(&rename_lock.seqcount, nd->r_seq))) in handle_dots()
1933 static const char *walk_component(struct nameidata *nd, int flags) in walk_component() argument
1943 if (unlikely(nd->last_type != LAST_NORM)) { in walk_component()
1944 if (!(flags & WALK_MORE) && nd->depth) in walk_component()
1945 put_link(nd); in walk_component()
1946 return handle_dots(nd, nd->last_type); in walk_component()
1948 dentry = lookup_fast(nd, &inode, &seq); in walk_component()
1952 dentry = lookup_slow(&nd->last, nd->path.dentry, nd->flags); in walk_component()
1956 if (!(flags & WALK_MORE) && nd->depth) in walk_component()
1957 put_link(nd); in walk_component()
1958 return step_into(nd, flags, dentry, inode, seq); in walk_component()
2197 static int link_path_walk(const char *name, struct nameidata *nd) in link_path_walk() argument
2202 nd->last_type = LAST_ROOT; in link_path_walk()
2203 nd->flags |= LOOKUP_PARENT; in link_path_walk()
2217 err = may_lookup(nd); in link_path_walk()
2221 hash_len = hash_name(nd->path.dentry, name); in link_path_walk()
2228 nd->flags |= LOOKUP_JUMPED; in link_path_walk()
2235 struct dentry *parent = nd->path.dentry; in link_path_walk()
2236 nd->flags &= ~LOOKUP_JUMPED; in link_path_walk()
2247 nd->last.hash_len = hash_len; in link_path_walk()
2248 nd->last.name = name; in link_path_walk()
2249 nd->last_type = type; in link_path_walk()
2265 nd->dir_uid = nd->inode->i_uid; in link_path_walk()
2266 nd->dir_mode = nd->inode->i_mode; in link_path_walk()
2267 nd->flags &= ~LOOKUP_PARENT; in link_path_walk()
2271 name = nd->stack[--depth].name; in link_path_walk()
2272 link = walk_component(nd, 0); in link_path_walk()
2275 link = walk_component(nd, WALK_MORE); in link_path_walk()
2281 nd->stack[depth++].name = name; in link_path_walk()
2285 if (unlikely(!d_can_lookup(nd->path.dentry))) { in link_path_walk()
2286 if (nd->flags & LOOKUP_RCU) { in link_path_walk()
2287 if (!try_to_unlazy(nd)) in link_path_walk()
2296 static const char *path_init(struct nameidata *nd, unsigned flags) in path_init() argument
2299 const char *s = nd->name->name; in path_init()
2310 nd->flags = flags | LOOKUP_JUMPED; in path_init()
2311 nd->depth = 0; in path_init()
2313 nd->m_seq = __read_seqcount_begin(&mount_lock.seqcount); in path_init()
2314 nd->r_seq = __read_seqcount_begin(&rename_lock.seqcount); in path_init()
2318 struct dentry *root = nd->root.dentry; in path_init()
2322 nd->path = nd->root; in path_init()
2323 nd->inode = inode; in path_init()
2325 nd->seq = read_seqcount_begin(&nd->path.dentry->d_seq); in path_init()
2326 nd->root_seq = nd->seq; in path_init()
2328 path_get(&nd->path); in path_init()
2333 nd->root.mnt = NULL; in path_init()
2337 error = nd_jump_root(nd); in path_init()
2344 if (nd->dfd == AT_FDCWD) { in path_init()
2351 nd->path = fs->pwd; in path_init()
2352 nd->inode = nd->path.dentry->d_inode; in path_init()
2353 nd->seq = __read_seqcount_begin(&nd->path.dentry->d_seq); in path_init()
2356 get_fs_pwd(current->fs, &nd->path); in path_init()
2357 nd->inode = nd->path.dentry->d_inode; in path_init()
2361 struct fd f = fdget_raw(nd->dfd); in path_init()
2374 nd->path = f.file->f_path; in path_init()
2376 nd->inode = nd->path.dentry->d_inode; in path_init()
2377 nd->seq = read_seqcount_begin(&nd->path.dentry->d_seq); in path_init()
2379 path_get(&nd->path); in path_init()
2380 nd->inode = nd->path.dentry->d_inode; in path_init()
2387 nd->root = nd->path; in path_init()
2389 nd->root_seq = nd->seq; in path_init()
2391 path_get(&nd->root); in path_init()
2392 nd->flags |= LOOKUP_ROOT_GRABBED; in path_init()
2398 static inline const char *lookup_last(struct nameidata *nd) in lookup_last() argument
2400 if (nd->last_type == LAST_NORM && nd->last.name[nd->last.len]) in lookup_last()
2401 nd->flags |= LOOKUP_FOLLOW | LOOKUP_DIRECTORY; in lookup_last()
2403 return walk_component(nd, WALK_TRAILING); in lookup_last()
2406 static int handle_lookup_down(struct nameidata *nd) in handle_lookup_down() argument
2408 if (!(nd->flags & LOOKUP_RCU)) in handle_lookup_down()
2409 dget(nd->path.dentry); in handle_lookup_down()
2410 return PTR_ERR(step_into(nd, WALK_NOFOLLOW, in handle_lookup_down()
2411 nd->path.dentry, nd->inode, nd->seq)); in handle_lookup_down()
2415 static int path_lookupat(struct nameidata *nd, unsigned flags, struct path *path) in path_lookupat() argument
2417 const char *s = path_init(nd, flags); in path_lookupat()
2421 err = handle_lookup_down(nd); in path_lookupat()
2426 while (!(err = link_path_walk(s, nd)) && in path_lookupat()
2427 (s = lookup_last(nd)) != NULL) in path_lookupat()
2429 if (!err && unlikely(nd->flags & LOOKUP_MOUNTPOINT)) { in path_lookupat()
2430 err = handle_lookup_down(nd); in path_lookupat()
2431 nd->flags &= ~LOOKUP_JUMPED; // no d_weak_revalidate(), please... in path_lookupat()
2434 err = complete_walk(nd); in path_lookupat()
2436 if (!err && nd->flags & LOOKUP_DIRECTORY) in path_lookupat()
2437 if (!d_can_lookup(nd->path.dentry)) in path_lookupat()
2440 *path = nd->path; in path_lookupat()
2441 nd->path.mnt = NULL; in path_lookupat()
2442 nd->path.dentry = NULL; in path_lookupat()
2444 terminate_walk(nd); in path_lookupat()
2452 struct nameidata nd; in filename_lookup() local
2456 nd.root = *root; in filename_lookup()
2459 set_nameidata(&nd, dfd, name); in filename_lookup()
2460 retval = path_lookupat(&nd, flags | LOOKUP_RCU, path); in filename_lookup()
2462 retval = path_lookupat(&nd, flags, path); in filename_lookup()
2464 retval = path_lookupat(&nd, flags | LOOKUP_REVAL, path); in filename_lookup()
2475 static int path_parentat(struct nameidata *nd, unsigned flags, in path_parentat() argument
2478 const char *s = path_init(nd, flags); in path_parentat()
2479 int err = link_path_walk(s, nd); in path_parentat()
2481 err = complete_walk(nd); in path_parentat()
2483 *parent = nd->path; in path_parentat()
2484 nd->path.mnt = NULL; in path_parentat()
2485 nd->path.dentry = NULL; in path_parentat()
2487 terminate_walk(nd); in path_parentat()
2496 struct nameidata nd; in filename_parentat() local
2500 set_nameidata(&nd, dfd, name); in filename_parentat()
2501 retval = path_parentat(&nd, flags | LOOKUP_RCU, parent); in filename_parentat()
2503 retval = path_parentat(&nd, flags, parent); in filename_parentat()
2505 retval = path_parentat(&nd, flags | LOOKUP_REVAL, parent); in filename_parentat()
2507 *last = nd.last; in filename_parentat()
2508 *type = nd.last_type; in filename_parentat()
3101 static struct dentry *atomic_open(struct nameidata *nd, struct dentry *dentry, in atomic_open() argument
3106 struct inode *dir = nd->path.dentry->d_inode; in atomic_open()
3109 if (nd->flags & LOOKUP_DIRECTORY) in atomic_open()
3113 file->f_path.mnt = nd->path.mnt; in atomic_open()
3156 static struct dentry *lookup_open(struct nameidata *nd, struct file *file, in lookup_open() argument
3160 struct dentry *dir = nd->path.dentry; in lookup_open()
3172 dentry = d_lookup(dir, &nd->last); in lookup_open()
3175 dentry = d_alloc_parallel(dir, &nd->last, &wq); in lookup_open()
3182 error = d_revalidate(dentry, nd->flags); in lookup_open()
3212 create_error = may_o_create(&nd->path, dentry, mode); in lookup_open()
3219 dentry = atomic_open(nd, dentry, file, open_flag, mode); in lookup_open()
3227 nd->flags); in lookup_open()
3263 static const char *open_last_lookups(struct nameidata *nd, in open_last_lookups() argument
3266 struct dentry *dir = nd->path.dentry; in open_last_lookups()
3274 nd->flags |= op->intent; in open_last_lookups()
3276 if (nd->last_type != LAST_NORM) { in open_last_lookups()
3277 if (nd->depth) in open_last_lookups()
3278 put_link(nd); in open_last_lookups()
3279 return handle_dots(nd, nd->last_type); in open_last_lookups()
3283 if (nd->last.name[nd->last.len]) in open_last_lookups()
3284 nd->flags |= LOOKUP_FOLLOW | LOOKUP_DIRECTORY; in open_last_lookups()
3286 dentry = lookup_fast(nd, &inode, &seq); in open_last_lookups()
3292 BUG_ON(nd->flags & LOOKUP_RCU); in open_last_lookups()
3295 if (nd->flags & LOOKUP_RCU) { in open_last_lookups()
3296 if (!try_to_unlazy(nd)) in open_last_lookups()
3299 audit_inode(nd->name, dir, AUDIT_INODE_PARENT); in open_last_lookups()
3301 if (unlikely(nd->last.name[nd->last.len])) in open_last_lookups()
3306 got_write = !mnt_want_write(nd->path.mnt); in open_last_lookups()
3317 dentry = lookup_open(nd, file, op, got_write); in open_last_lookups()
3326 mnt_drop_write(nd->path.mnt); in open_last_lookups()
3332 dput(nd->path.dentry); in open_last_lookups()
3333 nd->path.dentry = dentry; in open_last_lookups()
3338 if (nd->depth) in open_last_lookups()
3339 put_link(nd); in open_last_lookups()
3340 res = step_into(nd, WALK_TRAILING, dentry, inode, seq); in open_last_lookups()
3342 nd->flags &= ~(LOOKUP_OPEN|LOOKUP_CREATE|LOOKUP_EXCL); in open_last_lookups()
3349 static int do_open(struct nameidata *nd, in do_open() argument
3358 error = complete_walk(nd); in do_open()
3363 audit_inode(nd->name, nd->path.dentry, 0); in do_open()
3367 if (d_is_dir(nd->path.dentry)) in do_open()
3369 error = may_create_in_sticky(nd->dir_mode, nd->dir_uid, in do_open()
3370 d_backing_inode(nd->path.dentry)); in do_open()
3374 if ((nd->flags & LOOKUP_DIRECTORY) && !d_can_lookup(nd->path.dentry)) in do_open()
3383 } else if (d_is_reg(nd->path.dentry) && open_flag & O_TRUNC) { in do_open()
3384 error = mnt_want_write(nd->path.mnt); in do_open()
3389 error = may_open(&nd->path, acc_mode, open_flag); in do_open()
3391 error = vfs_open(&nd->path, file); in do_open()
3401 mnt_drop_write(nd->path.mnt); in do_open()
3445 static int do_tmpfile(struct nameidata *nd, unsigned flags, in do_tmpfile() argument
3451 int error = path_lookupat(nd, flags | LOOKUP_DIRECTORY, &path); in do_tmpfile()
3463 audit_inode(nd->name, child, 0); in do_tmpfile()
3477 static int do_o_path(struct nameidata *nd, unsigned flags, struct file *file) in do_o_path() argument
3480 int error = path_lookupat(nd, flags, &path); in do_o_path()
3482 audit_inode(nd->name, path.dentry, 0); in do_o_path()
3489 static struct file *path_openat(struct nameidata *nd, in path_openat() argument
3500 error = do_tmpfile(nd, flags, op, file); in path_openat()
3502 error = do_o_path(nd, flags, file); in path_openat()
3504 const char *s = path_init(nd, flags); in path_openat()
3505 while (!(error = link_path_walk(s, nd)) && in path_openat()
3506 (s = open_last_lookups(nd, file, op)) != NULL) in path_openat()
3509 error = do_open(nd, file, op); in path_openat()
3510 terminate_walk(nd); in path_openat()
3531 struct nameidata nd; in do_filp_open() local
3535 set_nameidata(&nd, dfd, pathname); in do_filp_open()
3536 filp = path_openat(&nd, op, flags | LOOKUP_RCU); in do_filp_open()
3538 filp = path_openat(&nd, op, flags); in do_filp_open()
3540 filp = path_openat(&nd, op, flags | LOOKUP_REVAL); in do_filp_open()
3548 struct nameidata nd; in do_file_open_root() local
3553 nd.root.mnt = mnt; in do_file_open_root()
3554 nd.root.dentry = dentry; in do_file_open_root()
3563 set_nameidata(&nd, -1, filename); in do_file_open_root()
3564 file = path_openat(&nd, op, flags | LOOKUP_RCU); in do_file_open_root()
3566 file = path_openat(&nd, op, flags); in do_file_open_root()
3568 file = path_openat(&nd, op, flags | LOOKUP_REVAL); in do_file_open_root()