Lines Matching refs:path
611 void path_get(const struct path *path) in path_get() argument
613 mntget(path->mnt); in path_get()
614 dget(path->dentry); in path_get()
624 void path_put(const struct path *path) in path_put() argument
626 dput(path->dentry); in path_put()
627 mntput(path->mnt); in path_put()
633 struct path path; member
635 struct path root;
643 struct path link;
669 p->path.mnt = NULL; in __set_nameidata()
670 p->path.dentry = NULL; in __set_nameidata()
677 const struct path *root) in set_nameidata()
752 path_put(&nd->path); in terminate_walk()
763 nd->path.mnt = NULL; in terminate_walk()
764 nd->path.dentry = NULL; in terminate_walk()
768 static bool __legitimize_path(struct path *path, unsigned seq, unsigned mseq) in __legitimize_path() argument
770 int res = __legitimize_mnt(path->mnt, mseq); in __legitimize_path()
773 path->mnt = NULL; in __legitimize_path()
774 path->dentry = NULL; in __legitimize_path()
777 if (unlikely(!lockref_get_not_dead(&path->dentry->d_lockref))) { in __legitimize_path()
778 path->dentry = NULL; in __legitimize_path()
781 return !read_seqcount_retry(&path->dentry->d_seq, seq); in __legitimize_path()
785 struct path *path, unsigned seq) in legitimize_path() argument
787 return __legitimize_path(path, seq, nd->m_seq); in legitimize_path()
842 struct dentry *parent = nd->path.dentry; in try_to_unlazy()
848 if (unlikely(!legitimize_path(nd, &nd->path, nd->seq))) in try_to_unlazy()
857 nd->path.mnt = NULL; in try_to_unlazy()
858 nd->path.dentry = NULL; in try_to_unlazy()
883 res = __legitimize_mnt(nd->path.mnt, nd->m_seq); in try_to_unlazy_next()
889 if (unlikely(!lockref_get_not_dead(&nd->path.dentry->d_lockref))) in try_to_unlazy_next()
913 nd->path.mnt = NULL; in try_to_unlazy_next()
915 nd->path.dentry = NULL; in try_to_unlazy_next()
946 struct dentry *dentry = nd->path.dentry; in complete_walk()
979 if (!path_is_under(&nd->path, &nd->root)) in complete_walk()
1032 if (nd->path.mnt != NULL && nd->path.mnt != nd->root.mnt) in nd_jump_root()
1042 nd->path = nd->root; in nd_jump_root()
1043 d = nd->path.dentry; in nd_jump_root()
1049 path_put(&nd->path); in nd_jump_root()
1050 nd->path = nd->root; in nd_jump_root()
1051 path_get(&nd->path); in nd_jump_root()
1052 nd->inode = nd->path.dentry->d_inode; in nd_jump_root()
1062 int nd_jump_link(const struct path *path) in nd_jump_link() argument
1072 if (nd->path.mnt != path->mnt) in nd_jump_link()
1079 path_put(&nd->path); in nd_jump_link()
1080 nd->path = *path; in nd_jump_link()
1081 nd->inode = nd->path.dentry->d_inode; in nd_jump_link()
1086 path_put(path); in nd_jump_link()
1176 idmap = mnt_idmap(nd->path.mnt); in may_follow_link()
1254 int may_linkat(struct mnt_idmap *idmap, const struct path *link) in may_linkat()
1359 int follow_up(struct path *path) in follow_up() argument
1361 struct mount *mnt = real_mount(path->mnt); in follow_up()
1374 dput(path->dentry); in follow_up()
1375 path->dentry = mountpoint; in follow_up()
1376 mntput(path->mnt); in follow_up()
1377 path->mnt = &parent->mnt; in follow_up()
1382 static bool choose_mountpoint_rcu(struct mount *m, const struct path *root, in choose_mountpoint_rcu()
1383 struct path *path, unsigned *seqp) in choose_mountpoint_rcu() argument
1393 path->mnt = &m->mnt; in choose_mountpoint_rcu()
1394 path->dentry = mountpoint; in choose_mountpoint_rcu()
1402 static bool choose_mountpoint(struct mount *m, const struct path *root, in choose_mountpoint()
1403 struct path *path) in choose_mountpoint() argument
1411 found = choose_mountpoint_rcu(m, root, path, &seq); in choose_mountpoint()
1416 if (likely(__legitimize_path(path, seq, mseq))) in choose_mountpoint()
1419 path_put(path); in choose_mountpoint()
1432 static int follow_automount(struct path *path, int *count, unsigned lookup_flags) in follow_automount() argument
1434 struct dentry *dentry = path->dentry; in follow_automount()
1455 return finish_automount(dentry->d_op->d_automount(path), path); in follow_automount()
1464 static int __traverse_mounts(struct path *path, unsigned flags, bool *jumped, in __traverse_mounts() argument
1467 struct vfsmount *mnt = path->mnt; in __traverse_mounts()
1475 ret = path->dentry->d_op->d_manage(path, false); in __traverse_mounts()
1476 flags = smp_load_acquire(&path->dentry->d_flags); in __traverse_mounts()
1482 struct vfsmount *mounted = lookup_mnt(path); in __traverse_mounts()
1484 dput(path->dentry); in __traverse_mounts()
1486 mntput(path->mnt); in __traverse_mounts()
1487 path->mnt = mounted; in __traverse_mounts()
1488 path->dentry = dget(mounted->mnt_root); in __traverse_mounts()
1490 flags = path->dentry->d_flags; in __traverse_mounts()
1500 ret = follow_automount(path, count, lookup_flags); in __traverse_mounts()
1501 flags = smp_load_acquire(&path->dentry->d_flags); in __traverse_mounts()
1509 if (need_mntput && path->mnt == mnt) in __traverse_mounts()
1510 mntput(path->mnt); in __traverse_mounts()
1517 static inline int traverse_mounts(struct path *path, bool *jumped, in traverse_mounts() argument
1520 unsigned flags = smp_load_acquire(&path->dentry->d_flags); in traverse_mounts()
1529 return __traverse_mounts(path, flags, jumped, count, lookup_flags); in traverse_mounts()
1532 int follow_down_one(struct path *path) in follow_down_one() argument
1536 mounted = lookup_mnt(path); in follow_down_one()
1538 dput(path->dentry); in follow_down_one()
1539 mntput(path->mnt); in follow_down_one()
1540 path->mnt = mounted; in follow_down_one()
1541 path->dentry = dget(mounted->mnt_root); in follow_down_one()
1553 int follow_down(struct path *path, unsigned int flags) in follow_down() argument
1555 struct vfsmount *mnt = path->mnt; in follow_down()
1557 int ret = traverse_mounts(path, &jumped, NULL, flags); in follow_down()
1559 if (path->mnt != mnt) in follow_down()
1569 static bool __follow_mount_rcu(struct nameidata *nd, struct path *path) in __follow_mount_rcu() argument
1571 struct dentry *dentry = path->dentry; in __follow_mount_rcu()
1586 int res = dentry->d_op->d_manage(path, true); in __follow_mount_rcu()
1593 struct mount *mounted = __lookup_mnt(path->mnt, dentry); in __follow_mount_rcu()
1595 path->mnt = &mounted->mnt; in __follow_mount_rcu()
1596 dentry = path->dentry = mounted->mnt.mnt_root; in __follow_mount_rcu()
1614 struct path *path) in handle_mounts() argument
1619 path->mnt = nd->path.mnt; in handle_mounts()
1620 path->dentry = dentry; in handle_mounts()
1623 if (likely(__follow_mount_rcu(nd, path))) in handle_mounts()
1626 path->mnt = nd->path.mnt; in handle_mounts()
1627 path->dentry = dentry; in handle_mounts()
1632 ret = traverse_mounts(path, &jumped, &nd->total_link_count, nd->flags); in handle_mounts()
1640 dput(path->dentry); in handle_mounts()
1641 if (path->mnt != nd->path.mnt) in handle_mounts()
1642 mntput(path->mnt); in handle_mounts()
1733 struct dentry *dentry, *parent = nd->path.dentry; in lookup_fast()
1854 static int reserve_stack(struct nameidata *nd, struct path *link) in reserve_stack()
1882 static const char *pick_link(struct nameidata *nd, struct path *link, in pick_link()
1965 struct path path; in step_into() local
1967 int err = handle_mounts(nd, dentry, &path); in step_into()
1971 inode = path.dentry->d_inode; in step_into()
1972 if (likely(!d_is_symlink(path.dentry)) || in step_into()
1977 if (read_seqcount_retry(&path.dentry->d_seq, nd->next_seq)) in step_into()
1982 dput(nd->path.dentry); in step_into()
1983 if (nd->path.mnt != path.mnt) in step_into()
1984 mntput(nd->path.mnt); in step_into()
1986 nd->path = path; in step_into()
1993 if (read_seqcount_retry(&path.dentry->d_seq, nd->next_seq)) in step_into()
1996 if (path.mnt == nd->path.mnt) in step_into()
1997 mntget(path.mnt); in step_into()
1999 return pick_link(nd, &path, inode, flags); in step_into()
2006 if (path_equal(&nd->path, &nd->root)) in follow_dotdot_rcu()
2008 if (unlikely(nd->path.dentry == nd->path.mnt->mnt_root)) { in follow_dotdot_rcu()
2009 struct path path; in follow_dotdot_rcu() local
2011 if (!choose_mountpoint_rcu(real_mount(nd->path.mnt), in follow_dotdot_rcu()
2012 &nd->root, &path, &seq)) in follow_dotdot_rcu()
2016 nd->path = path; in follow_dotdot_rcu()
2017 nd->inode = path.dentry->d_inode; in follow_dotdot_rcu()
2024 old = nd->path.dentry; in follow_dotdot_rcu()
2030 if (unlikely(!path_connected(nd->path.mnt, parent))) in follow_dotdot_rcu()
2039 return nd->path.dentry; in follow_dotdot_rcu()
2046 if (path_equal(&nd->path, &nd->root)) in follow_dotdot()
2048 if (unlikely(nd->path.dentry == nd->path.mnt->mnt_root)) { in follow_dotdot()
2049 struct path path; in follow_dotdot() local
2051 if (!choose_mountpoint(real_mount(nd->path.mnt), in follow_dotdot()
2052 &nd->root, &path)) in follow_dotdot()
2054 path_put(&nd->path); in follow_dotdot()
2055 nd->path = path; in follow_dotdot()
2056 nd->inode = path.dentry->d_inode; in follow_dotdot()
2061 parent = dget_parent(nd->path.dentry); in follow_dotdot()
2062 if (unlikely(!path_connected(nd->path.mnt, parent))) { in follow_dotdot()
2071 return dget(nd->path.dentry); in follow_dotdot()
2129 dentry = lookup_slow(&nd->last, nd->path.dentry, nd->flags); in walk_component()
2297 unsigned long a, b, x, y = (unsigned long)nd->path.dentry; in hash_name()
2384 unsigned long hash = init_name_hash(nd->path.dentry); in hash_name()
2444 idmap = mnt_idmap(nd->path.mnt); in link_path_walk()
2466 struct dentry *parent = nd->path.dentry; in link_path_walk()
2507 if (unlikely(!d_can_lookup(nd->path.dentry))) { in link_path_walk()
2546 nd->path = nd->root; in path_init()
2549 nd->seq = read_seqcount_begin(&nd->path.dentry->d_seq); in path_init()
2552 path_get(&nd->path); in path_init()
2575 nd->path = fs->pwd; in path_init()
2576 nd->inode = nd->path.dentry->d_inode; in path_init()
2577 nd->seq = __read_seqcount_begin(&nd->path.dentry->d_seq); in path_init()
2580 get_fs_pwd(current->fs, &nd->path); in path_init()
2581 nd->inode = nd->path.dentry->d_inode; in path_init()
2602 nd->path = fd_file(f)->f_path; in path_init()
2604 nd->inode = nd->path.dentry->d_inode; in path_init()
2605 nd->seq = read_seqcount_begin(&nd->path.dentry->d_seq); in path_init()
2607 path_get(&nd->path); in path_init()
2608 nd->inode = nd->path.dentry->d_inode; in path_init()
2614 nd->root = nd->path; in path_init()
2636 dget(nd->path.dentry); in handle_lookup_down()
2638 return PTR_ERR(step_into(nd, WALK_NOFOLLOW, nd->path.dentry)); in handle_lookup_down()
2642 static int path_lookupat(struct nameidata *nd, unsigned flags, struct path *path) in path_lookupat() argument
2664 if (!d_can_lookup(nd->path.dentry)) in path_lookupat()
2667 *path = nd->path; in path_lookupat()
2668 nd->path.mnt = NULL; in path_lookupat()
2669 nd->path.dentry = NULL; in path_lookupat()
2676 struct path *path, struct path *root) in filename_lookup() argument
2683 retval = path_lookupat(&nd, flags | LOOKUP_RCU, path); in filename_lookup()
2685 retval = path_lookupat(&nd, flags, path); in filename_lookup()
2687 retval = path_lookupat(&nd, flags | LOOKUP_REVAL, path); in filename_lookup()
2690 audit_inode(name, path->dentry, in filename_lookup()
2698 struct path *parent) in path_parentat()
2705 *parent = nd->path; in path_parentat()
2706 nd->path.mnt = NULL; in path_parentat()
2707 nd->path.dentry = NULL; in path_parentat()
2715 unsigned int flags, struct path *parent, in __filename_parentat()
2717 const struct path *root) in __filename_parentat()
2740 unsigned int flags, struct path *parent, in filename_parentat()
2747 static struct dentry *__kern_path_locked(int dfd, struct filename *name, struct path *path) in __kern_path_locked() argument
2749 struct path parent_path __free(path_put) = {}; in __kern_path_locked()
2765 path->dentry = no_free_ptr(parent_path.dentry); in __kern_path_locked()
2766 path->mnt = no_free_ptr(parent_path.mnt); in __kern_path_locked()
2770 struct dentry *kern_path_locked_negative(const char *name, struct path *path) in kern_path_locked_negative() argument
2772 struct path parent_path __free(path_put) = {}; in kern_path_locked_negative()
2789 path->dentry = no_free_ptr(parent_path.dentry); in kern_path_locked_negative()
2790 path->mnt = no_free_ptr(parent_path.mnt); in kern_path_locked_negative()
2794 struct dentry *kern_path_locked(const char *name, struct path *path) in kern_path_locked() argument
2797 struct dentry *res = __kern_path_locked(AT_FDCWD, filename, path); in kern_path_locked()
2803 struct dentry *user_path_locked_at(int dfd, const char __user *name, struct path *path) in user_path_locked_at() argument
2806 struct dentry *res = __kern_path_locked(dfd, filename, path); in user_path_locked_at()
2813 int kern_path(const char *name, unsigned int flags, struct path *path) in kern_path() argument
2816 int ret = filename_lookup(AT_FDCWD, filename, flags, path, NULL); in kern_path()
2834 struct path *parent, struct qstr *last, int *type, in vfs_path_parent_lookup()
2835 const struct path *root) in vfs_path_parent_lookup()
2852 struct path *path) in vfs_path_lookup() argument
2855 struct path root = {.mnt = mnt, .dentry = dentry}; in vfs_path_lookup()
2860 ret = filename_lookup(AT_FDCWD, filename, flags, path, &root); in vfs_path_lookup()
3097 int path_pts(struct path *path) in path_pts() argument
3102 struct dentry *parent = dget_parent(path->dentry); in path_pts()
3106 if (unlikely(!path_connected(path->mnt, parent))) { in path_pts()
3110 dput(path->dentry); in path_pts()
3111 path->dentry = parent; in path_pts()
3116 path->dentry = child; in path_pts()
3118 follow_down(path, 0); in path_pts()
3124 struct path *path) in user_path_at() argument
3127 int ret = filename_lookup(dfd, filename, flags, path, NULL); in user_path_at()
3433 bool may_open_dev(const struct path *path) in may_open_dev() argument
3435 return !(path->mnt->mnt_flags & MNT_NODEV) && in may_open_dev()
3436 !(path->mnt->mnt_sb->s_iflags & SB_I_NODEV); in may_open_dev()
3439 static int may_open(struct mnt_idmap *idmap, const struct path *path, in may_open() argument
3442 struct dentry *dentry = path->dentry; in may_open()
3460 if (!may_open_dev(path)) in may_open()
3470 if ((acc_mode & MAY_EXEC) && path_noexec(path)) in may_open()
3500 const struct path *path = &filp->f_path; in handle_truncate() local
3501 struct inode *inode = path->dentry->d_inode; in handle_truncate()
3508 error = do_truncate(idmap, path->dentry, 0, in handle_truncate()
3524 const struct path *dir, struct dentry *dentry, in may_o_create()
3560 struct inode *dir = nd->path.dentry->d_inode; in atomic_open()
3567 file->f_path.mnt = nd->path.mnt; in atomic_open()
3615 struct dentry *dir = nd->path.dentry; in lookup_open()
3665 idmap = mnt_idmap(nd->path.mnt); in lookup_open()
3671 create_error = may_o_create(idmap, &nd->path, in lookup_open()
3763 struct dentry *dir = nd->path.dentry; in open_last_lookups()
3796 got_write = !mnt_want_write(nd->path.mnt); in open_last_lookups()
3820 mnt_drop_write(nd->path.mnt); in open_last_lookups()
3826 dput(nd->path.dentry); in open_last_lookups()
3827 nd->path.dentry = dentry; in open_last_lookups()
3858 audit_inode(nd->name, nd->path.dentry, 0); in do_open()
3859 idmap = mnt_idmap(nd->path.mnt); in do_open()
3863 if (d_is_dir(nd->path.dentry)) in do_open()
3866 d_backing_inode(nd->path.dentry)); in do_open()
3870 if ((nd->flags & LOOKUP_DIRECTORY) && !d_can_lookup(nd->path.dentry)) in do_open()
3879 } else if (d_is_reg(nd->path.dentry) && open_flag & O_TRUNC) { in do_open()
3880 error = mnt_want_write(nd->path.mnt); in do_open()
3885 error = may_open(idmap, &nd->path, acc_mode, open_flag); in do_open()
3887 error = vfs_open(&nd->path, file); in do_open()
3897 mnt_drop_write(nd->path.mnt); in do_open()
3917 const struct path *parentpath, in vfs_tmpfile()
3971 const struct path *parentpath, in kernel_tmpfile_open()
3995 struct path path; in do_tmpfile() local
3996 int error = path_lookupat(nd, flags | LOOKUP_DIRECTORY, &path); in do_tmpfile()
4000 error = mnt_want_write(path.mnt); in do_tmpfile()
4003 error = vfs_tmpfile(mnt_idmap(path.mnt), &path, file, op->mode); in do_tmpfile()
4008 mnt_drop_write(path.mnt); in do_tmpfile()
4010 path_put(&path); in do_tmpfile()
4016 struct path path; in do_o_path() local
4017 int error = path_lookupat(nd, flags, &path); in do_o_path()
4019 audit_inode(nd->name, path.dentry, 0); in do_o_path()
4020 error = vfs_open(&path, file); in do_o_path()
4021 path_put(&path); in do_o_path()
4082 struct file *do_file_open_root(const struct path *root, in do_file_open_root()
4109 struct path *path, unsigned int lookup_flags) in filename_create() argument
4120 error = filename_parentat(dfd, name, reval_flag, path, &last, &type); in filename_create()
4132 err2 = mnt_want_write(path->mnt); in filename_create()
4139 inode_lock_nested(path->dentry->d_inode, I_MUTEX_PARENT); in filename_create()
4140 dentry = lookup_one_qstr_excl(&last, path->dentry, in filename_create()
4154 inode_unlock(path->dentry->d_inode); in filename_create()
4156 mnt_drop_write(path->mnt); in filename_create()
4158 path_put(path); in filename_create()
4163 struct path *path, unsigned int lookup_flags) in kern_path_create() argument
4166 struct dentry *res = filename_create(dfd, filename, path, lookup_flags); in kern_path_create()
4173 void done_path_create(struct path *path, struct dentry *dentry) in done_path_create() argument
4177 inode_unlock(path->dentry->d_inode); in done_path_create()
4178 mnt_drop_write(path->mnt); in done_path_create()
4179 path_put(path); in done_path_create()
4184 struct path *path, unsigned int lookup_flags) in user_path_create() argument
4187 struct dentry *res = filename_create(dfd, filename, path, lookup_flags); in user_path_create()
4264 struct path path; in do_mknodat() local
4272 dentry = filename_create(dfd, name, &path, lookup_flags); in do_mknodat()
4277 error = security_path_mknod(&path, dentry, in do_mknodat()
4278 mode_strip_umask(path.dentry->d_inode, mode), dev); in do_mknodat()
4282 idmap = mnt_idmap(path.mnt); in do_mknodat()
4285 error = vfs_create(idmap, path.dentry->d_inode, in do_mknodat()
4291 error = vfs_mknod(idmap, path.dentry->d_inode, in do_mknodat()
4295 error = vfs_mknod(idmap, path.dentry->d_inode, in do_mknodat()
4300 done_path_create(&path, dentry); in do_mknodat()
4386 struct path path; in do_mkdirat() local
4391 dentry = filename_create(dfd, name, &path, lookup_flags); in do_mkdirat()
4396 error = security_path_mkdir(&path, dentry, in do_mkdirat()
4397 mode_strip_umask(path.dentry->d_inode, mode)); in do_mkdirat()
4399 dentry = vfs_mkdir(mnt_idmap(path.mnt), path.dentry->d_inode, in do_mkdirat()
4404 done_path_create(&path, dentry); in do_mkdirat()
4483 struct path path; in do_rmdir() local
4488 error = filename_parentat(dfd, name, lookup_flags, &path, &last, &type); in do_rmdir()
4504 error = mnt_want_write(path.mnt); in do_rmdir()
4508 inode_lock_nested(path.dentry->d_inode, I_MUTEX_PARENT); in do_rmdir()
4509 dentry = lookup_one_qstr_excl(&last, path.dentry, lookup_flags); in do_rmdir()
4513 error = security_path_rmdir(&path, dentry); in do_rmdir()
4516 error = vfs_rmdir(mnt_idmap(path.mnt), path.dentry->d_inode, dentry); in do_rmdir()
4520 inode_unlock(path.dentry->d_inode); in do_rmdir()
4521 mnt_drop_write(path.mnt); in do_rmdir()
4523 path_put(&path); in do_rmdir()
4618 struct path path; in do_unlinkat() local
4625 error = filename_parentat(dfd, name, lookup_flags, &path, &last, &type); in do_unlinkat()
4633 error = mnt_want_write(path.mnt); in do_unlinkat()
4637 inode_lock_nested(path.dentry->d_inode, I_MUTEX_PARENT); in do_unlinkat()
4638 dentry = lookup_one_qstr_excl(&last, path.dentry, lookup_flags); in do_unlinkat()
4647 error = security_path_unlink(&path, dentry); in do_unlinkat()
4650 error = vfs_unlink(mnt_idmap(path.mnt), path.dentry->d_inode, in do_unlinkat()
4655 inode_unlock(path.dentry->d_inode); in do_unlinkat()
4664 mnt_drop_write(path.mnt); in do_unlinkat()
4666 path_put(&path); in do_unlinkat()
4741 struct path path; in do_symlinkat() local
4749 dentry = filename_create(newdfd, to, &path, lookup_flags); in do_symlinkat()
4754 error = security_path_symlink(&path, dentry, from->name); in do_symlinkat()
4756 error = vfs_symlink(mnt_idmap(path.mnt), path.dentry->d_inode, in do_symlinkat()
4758 done_path_create(&path, dentry); in do_symlinkat()
4883 struct path old_path, new_path; in do_linkat()
5174 struct path old_path, new_path; in do_renameat2()