Lines Matching refs:path
542 void path_get(const struct path *path) in path_get() argument
544 mntget(path->mnt); in path_get()
545 dget(path->dentry); in path_get()
555 void path_put(const struct path *path) in path_put() argument
557 dput(path->dentry); in path_put()
558 mntput(path->mnt); in path_put()
564 struct path path; member
566 struct path root;
574 struct path link;
598 p->path.mnt = NULL; in __set_nameidata()
599 p->path.dentry = NULL; in __set_nameidata()
606 const struct path *root) in set_nameidata()
672 path_put(&nd->path); in terminate_walk()
684 nd->path.mnt = NULL; in terminate_walk()
685 nd->path.dentry = NULL; in terminate_walk()
689 static bool __legitimize_path(struct path *path, unsigned seq, unsigned mseq) in __legitimize_path() argument
691 int res = __legitimize_mnt(path->mnt, mseq); in __legitimize_path()
694 path->mnt = NULL; in __legitimize_path()
695 path->dentry = NULL; in __legitimize_path()
698 if (unlikely(!lockref_get_not_dead(&path->dentry->d_lockref))) { in __legitimize_path()
699 path->dentry = NULL; in __legitimize_path()
702 return !read_seqcount_retry(&path->dentry->d_seq, seq); in __legitimize_path()
706 struct path *path, unsigned seq) in legitimize_path() argument
708 return __legitimize_path(path, seq, nd->m_seq); in legitimize_path()
770 struct dentry *parent = nd->path.dentry; in try_to_unlazy()
777 if (unlikely(!legitimize_path(nd, &nd->path, nd->seq))) in try_to_unlazy()
786 nd->path.mnt = NULL; in try_to_unlazy()
787 nd->path.dentry = NULL; in try_to_unlazy()
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()
839 nd->path.mnt = NULL; in try_to_unlazy_next()
841 nd->path.dentry = NULL; in try_to_unlazy_next()
871 struct dentry *dentry = nd->path.dentry; in complete_walk()
904 if (!path_is_under(&nd->path, &nd->root)) in complete_walk()
957 if (nd->path.mnt != NULL && nd->path.mnt != nd->root.mnt) in nd_jump_root()
967 nd->path = nd->root; in nd_jump_root()
968 d = nd->path.dentry; 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()
987 int nd_jump_link(struct path *path) in nd_jump_link() argument
997 if (nd->path.mnt != path->mnt) 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()
1011 path_put(path); in nd_jump_link()
1051 mnt_userns = mnt_user_ns(nd->path.mnt); in may_follow_link()
1129 int may_linkat(struct user_namespace *mnt_userns, struct path *link) in may_linkat()
1215 int follow_up(struct path *path) in follow_up() argument
1217 struct mount *mnt = real_mount(path->mnt); in follow_up()
1230 dput(path->dentry); in follow_up()
1231 path->dentry = mountpoint; in follow_up()
1232 mntput(path->mnt); in follow_up()
1233 path->mnt = &parent->mnt; in follow_up()
1238 static bool choose_mountpoint_rcu(struct mount *m, const struct path *root, in choose_mountpoint_rcu()
1239 struct path *path, unsigned *seqp) in choose_mountpoint_rcu() argument
1249 path->mnt = &m->mnt; in choose_mountpoint_rcu()
1250 path->dentry = mountpoint; in choose_mountpoint_rcu()
1258 static bool choose_mountpoint(struct mount *m, const struct path *root, in choose_mountpoint()
1259 struct path *path) in choose_mountpoint() argument
1267 found = choose_mountpoint_rcu(m, root, path, &seq); in choose_mountpoint()
1272 if (likely(__legitimize_path(path, seq, mseq))) in choose_mountpoint()
1275 path_put(path); in choose_mountpoint()
1288 static int follow_automount(struct path *path, int *count, unsigned lookup_flags) in follow_automount() argument
1290 struct dentry *dentry = path->dentry; in follow_automount()
1311 return finish_automount(dentry->d_op->d_automount(path), path); in follow_automount()
1320 static int __traverse_mounts(struct path *path, unsigned flags, bool *jumped, in __traverse_mounts() argument
1323 struct vfsmount *mnt = path->mnt; in __traverse_mounts()
1331 ret = path->dentry->d_op->d_manage(path, false); in __traverse_mounts()
1332 flags = smp_load_acquire(&path->dentry->d_flags); in __traverse_mounts()
1338 struct vfsmount *mounted = lookup_mnt(path); in __traverse_mounts()
1340 dput(path->dentry); in __traverse_mounts()
1342 mntput(path->mnt); in __traverse_mounts()
1343 path->mnt = mounted; in __traverse_mounts()
1344 path->dentry = dget(mounted->mnt_root); in __traverse_mounts()
1346 flags = path->dentry->d_flags; in __traverse_mounts()
1356 ret = follow_automount(path, count, lookup_flags); in __traverse_mounts()
1357 flags = smp_load_acquire(&path->dentry->d_flags); in __traverse_mounts()
1365 if (need_mntput && path->mnt == mnt) in __traverse_mounts()
1366 mntput(path->mnt); in __traverse_mounts()
1373 static inline int traverse_mounts(struct path *path, bool *jumped, in traverse_mounts() argument
1376 unsigned flags = smp_load_acquire(&path->dentry->d_flags); in traverse_mounts()
1385 return __traverse_mounts(path, flags, jumped, count, lookup_flags); in traverse_mounts()
1388 int follow_down_one(struct path *path) in follow_down_one() argument
1392 mounted = lookup_mnt(path); in follow_down_one()
1394 dput(path->dentry); in follow_down_one()
1395 mntput(path->mnt); in follow_down_one()
1396 path->mnt = mounted; in follow_down_one()
1397 path->dentry = dget(mounted->mnt_root); in follow_down_one()
1409 int follow_down(struct path *path) in follow_down() argument
1411 struct vfsmount *mnt = path->mnt; in follow_down()
1413 int ret = traverse_mounts(path, &jumped, NULL, 0); in follow_down()
1415 if (path->mnt != mnt) in follow_down()
1425 static bool __follow_mount_rcu(struct nameidata *nd, struct path *path, in __follow_mount_rcu() argument
1428 struct dentry *dentry = path->dentry; in __follow_mount_rcu()
1443 int res = dentry->d_op->d_manage(path, true); in __follow_mount_rcu()
1450 struct mount *mounted = __lookup_mnt(path->mnt, dentry); in __follow_mount_rcu()
1452 path->mnt = &mounted->mnt; in __follow_mount_rcu()
1453 dentry = path->dentry = mounted->mnt.mnt_root; in __follow_mount_rcu()
1474 struct path *path, struct inode **inode, in handle_mounts() argument
1480 path->mnt = nd->path.mnt; in handle_mounts()
1481 path->dentry = dentry; in handle_mounts()
1486 if (likely(__follow_mount_rcu(nd, path, inode, seqp))) in handle_mounts()
1491 path->mnt = nd->path.mnt; in handle_mounts()
1492 path->dentry = dentry; in handle_mounts()
1494 ret = traverse_mounts(path, &jumped, &nd->total_link_count, nd->flags); in handle_mounts()
1502 dput(path->dentry); in handle_mounts()
1503 if (path->mnt != nd->path.mnt) in handle_mounts()
1504 mntput(path->mnt); in handle_mounts()
1506 *inode = d_backing_inode(path->dentry); in handle_mounts()
1570 struct dentry *dentry, *parent = nd->path.dentry; in lookup_fast()
1690 static int reserve_stack(struct nameidata *nd, struct path *link, unsigned seq) in reserve_stack()
1718 static const char *pick_link(struct nameidata *nd, struct path *link, in pick_link()
1799 struct path path; in step_into() local
1800 int err = handle_mounts(nd, dentry, &path, &inode, &seq); in step_into()
1804 if (likely(!d_is_symlink(path.dentry)) || 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()
1820 if (read_seqcount_retry(&path.dentry->d_seq, seq)) in step_into()
1823 if (path.mnt == nd->path.mnt) in step_into()
1824 mntget(path.mnt); in step_into()
1826 return pick_link(nd, &path, inode, seq, flags); in step_into()
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()
1838 struct path path; in follow_dotdot_rcu() local
1840 if (!choose_mountpoint_rcu(real_mount(nd->path.mnt), in follow_dotdot_rcu()
1841 &nd->root, &path, &seq)) in follow_dotdot_rcu()
1845 nd->path = path; in follow_dotdot_rcu()
1846 nd->inode = path.dentry->d_inode; in follow_dotdot_rcu()
1852 old = nd->path.dentry; in follow_dotdot_rcu()
1858 if (unlikely(!path_connected(nd->path.mnt, parent))) in follow_dotdot_rcu()
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()
1878 struct path path; in follow_dotdot() local
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()
1890 parent = dget_parent(nd->path.dentry); in follow_dotdot()
1891 if (unlikely(!path_connected(nd->path.mnt, parent))) { in follow_dotdot()
1902 dget(nd->path.dentry); in follow_dotdot()
1927 nd->path.dentry, nd->inode, nd->seq); in handle_dots()
1970 dentry = lookup_slow(&nd->last, nd->path.dentry, nd->flags); in walk_component()
2238 mnt_userns = mnt_user_ns(nd->path.mnt); in link_path_walk()
2243 hash_len = hash_name(nd->path.dentry, name); in link_path_walk()
2257 struct dentry *parent = nd->path.dentry; in link_path_walk()
2307 if (unlikely(!d_can_lookup(nd->path.dentry))) { in link_path_walk()
2344 nd->path = nd->root; in path_init()
2347 nd->seq = read_seqcount_begin(&nd->path.dentry->d_seq); in path_init()
2350 path_get(&nd->path); 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()
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()
2431 dget(nd->path.dentry); 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
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()
2471 struct path *path, struct path *root) in filename_lookup() argument
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()
2485 audit_inode(name, path->dentry, in filename_lookup()
2493 struct path *parent) 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()
2510 unsigned int flags, struct path *parent, in filename_parentat()
2534 static struct dentry *__kern_path_locked(struct filename *name, struct path *path) in __kern_path_locked() argument
2540 error = filename_parentat(AT_FDCWD, name, 0, path, &last, &type); in __kern_path_locked()
2544 path_put(path); in __kern_path_locked()
2547 inode_lock_nested(path->dentry->d_inode, I_MUTEX_PARENT); in __kern_path_locked()
2548 d = __lookup_hash(&last, path->dentry, 0); in __kern_path_locked()
2550 inode_unlock(path->dentry->d_inode); in __kern_path_locked()
2551 path_put(path); in __kern_path_locked()
2556 struct dentry *kern_path_locked(const char *name, struct path *path) in kern_path_locked() argument
2559 struct dentry *res = __kern_path_locked(filename, path); in kern_path_locked()
2565 int kern_path(const char *name, unsigned int flags, struct path *path) in kern_path() argument
2568 int ret = filename_lookup(AT_FDCWD, filename, flags, path, NULL); in kern_path()
2586 struct path *path) in vfs_path_lookup() argument
2589 struct path root = {.mnt = mnt, .dentry = dentry}; in vfs_path_lookup()
2594 ret = filename_lookup(AT_FDCWD, filename, flags, path, &root); in vfs_path_lookup()
2771 int path_pts(struct path *path) in path_pts() argument
2776 struct dentry *parent = dget_parent(path->dentry); in path_pts()
2780 if (unlikely(!path_connected(path->mnt, parent))) { in path_pts()
2784 dput(path->dentry); in path_pts()
2785 path->dentry = parent; in path_pts()
2790 path->dentry = child; in path_pts()
2792 follow_down(path); in path_pts()
2798 struct path *path, int *empty) in user_path_at_empty() argument
2801 int ret = filename_lookup(dfd, filename, flags, path, NULL); in user_path_at_empty()
3009 bool may_open_dev(const struct path *path) in may_open_dev() argument
3011 return !(path->mnt->mnt_flags & MNT_NODEV) && in may_open_dev()
3012 !(path->mnt->mnt_sb->s_iflags & SB_I_NODEV); in may_open_dev()
3015 static int may_open(struct user_namespace *mnt_userns, const struct path *path, in may_open() argument
3018 struct dentry *dentry = path->dentry; in may_open()
3036 if (!may_open_dev(path)) in may_open()
3046 if ((acc_mode & MAY_EXEC) && path_noexec(path)) in may_open()
3074 const struct path *path = &filp->f_path; in handle_truncate() local
3075 struct inode *inode = path->dentry->d_inode; in handle_truncate()
3080 error = security_path_truncate(path); in handle_truncate()
3082 error = do_truncate(mnt_userns, path->dentry, 0, in handle_truncate()
3098 const struct path *dir, struct dentry *dentry, in may_o_create()
3134 struct inode *dir = nd->path.dentry->d_inode; in atomic_open()
3141 file->f_path.mnt = nd->path.mnt; in atomic_open()
3189 struct dentry *dir = nd->path.dentry; in lookup_open()
3236 mnt_userns = mnt_user_ns(nd->path.mnt); in lookup_open()
3243 create_error = may_o_create(mnt_userns, &nd->path, in lookup_open()
3299 struct dentry *dir = nd->path.dentry; in open_last_lookups()
3339 got_write = !mnt_want_write(nd->path.mnt); in open_last_lookups()
3359 mnt_drop_write(nd->path.mnt); in open_last_lookups()
3365 dput(nd->path.dentry); in open_last_lookups()
3366 nd->path.dentry = dentry; in open_last_lookups()
3397 audit_inode(nd->name, nd->path.dentry, 0); in do_open()
3398 mnt_userns = mnt_user_ns(nd->path.mnt); in do_open()
3402 if (d_is_dir(nd->path.dentry)) in do_open()
3405 d_backing_inode(nd->path.dentry)); in do_open()
3409 if ((nd->flags & LOOKUP_DIRECTORY) && !d_can_lookup(nd->path.dentry)) in do_open()
3418 } else if (d_is_reg(nd->path.dentry) && open_flag & O_TRUNC) { in do_open()
3419 error = mnt_want_write(nd->path.mnt); in do_open()
3424 error = may_open(mnt_userns, &nd->path, acc_mode, open_flag); in do_open()
3426 error = vfs_open(&nd->path, file); in do_open()
3436 mnt_drop_write(nd->path.mnt); in do_open()
3501 struct path path; in do_tmpfile() local
3502 int error = path_lookupat(nd, flags | LOOKUP_DIRECTORY, &path); in do_tmpfile()
3505 error = mnt_want_write(path.mnt); in do_tmpfile()
3508 mnt_userns = mnt_user_ns(path.mnt); in do_tmpfile()
3509 child = vfs_tmpfile(mnt_userns, path.dentry, op->mode, op->open_flag); in do_tmpfile()
3513 dput(path.dentry); in do_tmpfile()
3514 path.dentry = child; in do_tmpfile()
3517 error = may_open(mnt_userns, &path, 0, op->open_flag); in do_tmpfile()
3519 error = vfs_open(&path, file); in do_tmpfile()
3521 mnt_drop_write(path.mnt); in do_tmpfile()
3523 path_put(&path); in do_tmpfile()
3529 struct path path; in do_o_path() local
3530 int error = path_lookupat(nd, flags, &path); in do_o_path()
3532 audit_inode(nd->name, path.dentry, 0); in do_o_path()
3533 error = vfs_open(&path, file); in do_o_path()
3534 path_put(&path); in do_o_path()
3595 struct file *do_file_open_root(const struct path *root, in do_file_open_root()
3622 struct path *path, unsigned int lookup_flags) in filename_create() argument
3637 error = filename_parentat(dfd, name, lookup_flags, path, &last, &type); in filename_create()
3649 err2 = mnt_want_write(path->mnt); in filename_create()
3654 inode_lock_nested(path->dentry->d_inode, I_MUTEX_PARENT); in filename_create()
3655 dentry = __lookup_hash(&last, path->dentry, lookup_flags); in filename_create()
3682 inode_unlock(path->dentry->d_inode); in filename_create()
3684 mnt_drop_write(path->mnt); in filename_create()
3686 path_put(path); in filename_create()
3691 struct path *path, unsigned int lookup_flags) in kern_path_create() argument
3694 struct dentry *res = filename_create(dfd, filename, path, lookup_flags); in kern_path_create()
3701 void done_path_create(struct path *path, struct dentry *dentry) in done_path_create() argument
3704 inode_unlock(path->dentry->d_inode); in done_path_create()
3705 mnt_drop_write(path->mnt); in done_path_create()
3706 path_put(path); in done_path_create()
3711 struct path *path, unsigned int lookup_flags) in user_path_create() argument
3714 struct dentry *res = filename_create(dfd, filename, path, lookup_flags); in user_path_create()
3790 struct path path; in do_mknodat() local
3798 dentry = filename_create(dfd, name, &path, lookup_flags); in do_mknodat()
3803 if (!IS_POSIXACL(path.dentry->d_inode)) in do_mknodat()
3805 error = security_path_mknod(&path, dentry, mode, dev); in do_mknodat()
3809 mnt_userns = mnt_user_ns(path.mnt); in do_mknodat()
3812 error = vfs_create(mnt_userns, path.dentry->d_inode, in do_mknodat()
3818 error = vfs_mknod(mnt_userns, path.dentry->d_inode, in do_mknodat()
3822 error = vfs_mknod(mnt_userns, path.dentry->d_inode, in do_mknodat()
3827 done_path_create(&path, dentry); in do_mknodat()
3893 struct path path; in do_mkdirat() local
3898 dentry = filename_create(dfd, name, &path, lookup_flags); in do_mkdirat()
3903 if (!IS_POSIXACL(path.dentry->d_inode)) in do_mkdirat()
3905 error = security_path_mkdir(&path, dentry, mode); in do_mkdirat()
3908 mnt_userns = mnt_user_ns(path.mnt); in do_mkdirat()
3909 error = vfs_mkdir(mnt_userns, path.dentry->d_inode, dentry, in do_mkdirat()
3912 done_path_create(&path, dentry); in do_mkdirat()
3992 struct path path; in do_rmdir() local
3997 error = filename_parentat(dfd, name, lookup_flags, &path, &last, &type); in do_rmdir()
4013 error = mnt_want_write(path.mnt); in do_rmdir()
4017 inode_lock_nested(path.dentry->d_inode, I_MUTEX_PARENT); in do_rmdir()
4018 dentry = __lookup_hash(&last, path.dentry, lookup_flags); in do_rmdir()
4026 error = security_path_rmdir(&path, dentry); in do_rmdir()
4029 mnt_userns = mnt_user_ns(path.mnt); in do_rmdir()
4030 error = vfs_rmdir(mnt_userns, path.dentry->d_inode, dentry); in do_rmdir()
4034 inode_unlock(path.dentry->d_inode); in do_rmdir()
4035 mnt_drop_write(path.mnt); in do_rmdir()
4037 path_put(&path); in do_rmdir()
4131 struct path path; in do_unlinkat() local
4138 error = filename_parentat(dfd, name, lookup_flags, &path, &last, &type); in do_unlinkat()
4146 error = mnt_want_write(path.mnt); in do_unlinkat()
4150 inode_lock_nested(path.dentry->d_inode, I_MUTEX_PARENT); in do_unlinkat()
4151 dentry = __lookup_hash(&last, path.dentry, lookup_flags); in do_unlinkat()
4163 error = security_path_unlink(&path, dentry); in do_unlinkat()
4166 mnt_userns = mnt_user_ns(path.mnt); in do_unlinkat()
4167 error = vfs_unlink(mnt_userns, path.dentry->d_inode, dentry, in do_unlinkat()
4172 inode_unlock(path.dentry->d_inode); in do_unlinkat()
4181 mnt_drop_write(path.mnt); in do_unlinkat()
4183 path_put(&path); in do_unlinkat()
4259 struct path path; in do_symlinkat() local
4267 dentry = filename_create(newdfd, to, &path, lookup_flags); in do_symlinkat()
4272 error = security_path_symlink(&path, dentry, from->name); in do_symlinkat()
4276 mnt_userns = mnt_user_ns(path.mnt); in do_symlinkat()
4277 error = vfs_symlink(mnt_userns, path.dentry->d_inode, dentry, in do_symlinkat()
4280 done_path_create(&path, dentry); in do_symlinkat()
4405 struct path old_path, new_path; in do_linkat()
4671 struct path old_path, new_path; in do_renameat2()