Lines Matching +full:2 +full:nd
501 #define EMBEDDED_LEVELS 2
527 #define ND_ROOT_GRABBED 2
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->state & ND_ROOT_GRABBED) { in terminate_walk()
602 path_put(&nd->root); in terminate_walk()
603 nd->state &= ~ND_ROOT_GRABBED; in terminate_walk()
606 nd->flags &= ~LOOKUP_RCU; in terminate_walk()
609 nd->depth = 0; in terminate_walk()
629 static inline bool legitimize_path(struct nameidata *nd, in legitimize_path() argument
632 return __legitimize_path(path, seq, nd->m_seq); in legitimize_path()
635 static bool legitimize_links(struct nameidata *nd) in legitimize_links() argument
638 for (i = 0; i < nd->depth; i++) { in legitimize_links()
639 struct saved *last = nd->stack + i; in legitimize_links()
640 if (unlikely(!legitimize_path(nd, &last->link, last->seq))) { in legitimize_links()
641 drop_links(nd); in legitimize_links()
642 nd->depth = i + 1; in legitimize_links()
649 static bool legitimize_root(struct nameidata *nd) in legitimize_root() argument
652 * For scoped-lookups (where nd->root has been zeroed), we need to in legitimize_root()
654 * for these lookups (nd->dfd is the root, not the filesystem root). in legitimize_root()
656 if (!nd->root.mnt && (nd->flags & LOOKUP_IS_SCOPED)) in legitimize_root()
658 /* Nothing to do if nd->root is zero or is managed by the VFS user. */ in legitimize_root()
659 if (!nd->root.mnt || (nd->state & ND_ROOT_PRESET)) in legitimize_root()
661 nd->state |= ND_ROOT_GRABBED; in legitimize_root()
662 return legitimize_path(nd, &nd->root, nd->root_seq); in legitimize_root()
666 * Path walking has 2 modes, rcu-walk and ref-walk (see
678 * @nd: nameidata pathwalk data
681 * try_to_unlazy attempts to legitimize the current nd->path and nd->root
687 static bool try_to_unlazy(struct nameidata *nd) in try_to_unlazy() argument
689 struct dentry *parent = nd->path.dentry; in try_to_unlazy()
691 BUG_ON(!(nd->flags & LOOKUP_RCU)); in try_to_unlazy()
693 nd->flags &= ~LOOKUP_RCU; in try_to_unlazy()
694 if (unlikely(!legitimize_links(nd))) in try_to_unlazy()
696 if (unlikely(!legitimize_path(nd, &nd->path, nd->seq))) in try_to_unlazy()
698 if (unlikely(!legitimize_root(nd))) in try_to_unlazy()
701 BUG_ON(nd->inode != parent->d_inode); in try_to_unlazy()
705 nd->path.mnt = NULL; in try_to_unlazy()
706 nd->path.dentry = NULL; in try_to_unlazy()
714 * @nd: nameidata pathwalk data
715 * @dentry: child of nd->path.dentry
719 * unlazy_child attempts to legitimize the current nd->path, nd->root and dentry
721 * @nd. Must be called from rcu-walk context.
725 static int unlazy_child(struct nameidata *nd, struct dentry *dentry, unsigned seq) in unlazy_child() argument
727 BUG_ON(!(nd->flags & LOOKUP_RCU)); in unlazy_child()
729 nd->flags &= ~LOOKUP_RCU; in unlazy_child()
730 if (unlikely(!legitimize_links(nd))) in unlazy_child()
732 if (unlikely(!legitimize_mnt(nd->path.mnt, nd->m_seq))) in unlazy_child()
734 if (unlikely(!lockref_get_not_dead(&nd->path.dentry->d_lockref))) in unlazy_child()
752 if (unlikely(!legitimize_root(nd))) in unlazy_child()
758 nd->path.mnt = NULL; in unlazy_child()
760 nd->path.dentry = NULL; in unlazy_child()
780 * @nd: pointer nameidata
782 * If we had been in RCU mode, drop out of it and legitimize nd->path.
786 * need to drop nd->path.
788 static int complete_walk(struct nameidata *nd) in complete_walk() argument
790 struct dentry *dentry = nd->path.dentry; in complete_walk()
793 if (nd->flags & LOOKUP_RCU) { in complete_walk()
795 * We don't want to zero nd->root for scoped-lookups or in complete_walk()
796 * externally-managed nd->root. in complete_walk()
798 if (!(nd->state & ND_ROOT_PRESET)) in complete_walk()
799 if (!(nd->flags & LOOKUP_IS_SCOPED)) in complete_walk()
800 nd->root.mnt = NULL; in complete_walk()
801 if (!try_to_unlazy(nd)) in complete_walk()
805 if (unlikely(nd->flags & LOOKUP_IS_SCOPED)) { in complete_walk()
822 if (!path_is_under(&nd->path, &nd->root)) in complete_walk()
826 if (likely(!(nd->state & ND_JUMPED))) in complete_walk()
832 status = dentry->d_op->d_weak_revalidate(dentry, nd->flags); in complete_walk()
842 static int set_root(struct nameidata *nd) in set_root() argument
851 if (WARN_ON(nd->flags & LOOKUP_IS_SCOPED)) in set_root()
854 if (nd->flags & LOOKUP_RCU) { in set_root()
859 nd->root = fs->root; in set_root()
860 nd->root_seq = __read_seqcount_begin(&nd->root.dentry->d_seq); in set_root()
863 get_fs_root(fs, &nd->root); in set_root()
864 nd->state |= ND_ROOT_GRABBED; in set_root()
869 static int nd_jump_root(struct nameidata *nd) in nd_jump_root() argument
871 if (unlikely(nd->flags & LOOKUP_BENEATH)) in nd_jump_root()
873 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) { in nd_jump_root()
875 if (nd->path.mnt != NULL && nd->path.mnt != nd->root.mnt) in nd_jump_root()
878 if (!nd->root.mnt) { in nd_jump_root()
879 int error = set_root(nd); in nd_jump_root()
883 if (nd->flags & LOOKUP_RCU) { in nd_jump_root()
885 nd->path = nd->root; in nd_jump_root()
886 d = nd->path.dentry; in nd_jump_root()
887 nd->inode = d->d_inode; in nd_jump_root()
888 nd->seq = nd->root_seq; in nd_jump_root()
889 if (unlikely(read_seqcount_retry(&d->d_seq, nd->seq))) in nd_jump_root()
892 path_put(&nd->path); in nd_jump_root()
893 nd->path = nd->root; in nd_jump_root()
894 path_get(&nd->path); in nd_jump_root()
895 nd->inode = nd->path.dentry->d_inode; in nd_jump_root()
897 nd->state |= ND_JUMPED; in nd_jump_root()
908 struct nameidata *nd = current->nameidata; in nd_jump_link() local
910 if (unlikely(nd->flags & LOOKUP_NO_MAGICLINKS)) in nd_jump_link()
914 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) { in nd_jump_link()
915 if (nd->path.mnt != path->mnt) in nd_jump_link()
919 if (unlikely(nd->flags & LOOKUP_IS_SCOPED)) in nd_jump_link()
922 path_put(&nd->path); in nd_jump_link()
923 nd->path = *path; in nd_jump_link()
924 nd->inode = nd->path.dentry->d_inode; in nd_jump_link()
925 nd->state |= ND_JUMPED; in nd_jump_link()
933 static inline void put_link(struct nameidata *nd) in put_link() argument
935 struct saved *last = nd->stack + --nd->depth; in put_link()
937 if (!(nd->flags & LOOKUP_RCU)) in put_link()
948 * @nd: nameidata pathwalk data
961 static inline int may_follow_link(struct nameidata *nd, const struct inode *inode) in may_follow_link() argument
971 if ((nd->dir_mode & (S_ISVTX|S_IWOTH)) != (S_ISVTX|S_IWOTH)) in may_follow_link()
975 if (uid_valid(nd->dir_uid) && uid_eq(nd->dir_uid, inode->i_uid)) in may_follow_link()
978 if (nd->flags & LOOKUP_RCU) in may_follow_link()
981 audit_inode(nd->name, nd->stack[0].link.dentry, 0); in may_follow_link()
1069 * If the sysctl_protected_fifos (or sysctl_protected_regular) is set to 2
1087 ((sysctl_protected_fifos >= 2 && S_ISFIFO(inode->i_mode)) || in may_create_in_sticky()
1088 (sysctl_protected_regular >= 2 && S_ISREG(inode->i_mode))))) { in may_create_in_sticky()
1318 static bool __follow_mount_rcu(struct nameidata *nd, struct path *path, in __follow_mount_rcu() argument
1327 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) in __follow_mount_rcu()
1347 nd->state |= ND_JUMPED; in __follow_mount_rcu()
1359 if (read_seqretry(&mount_lock, nd->m_seq)) in __follow_mount_rcu()
1366 static inline int handle_mounts(struct nameidata *nd, struct dentry *dentry, in handle_mounts() argument
1373 path->mnt = nd->path.mnt; in handle_mounts()
1375 if (nd->flags & LOOKUP_RCU) { in handle_mounts()
1379 if (likely(__follow_mount_rcu(nd, path, inode, seqp))) in handle_mounts()
1381 if (unlazy_child(nd, dentry, seq)) in handle_mounts()
1384 path->mnt = nd->path.mnt; in handle_mounts()
1387 ret = traverse_mounts(path, &jumped, &nd->total_link_count, nd->flags); in handle_mounts()
1389 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) in handle_mounts()
1392 nd->state |= ND_JUMPED; in handle_mounts()
1396 if (path->mnt != nd->path.mnt) in handle_mounts()
1459 static struct dentry *lookup_fast(struct nameidata *nd, in lookup_fast() argument
1463 struct dentry *dentry, *parent = nd->path.dentry; in lookup_fast()
1471 if (nd->flags & LOOKUP_RCU) { in lookup_fast()
1473 dentry = __d_lookup_rcu(parent, &nd->last, &seq); in lookup_fast()
1475 if (!try_to_unlazy(nd)) in lookup_fast()
1495 if (unlikely(__read_seqcount_retry(&parent->d_seq, nd->seq))) in lookup_fast()
1499 status = d_revalidate(dentry, nd->flags); in lookup_fast()
1502 if (unlazy_child(nd, dentry, seq)) in lookup_fast()
1506 status = d_revalidate(dentry, nd->flags); in lookup_fast()
1508 dentry = __d_lookup(parent, &nd->last); in lookup_fast()
1511 status = d_revalidate(dentry, nd->flags); in lookup_fast()
1572 static inline int may_lookup(struct nameidata *nd) in may_lookup() argument
1574 if (nd->flags & LOOKUP_RCU) { in may_lookup()
1575 int err = inode_permission(nd->inode, MAY_EXEC|MAY_NOT_BLOCK); in may_lookup()
1576 if (err != -ECHILD || !try_to_unlazy(nd)) in may_lookup()
1579 return inode_permission(nd->inode, MAY_EXEC); in may_lookup()
1582 static int reserve_stack(struct nameidata *nd, struct path *link, unsigned seq) in reserve_stack() argument
1584 if (unlikely(nd->total_link_count++ >= MAXSYMLINKS)) in reserve_stack()
1587 if (likely(nd->depth != EMBEDDED_LEVELS)) in reserve_stack()
1589 if (likely(nd->stack != nd->internal)) in reserve_stack()
1591 if (likely(nd_alloc_stack(nd))) in reserve_stack()
1594 if (nd->flags & LOOKUP_RCU) { in reserve_stack()
1597 bool grabbed_link = legitimize_path(nd, link, seq); in reserve_stack()
1599 if (!try_to_unlazy(nd) != 0 || !grabbed_link) in reserve_stack()
1602 if (nd_alloc_stack(nd)) in reserve_stack()
1608 enum {WALK_TRAILING = 1, WALK_MORE = 2, WALK_NOFOLLOW = 4};
1610 static const char *pick_link(struct nameidata *nd, struct path *link, in pick_link() argument
1615 int error = reserve_stack(nd, link, seq); in pick_link()
1618 if (!(nd->flags & LOOKUP_RCU)) in pick_link()
1622 last = nd->stack + nd->depth++; in pick_link()
1628 error = may_follow_link(nd, inode); in pick_link()
1633 if (unlikely(nd->flags & LOOKUP_NO_SYMLINKS) || in pick_link()
1637 if (!(nd->flags & LOOKUP_RCU)) { in pick_link()
1641 if (!try_to_unlazy(nd)) in pick_link()
1647 nd->flags & LOOKUP_RCU); in pick_link()
1656 if (nd->flags & LOOKUP_RCU) { in pick_link()
1658 if (res == ERR_PTR(-ECHILD) && try_to_unlazy(nd)) in pick_link()
1669 error = nd_jump_root(nd); in pick_link()
1678 put_link(nd); in pick_link()
1688 static const char *step_into(struct nameidata *nd, int flags, in step_into() argument
1692 int err = handle_mounts(nd, dentry, &path, &inode, &seq); in step_into()
1697 ((flags & WALK_TRAILING) && !(nd->flags & LOOKUP_FOLLOW)) || in step_into()
1700 if (!(nd->flags & LOOKUP_RCU)) { in step_into()
1701 dput(nd->path.dentry); in step_into()
1702 if (nd->path.mnt != path.mnt) in step_into()
1703 mntput(nd->path.mnt); in step_into()
1705 nd->path = path; in step_into()
1706 nd->inode = inode; in step_into()
1707 nd->seq = seq; in step_into()
1710 if (nd->flags & LOOKUP_RCU) { in step_into()
1715 if (path.mnt == nd->path.mnt) in step_into()
1718 return pick_link(nd, &path, inode, seq, flags); in step_into()
1721 static struct dentry *follow_dotdot_rcu(struct nameidata *nd, in follow_dotdot_rcu() argument
1727 if (path_equal(&nd->path, &nd->root)) in follow_dotdot_rcu()
1729 if (unlikely(nd->path.dentry == nd->path.mnt->mnt_root)) { in follow_dotdot_rcu()
1732 if (!choose_mountpoint_rcu(real_mount(nd->path.mnt), in follow_dotdot_rcu()
1733 &nd->root, &path, &seq)) in follow_dotdot_rcu()
1735 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) in follow_dotdot_rcu()
1737 nd->path = path; in follow_dotdot_rcu()
1738 nd->inode = path.dentry->d_inode; in follow_dotdot_rcu()
1739 nd->seq = seq; in follow_dotdot_rcu()
1740 if (unlikely(read_seqretry(&mount_lock, nd->m_seq))) in follow_dotdot_rcu()
1744 old = nd->path.dentry; in follow_dotdot_rcu()
1748 if (unlikely(read_seqcount_retry(&old->d_seq, nd->seq))) in follow_dotdot_rcu()
1750 if (unlikely(!path_connected(nd->path.mnt, parent))) in follow_dotdot_rcu()
1754 if (unlikely(read_seqretry(&mount_lock, nd->m_seq))) in follow_dotdot_rcu()
1756 if (unlikely(nd->flags & LOOKUP_BENEATH)) in follow_dotdot_rcu()
1761 static struct dentry *follow_dotdot(struct nameidata *nd, in follow_dotdot() argument
1767 if (path_equal(&nd->path, &nd->root)) in follow_dotdot()
1769 if (unlikely(nd->path.dentry == nd->path.mnt->mnt_root)) { in follow_dotdot()
1772 if (!choose_mountpoint(real_mount(nd->path.mnt), in follow_dotdot()
1773 &nd->root, &path)) in follow_dotdot()
1775 path_put(&nd->path); in follow_dotdot()
1776 nd->path = path; in follow_dotdot()
1777 nd->inode = path.dentry->d_inode; in follow_dotdot()
1778 if (unlikely(nd->flags & LOOKUP_NO_XDEV)) in follow_dotdot()
1782 parent = dget_parent(nd->path.dentry); in follow_dotdot()
1783 if (unlikely(!path_connected(nd->path.mnt, parent))) { in follow_dotdot()
1792 if (unlikely(nd->flags & LOOKUP_BENEATH)) in follow_dotdot()
1794 dget(nd->path.dentry); in follow_dotdot()
1798 static const char *handle_dots(struct nameidata *nd, int type) in handle_dots() argument
1806 if (!nd->root.mnt) { in handle_dots()
1807 error = ERR_PTR(set_root(nd)); in handle_dots()
1811 if (nd->flags & LOOKUP_RCU) in handle_dots()
1812 parent = follow_dotdot_rcu(nd, &inode, &seq); in handle_dots()
1814 parent = follow_dotdot(nd, &inode, &seq); in handle_dots()
1818 error = step_into(nd, WALK_NOFOLLOW, in handle_dots()
1819 nd->path.dentry, nd->inode, nd->seq); in handle_dots()
1821 error = step_into(nd, WALK_NOFOLLOW, in handle_dots()
1826 if (unlikely(nd->flags & LOOKUP_IS_SCOPED)) { in handle_dots()
1830 * above nd->root (and so userspace should retry or use in handle_dots()
1834 if (unlikely(__read_seqcount_retry(&mount_lock.seqcount, nd->m_seq))) in handle_dots()
1836 if (unlikely(__read_seqcount_retry(&rename_lock.seqcount, nd->r_seq))) in handle_dots()
1843 static const char *walk_component(struct nameidata *nd, int flags) in walk_component() argument
1853 if (unlikely(nd->last_type != LAST_NORM)) { in walk_component()
1854 if (!(flags & WALK_MORE) && nd->depth) in walk_component()
1855 put_link(nd); in walk_component()
1856 return handle_dots(nd, nd->last_type); in walk_component()
1858 dentry = lookup_fast(nd, &inode, &seq); in walk_component()
1862 dentry = lookup_slow(&nd->last, nd->path.dentry, nd->flags); in walk_component()
1866 if (!(flags & WALK_MORE) && nd->depth) in walk_component()
1867 put_link(nd); in walk_component()
1868 return step_into(nd, flags, dentry, inode, seq); in walk_component()
1906 * influence out to 2^6 = 64 state bits.
1909 * deltas or 64*63/2 = 2016 two-bit input deltas, and finding the
1918 * Input delta: 1-bit 2-bit
1920 * 2 rounds: 2753.7 140389.8
1924 * (64*128) (64*63/2 * 128)
1948 * Input delta: 1-bit 2-bit
1950 * 2 rounds: 1246.4 25475.4
1954 * (32*64) (32*31/2 * 64)
2104 * Returns 0 and nd will have valid dentry and mnt on success.
2107 static int link_path_walk(const char *name, struct nameidata *nd) in link_path_walk() argument
2109 int depth = 0; // depth <= nd->depth in link_path_walk()
2112 nd->last_type = LAST_ROOT; in link_path_walk()
2113 nd->flags |= LOOKUP_PARENT; in link_path_walk()
2127 err = may_lookup(nd); in link_path_walk()
2131 hash_len = hash_name(nd->path.dentry, name); in link_path_walk()
2135 case 2: in link_path_walk()
2138 nd->state |= ND_JUMPED; in link_path_walk()
2145 struct dentry *parent = nd->path.dentry; in link_path_walk()
2146 nd->state &= ~ND_JUMPED; in link_path_walk()
2157 nd->last.hash_len = hash_len; in link_path_walk()
2158 nd->last.name = name; in link_path_walk()
2159 nd->last_type = type; in link_path_walk()
2175 nd->dir_uid = nd->inode->i_uid; in link_path_walk()
2176 nd->dir_mode = nd->inode->i_mode; in link_path_walk()
2177 nd->flags &= ~LOOKUP_PARENT; in link_path_walk()
2181 name = nd->stack[--depth].name; in link_path_walk()
2182 link = walk_component(nd, 0); in link_path_walk()
2185 link = walk_component(nd, WALK_MORE); in link_path_walk()
2191 nd->stack[depth++].name = name; in link_path_walk()
2195 if (unlikely(!d_can_lookup(nd->path.dentry))) { in link_path_walk()
2196 if (nd->flags & LOOKUP_RCU) { in link_path_walk()
2197 if (!try_to_unlazy(nd)) in link_path_walk()
2206 static const char *path_init(struct nameidata *nd, unsigned flags) in path_init() argument
2209 const char *s = nd->name->name; in path_init()
2216 nd->flags = flags; in path_init()
2217 nd->state |= ND_JUMPED; in path_init()
2218 nd->depth = 0; in path_init()
2220 nd->m_seq = __read_seqcount_begin(&mount_lock.seqcount); in path_init()
2221 nd->r_seq = __read_seqcount_begin(&rename_lock.seqcount); in path_init()
2224 if (nd->state & ND_ROOT_PRESET) { in path_init()
2225 struct dentry *root = nd->root.dentry; in path_init()
2229 nd->path = nd->root; in path_init()
2230 nd->inode = inode; in path_init()
2232 nd->seq = read_seqcount_begin(&nd->path.dentry->d_seq); in path_init()
2233 nd->root_seq = nd->seq; in path_init()
2235 path_get(&nd->path); in path_init()
2240 nd->root.mnt = NULL; in path_init()
2241 nd->path.mnt = NULL; in path_init()
2242 nd->path.dentry = NULL; in path_init()
2244 /* Absolute pathname -- fetch the root (LOOKUP_IN_ROOT uses nd->dfd). */ in path_init()
2246 error = nd_jump_root(nd); in path_init()
2253 if (nd->dfd == AT_FDCWD) { in path_init()
2260 nd->path = fs->pwd; in path_init()
2261 nd->inode = nd->path.dentry->d_inode; in path_init()
2262 nd->seq = __read_seqcount_begin(&nd->path.dentry->d_seq); in path_init()
2265 get_fs_pwd(current->fs, &nd->path); in path_init()
2266 nd->inode = nd->path.dentry->d_inode; in path_init()
2270 struct fd f = fdget_raw(nd->dfd); in path_init()
2283 nd->path = f.file->f_path; in path_init()
2285 nd->inode = nd->path.dentry->d_inode; in path_init()
2286 nd->seq = read_seqcount_begin(&nd->path.dentry->d_seq); in path_init()
2288 path_get(&nd->path); in path_init()
2289 nd->inode = nd->path.dentry->d_inode; in path_init()
2296 nd->root = nd->path; in path_init()
2298 nd->root_seq = nd->seq; in path_init()
2300 path_get(&nd->root); in path_init()
2301 nd->state |= ND_ROOT_GRABBED; in path_init()
2307 static inline const char *lookup_last(struct nameidata *nd) in lookup_last() argument
2309 if (nd->last_type == LAST_NORM && nd->last.name[nd->last.len]) in lookup_last()
2310 nd->flags |= LOOKUP_FOLLOW | LOOKUP_DIRECTORY; in lookup_last()
2312 return walk_component(nd, WALK_TRAILING); in lookup_last()
2315 static int handle_lookup_down(struct nameidata *nd) in handle_lookup_down() argument
2317 if (!(nd->flags & LOOKUP_RCU)) in handle_lookup_down()
2318 dget(nd->path.dentry); in handle_lookup_down()
2319 return PTR_ERR(step_into(nd, WALK_NOFOLLOW, in handle_lookup_down()
2320 nd->path.dentry, nd->inode, nd->seq)); in handle_lookup_down()
2323 /* Returns 0 and nd will be valid on success; Retuns error, otherwise. */
2324 static int path_lookupat(struct nameidata *nd, unsigned flags, struct path *path) in path_lookupat() argument
2326 const char *s = path_init(nd, flags); in path_lookupat()
2330 err = handle_lookup_down(nd); in path_lookupat()
2335 while (!(err = link_path_walk(s, nd)) && in path_lookupat()
2336 (s = lookup_last(nd)) != NULL) in path_lookupat()
2338 if (!err && unlikely(nd->flags & LOOKUP_MOUNTPOINT)) { in path_lookupat()
2339 err = handle_lookup_down(nd); in path_lookupat()
2340 nd->state &= ~ND_JUMPED; // no d_weak_revalidate(), please... in path_lookupat()
2343 err = complete_walk(nd); in path_lookupat()
2345 if (!err && nd->flags & LOOKUP_DIRECTORY) in path_lookupat()
2346 if (!d_can_lookup(nd->path.dentry)) in path_lookupat()
2349 *path = nd->path; in path_lookupat()
2350 nd->path.mnt = NULL; in path_lookupat()
2351 nd->path.dentry = NULL; in path_lookupat()
2353 terminate_walk(nd); in path_lookupat()
2361 struct nameidata nd; in filename_lookup() local
2364 set_nameidata(&nd, dfd, name); in filename_lookup()
2366 nd.root = *root; in filename_lookup()
2367 nd.state = ND_ROOT_PRESET; in filename_lookup()
2369 retval = path_lookupat(&nd, flags | LOOKUP_RCU, path); in filename_lookup()
2371 retval = path_lookupat(&nd, flags, path); in filename_lookup()
2373 retval = path_lookupat(&nd, flags | LOOKUP_REVAL, path); in filename_lookup()
2383 /* Returns 0 and nd will be valid on success; Retuns error, otherwise. */
2384 static int path_parentat(struct nameidata *nd, unsigned flags, in path_parentat() argument
2387 const char *s = path_init(nd, flags); in path_parentat()
2388 int err = link_path_walk(s, nd); in path_parentat()
2390 err = complete_walk(nd); in path_parentat()
2392 *parent = nd->path; in path_parentat()
2393 nd->path.mnt = NULL; in path_parentat()
2394 nd->path.dentry = NULL; in path_parentat()
2396 terminate_walk(nd); in path_parentat()
2405 struct nameidata nd; in filename_parentat() local
2409 set_nameidata(&nd, dfd, name); in filename_parentat()
2410 retval = path_parentat(&nd, flags | LOOKUP_RCU, parent); in filename_parentat()
2412 retval = path_parentat(&nd, flags, parent); in filename_parentat()
2414 retval = path_parentat(&nd, flags | LOOKUP_REVAL, parent); in filename_parentat()
2416 *last = nd.last; in filename_parentat()
2417 *type = nd.last_type; in filename_parentat()
2490 if (len < 2 || (len == 2 && name[1] == '.')) in lookup_one_len_common()
2670 * 2. We should have write and exec permissions on dir
2730 * 2. We can't do it if dir is read-only (done in permission())
2959 static struct dentry *atomic_open(struct nameidata *nd, struct dentry *dentry, in atomic_open() argument
2964 struct inode *dir = nd->path.dentry->d_inode; in atomic_open()
2967 if (nd->flags & LOOKUP_DIRECTORY) in atomic_open()
2971 file->f_path.mnt = nd->path.mnt; in atomic_open()
3014 static struct dentry *lookup_open(struct nameidata *nd, struct file *file, in lookup_open() argument
3018 struct dentry *dir = nd->path.dentry; in lookup_open()
3030 dentry = d_lookup(dir, &nd->last); in lookup_open()
3033 dentry = d_alloc_parallel(dir, &nd->last, &wq); in lookup_open()
3040 error = d_revalidate(dentry, nd->flags); in lookup_open()
3071 create_error = may_o_create(&nd->path, dentry, mode); in lookup_open()
3078 dentry = atomic_open(nd, dentry, file, open_flag, mode); in lookup_open()
3086 nd->flags); in lookup_open()
3122 static const char *open_last_lookups(struct nameidata *nd, in open_last_lookups() argument
3125 struct dentry *dir = nd->path.dentry; in open_last_lookups()
3133 nd->flags |= op->intent; in open_last_lookups()
3135 if (nd->last_type != LAST_NORM) { in open_last_lookups()
3136 if (nd->depth) in open_last_lookups()
3137 put_link(nd); in open_last_lookups()
3138 return handle_dots(nd, nd->last_type); in open_last_lookups()
3142 if (nd->last.name[nd->last.len]) in open_last_lookups()
3143 nd->flags |= LOOKUP_FOLLOW | LOOKUP_DIRECTORY; in open_last_lookups()
3145 dentry = lookup_fast(nd, &inode, &seq); in open_last_lookups()
3151 BUG_ON(nd->flags & LOOKUP_RCU); in open_last_lookups()
3154 if (nd->flags & LOOKUP_RCU) { in open_last_lookups()
3155 if (!try_to_unlazy(nd)) in open_last_lookups()
3158 audit_inode(nd->name, dir, AUDIT_INODE_PARENT); in open_last_lookups()
3160 if (unlikely(nd->last.name[nd->last.len])) in open_last_lookups()
3165 got_write = !mnt_want_write(nd->path.mnt); in open_last_lookups()
3176 dentry = lookup_open(nd, file, op, got_write); in open_last_lookups()
3185 mnt_drop_write(nd->path.mnt); in open_last_lookups()
3191 dput(nd->path.dentry); in open_last_lookups()
3192 nd->path.dentry = dentry; in open_last_lookups()
3197 if (nd->depth) in open_last_lookups()
3198 put_link(nd); in open_last_lookups()
3199 res = step_into(nd, WALK_TRAILING, dentry, inode, seq); in open_last_lookups()
3201 nd->flags &= ~(LOOKUP_OPEN|LOOKUP_CREATE|LOOKUP_EXCL); in open_last_lookups()
3208 static int do_open(struct nameidata *nd, in do_open() argument
3217 error = complete_walk(nd); in do_open()
3222 audit_inode(nd->name, nd->path.dentry, 0); in do_open()
3226 if (d_is_dir(nd->path.dentry)) in do_open()
3228 error = may_create_in_sticky(nd->dir_mode, nd->dir_uid, in do_open()
3229 d_backing_inode(nd->path.dentry)); in do_open()
3233 if ((nd->flags & LOOKUP_DIRECTORY) && !d_can_lookup(nd->path.dentry)) in do_open()
3242 } else if (d_is_reg(nd->path.dentry) && open_flag & O_TRUNC) { in do_open()
3243 error = mnt_want_write(nd->path.mnt); in do_open()
3248 error = may_open(&nd->path, acc_mode, open_flag); in do_open()
3250 error = vfs_open(&nd->path, file); in do_open()
3260 mnt_drop_write(nd->path.mnt); in do_open()
3303 static int do_tmpfile(struct nameidata *nd, unsigned flags, in do_tmpfile() argument
3309 int error = path_lookupat(nd, flags | LOOKUP_DIRECTORY, &path); in do_tmpfile()
3321 audit_inode(nd->name, child, 0); in do_tmpfile()
3335 static int do_o_path(struct nameidata *nd, unsigned flags, struct file *file) in do_o_path() argument
3338 int error = path_lookupat(nd, flags, &path); in do_o_path()
3340 audit_inode(nd->name, path.dentry, 0); in do_o_path()
3347 static struct file *path_openat(struct nameidata *nd, in path_openat() argument
3358 error = do_tmpfile(nd, flags, op, file); in path_openat()
3360 error = do_o_path(nd, flags, file); in path_openat()
3362 const char *s = path_init(nd, flags); in path_openat()
3363 while (!(error = link_path_walk(s, nd)) && in path_openat()
3364 (s = open_last_lookups(nd, file, op)) != NULL) in path_openat()
3367 error = do_open(nd, file, op); in path_openat()
3368 terminate_walk(nd); in path_openat()
3389 struct nameidata nd; in do_filp_open() local
3393 set_nameidata(&nd, dfd, pathname); in do_filp_open()
3394 filp = path_openat(&nd, op, flags | LOOKUP_RCU); in do_filp_open()
3396 filp = path_openat(&nd, op, flags); in do_filp_open()
3398 filp = path_openat(&nd, op, flags | LOOKUP_REVAL); in do_filp_open()
3406 struct nameidata nd; in do_file_open_root() local
3418 set_nameidata(&nd, -1, filename); in do_file_open_root()
3419 nd.root = *root; in do_file_open_root()
3420 nd.state = ND_ROOT_PRESET; in do_file_open_root()
3421 file = path_openat(&nd, op, flags | LOOKUP_RCU); in do_file_open_root()
3423 file = path_openat(&nd, op, flags); in do_file_open_root()
3425 file = path_openat(&nd, op, flags | LOOKUP_REVAL); in do_file_open_root()
4214 * we'd better make sure that there's no link(2) for them.