Lines Matching +full:root +full:- +full:node

1 // SPDX-License-Identifier: GPL-2.0-only
3 * fs/kernfs/dir.c - kernfs directory implementation
5 * Copyright (c) 2001-3 Patrick Mochel
18 #include "kernfs-internal.h"
34 return atomic_read(&kn->active) >= 0; in __kernfs_active()
39 lockdep_assert_held(&kernfs_root(kn)->kernfs_rwsem); in kernfs_active()
46 return kn->flags & KERNFS_LOCKDEP; in kernfs_lockdep()
52 /* kernfs_node_depth - compute depth from @from to @to */
57 while (rcu_dereference(to->__parent) && to != from) { in kernfs_depth()
59 to = rcu_dereference(to->__parent); in kernfs_depth()
73 da = kernfs_depth(ra->kn, a); in kernfs_common_ancestor()
74 db = kernfs_depth(rb->kn, b); in kernfs_common_ancestor()
77 a = rcu_dereference(a->__parent); in kernfs_common_ancestor()
78 da--; in kernfs_common_ancestor()
81 b = rcu_dereference(b->__parent); in kernfs_common_ancestor()
82 db--; in kernfs_common_ancestor()
85 /* worst case b and a will be the same at root */ in kernfs_common_ancestor()
87 b = rcu_dereference(b->__parent); in kernfs_common_ancestor()
88 a = rcu_dereference(a->__parent); in kernfs_common_ancestor()
95 * kernfs_path_from_node_locked - find a pseudo-absolute path to @kn_to,
96 * where kn_from is treated as root of the path.
97 * @kn_from: kernfs node which should be treated as root for the path
98 * @kn_to: kernfs node to which path is needed
122 * '\0'. On error, -errno is returned.
138 kn_from = kernfs_root(kn_to)->kn; in kernfs_path_from_node_locked()
145 return -EINVAL; in kernfs_path_from_node_locked()
153 copied = strscpy(buf + len, parent_str, buflen - len); in kernfs_path_from_node_locked()
160 for (i = depth_to - 1; i >= 0; i--) { in kernfs_path_from_node_locked()
164 kn = rcu_dereference(kn->__parent); in kernfs_path_from_node_locked()
166 name = rcu_dereference(kn->name); in kernfs_path_from_node_locked()
167 len += scnprintf(buf + len, buflen - len, "/%s", name); in kernfs_path_from_node_locked()
174 * kernfs_name - obtain the name of a given node
185 * it's filled up to @buflen-1 and nul terminated, and returns -E2BIG.
201 kn_parent = rcu_dereference(kn->__parent); in kernfs_name()
202 return strscpy(buf, kn_parent ? rcu_dereference(kn->name) : "/", buflen); in kernfs_name()
206 * kernfs_path_from_node - build path of node @to relative to @from.
213 * be on the same kernfs-root. If @from is not parent of @to, then a relative
219 * '\0'. On error, -errno is returned.
224 struct kernfs_root *root; in kernfs_path_from_node() local
228 root = kernfs_root(to); in kernfs_path_from_node()
229 if (!(root->flags & KERNFS_ROOT_INVARIANT_PARENT)) { in kernfs_path_from_node()
230 guard(read_lock_irqsave)(&root->kernfs_rename_lock); in kernfs_path_from_node()
239 * pr_cont_kernfs_name - pr_cont name of a kernfs_node
257 * pr_cont_kernfs_path - pr_cont path of a kernfs_node
272 if (sz == -E2BIG) in pr_cont_kernfs_path()
286 * kernfs_get_parent - determine the parent node and pin it
292 * Return: parent node of @kn
297 struct kernfs_root *root; in kernfs_get_parent() local
300 root = kernfs_root(kn); in kernfs_get_parent()
301 read_lock_irqsave(&root->kernfs_rename_lock, flags); in kernfs_get_parent()
304 read_unlock_irqrestore(&root->kernfs_rename_lock, flags); in kernfs_get_parent()
310 * kernfs_name_hash - calculate hash of @ns + @name
314 * Return: 31-bit hash of ns + name (so it fits in an off_t)
320 while (len--) in kernfs_name_hash()
328 hash = INT_MAX - 1; in kernfs_name_hash()
335 if (hash < kn->hash) in kernfs_name_compare()
336 return -1; in kernfs_name_compare()
337 if (hash > kn->hash) in kernfs_name_compare()
339 if (ns < kn->ns) in kernfs_name_compare()
340 return -1; in kernfs_name_compare()
341 if (ns > kn->ns) in kernfs_name_compare()
349 return kernfs_name_compare(left->hash, kernfs_rcu_name(left), left->ns, right); in kernfs_sd_compare()
353 * kernfs_link_sibling - link kernfs_node into sibling rbtree
357 * @kn->parent->dir.children.
363 * %0 on success, -EEXIST on failure.
369 struct rb_node **node; in kernfs_link_sibling() local
372 node = &kn_parent->dir.children.rb_node; in kernfs_link_sibling()
374 while (*node) { in kernfs_link_sibling()
378 pos = rb_to_kn(*node); in kernfs_link_sibling()
379 parent = *node; in kernfs_link_sibling()
382 node = &pos->rb.rb_left; in kernfs_link_sibling()
384 node = &pos->rb.rb_right; in kernfs_link_sibling()
386 return -EEXIST; in kernfs_link_sibling()
389 /* add new node and rebalance the tree */ in kernfs_link_sibling()
390 rb_link_node(&kn->rb, parent, node); in kernfs_link_sibling()
391 rb_insert_color(&kn->rb, &kn_parent->dir.children); in kernfs_link_sibling()
394 down_write(&kernfs_root(kn)->kernfs_iattr_rwsem); in kernfs_link_sibling()
396 kn_parent->dir.subdirs++; in kernfs_link_sibling()
398 up_write(&kernfs_root(kn)->kernfs_iattr_rwsem); in kernfs_link_sibling()
404 * kernfs_unlink_sibling - unlink kernfs_node from sibling rbtree
408 * kn->parent->dir.children.
420 if (RB_EMPTY_NODE(&kn->rb)) in kernfs_unlink_sibling()
424 down_write(&kernfs_root(kn)->kernfs_iattr_rwsem); in kernfs_unlink_sibling()
426 kn_parent->dir.subdirs--; in kernfs_unlink_sibling()
428 up_write(&kernfs_root(kn)->kernfs_iattr_rwsem); in kernfs_unlink_sibling()
430 rb_erase(&kn->rb, &kn_parent->dir.children); in kernfs_unlink_sibling()
431 RB_CLEAR_NODE(&kn->rb); in kernfs_unlink_sibling()
436 * kernfs_get_active - get an active reference to kernfs_node
450 if (!atomic_inc_unless_negative(&kn->active)) in kernfs_get_active()
454 rwsem_acquire_read(&kn->dep_map, 0, 1, _RET_IP_); in kernfs_get_active()
459 * kernfs_put_active - put an active reference to kernfs_node
473 rwsem_release(&kn->dep_map, _RET_IP_); in kernfs_put_active()
474 v = atomic_dec_return(&kn->active); in kernfs_put_active()
478 wake_up_all(&kernfs_root(kn)->deactivate_waitq); in kernfs_put_active()
482 * kernfs_drain - drain kernfs_node
490 __releases(&kernfs_root(kn)->kernfs_rwsem) in kernfs_drain()
491 __acquires(&kernfs_root(kn)->kernfs_rwsem) in kernfs_drain()
493 struct kernfs_root *root = kernfs_root(kn); in kernfs_drain() local
495 lockdep_assert_held_write(&root->kernfs_rwsem); in kernfs_drain()
504 if (atomic_read(&kn->active) == KN_DEACTIVATED_BIAS && in kernfs_drain()
508 up_write(&root->kernfs_rwsem); in kernfs_drain()
511 rwsem_acquire(&kn->dep_map, 0, 0, _RET_IP_); in kernfs_drain()
512 if (atomic_read(&kn->active) != KN_DEACTIVATED_BIAS) in kernfs_drain()
513 lock_contended(&kn->dep_map, _RET_IP_); in kernfs_drain()
516 wait_event(root->deactivate_waitq, in kernfs_drain()
517 atomic_read(&kn->active) == KN_DEACTIVATED_BIAS); in kernfs_drain()
520 lock_acquired(&kn->dep_map, _RET_IP_); in kernfs_drain()
521 rwsem_release(&kn->dep_map, _RET_IP_); in kernfs_drain()
527 down_write(&root->kernfs_rwsem); in kernfs_drain()
531 * kernfs_get - get a reference count on a kernfs_node
537 WARN_ON(!atomic_read(&kn->count)); in kernfs_get()
538 atomic_inc(&kn->count); in kernfs_get()
547 /* If the whole node goes away, then name can't be used outside */ in kernfs_free_rcu()
548 kfree_const(rcu_access_pointer(kn->name)); in kernfs_free_rcu()
550 if (kn->iattr) { in kernfs_free_rcu()
551 simple_xattrs_free(&kn->iattr->xattrs, NULL); in kernfs_free_rcu()
552 kmem_cache_free(kernfs_iattrs_cache, kn->iattr); in kernfs_free_rcu()
559 * kernfs_put - put a reference count on a kernfs_node
567 struct kernfs_root *root; in kernfs_put() local
569 if (!kn || !atomic_dec_and_test(&kn->count)) in kernfs_put()
571 root = kernfs_root(kn); in kernfs_put()
575 * kn->parent won't change beneath us. in kernfs_put()
579 WARN_ONCE(atomic_read(&kn->active) != KN_DEACTIVATED_BIAS, in kernfs_put()
581 parent ? rcu_dereference(parent->name) : "", in kernfs_put()
582 rcu_dereference(kn->name), atomic_read(&kn->active)); in kernfs_put()
585 kernfs_put(kn->symlink.target_kn); in kernfs_put()
587 spin_lock(&root->kernfs_idr_lock); in kernfs_put()
588 idr_remove(&root->ino_idr, (u32)kernfs_ino(kn)); in kernfs_put()
589 spin_unlock(&root->kernfs_idr_lock); in kernfs_put()
591 call_rcu(&kn->rcu, kernfs_free_rcu); in kernfs_put()
595 if (atomic_dec_and_test(&kn->count)) in kernfs_put()
598 /* just released the root kn, free @root too */ in kernfs_put()
599 idr_destroy(&root->ino_idr); in kernfs_put()
600 kfree_rcu(root, rcu); in kernfs_put()
606 * kernfs_node_from_dentry - determine kernfs_node associated with a dentry
613 * is accessible, the returned node can be in any state and the caller is
618 if (dentry->d_sb->s_op == &kernfs_sops) in kernfs_node_from_dentry()
623 static struct kernfs_node *__kernfs_new_node(struct kernfs_root *root, in __kernfs_new_node() argument
642 spin_lock(&root->kernfs_idr_lock); in __kernfs_new_node()
643 ret = idr_alloc_cyclic(&root->ino_idr, kn, 1, 0, GFP_ATOMIC); in __kernfs_new_node()
644 if (ret >= 0 && ret < root->last_id_lowbits) in __kernfs_new_node()
645 root->id_highbits++; in __kernfs_new_node()
646 id_highbits = root->id_highbits; in __kernfs_new_node()
647 root->last_id_lowbits = ret; in __kernfs_new_node()
648 spin_unlock(&root->kernfs_idr_lock); in __kernfs_new_node()
653 kn->id = (u64)id_highbits << 32 | ret; in __kernfs_new_node()
655 atomic_set(&kn->count, 1); in __kernfs_new_node()
656 atomic_set(&kn->active, KN_DEACTIVATED_BIAS); in __kernfs_new_node()
657 RB_CLEAR_NODE(&kn->rb); in __kernfs_new_node()
659 rcu_assign_pointer(kn->name, name); in __kernfs_new_node()
660 kn->mode = mode; in __kernfs_new_node()
661 kn->flags = flags; in __kernfs_new_node()
684 spin_lock(&root->kernfs_idr_lock); in __kernfs_new_node()
685 idr_remove(&root->ino_idr, (u32)kernfs_ino(kn)); in __kernfs_new_node()
686 spin_unlock(&root->kernfs_idr_lock); in __kernfs_new_node()
701 if (parent->mode & S_ISGID) { in kernfs_new_node()
706 if (parent->iattr) in kernfs_new_node()
707 gid = parent->iattr->ia_gid; in kernfs_new_node()
717 rcu_assign_pointer(kn->__parent, parent); in kernfs_new_node()
723 * kernfs_find_and_get_node_by_id - get kernfs_node from node id
724 * @root: the kernfs root
725 * @id: the target node id
731 * otherwise a kernfs node with reference counter incremented.
733 struct kernfs_node *kernfs_find_and_get_node_by_id(struct kernfs_root *root, in kernfs_find_and_get_node_by_id() argument
742 kn = idr_find(&root->ino_idr, (u32)ino); in kernfs_find_and_get_node_by_id()
759 * __kernfs_active() which tests @kn->active without kernfs_rwsem. in kernfs_find_and_get_node_by_id()
761 if (unlikely(!__kernfs_active(kn) || !atomic_inc_not_zero(&kn->count))) in kernfs_find_and_get_node_by_id()
772 * kernfs_add_one - add kernfs_node to parent without warning
775 * The caller must already have initialized @kn->parent. This
780 * %0 on success, -EEXIST if entry with the given name already
785 struct kernfs_root *root = kernfs_root(kn); in kernfs_add_one() local
791 down_write(&root->kernfs_rwsem); in kernfs_add_one()
794 ret = -EINVAL; in kernfs_add_one()
796 if (WARN(has_ns != (bool)kn->ns, KERN_WARNING "kernfs: ns %s in '%s' for '%s'\n", in kernfs_add_one()
804 ret = -ENOENT; in kernfs_add_one()
805 if (parent->flags & (KERNFS_REMOVING | KERNFS_EMPTY_DIR)) in kernfs_add_one()
808 kn->hash = kernfs_name_hash(kernfs_rcu_name(kn), kn->ns); in kernfs_add_one()
815 down_write(&root->kernfs_iattr_rwsem); in kernfs_add_one()
817 ps_iattr = parent->iattr; in kernfs_add_one()
819 ktime_get_real_ts64(&ps_iattr->ia_ctime); in kernfs_add_one()
820 ps_iattr->ia_mtime = ps_iattr->ia_ctime; in kernfs_add_one()
823 up_write(&root->kernfs_iattr_rwsem); in kernfs_add_one()
824 up_write(&root->kernfs_rwsem); in kernfs_add_one()
827 * Activate the new node unless CREATE_DEACTIVATED is requested. in kernfs_add_one()
829 * activating the node with kernfs_activate(). A node which hasn't in kernfs_add_one()
833 if (!(kernfs_root(kn)->flags & KERNFS_ROOT_CREATE_DEACTIVATED)) in kernfs_add_one()
838 up_write(&root->kernfs_rwsem); in kernfs_add_one()
843 * kernfs_find_ns - find kernfs_node with the given name
856 struct rb_node *node = parent->dir.children.rb_node; in kernfs_find_ns() local
860 lockdep_assert_held(&kernfs_root(parent)->kernfs_rwsem); in kernfs_find_ns()
869 while (node) { in kernfs_find_ns()
873 kn = rb_to_kn(node); in kernfs_find_ns()
876 node = node->rb_left; in kernfs_find_ns()
878 node = node->rb_right; in kernfs_find_ns()
892 lockdep_assert_held_read(&kernfs_root(parent)->kernfs_rwsem); in kernfs_walk_ns()
917 * kernfs_find_and_get_ns - find and get kernfs_node with the given name
931 struct kernfs_root *root = kernfs_root(parent); in kernfs_find_and_get_ns() local
933 down_read(&root->kernfs_rwsem); in kernfs_find_and_get_ns()
936 up_read(&root->kernfs_rwsem); in kernfs_find_and_get_ns()
943 * kernfs_walk_and_get_ns - find and get kernfs_node with the given path
957 struct kernfs_root *root = kernfs_root(parent); in kernfs_walk_and_get_ns() local
959 down_read(&root->kernfs_rwsem); in kernfs_walk_and_get_ns()
962 up_read(&root->kernfs_rwsem); in kernfs_walk_and_get_ns()
969 return kernfs_root(kn)->flags; in kernfs_root_flags()
973 * kernfs_create_root - create a new kernfs hierarchy
978 * Return: the root of the new hierarchy on success, ERR_PTR() value on
984 struct kernfs_root *root; in kernfs_create_root() local
987 root = kzalloc(sizeof(*root), GFP_KERNEL); in kernfs_create_root()
988 if (!root) in kernfs_create_root()
989 return ERR_PTR(-ENOMEM); in kernfs_create_root()
991 idr_init(&root->ino_idr); in kernfs_create_root()
992 spin_lock_init(&root->kernfs_idr_lock); in kernfs_create_root()
993 init_rwsem(&root->kernfs_rwsem); in kernfs_create_root()
994 init_rwsem(&root->kernfs_iattr_rwsem); in kernfs_create_root()
995 init_rwsem(&root->kernfs_supers_rwsem); in kernfs_create_root()
996 INIT_LIST_HEAD(&root->supers); in kernfs_create_root()
997 rwlock_init(&root->kernfs_rename_lock); in kernfs_create_root()
1006 root->id_highbits = 0; in kernfs_create_root()
1008 root->id_highbits = 1; in kernfs_create_root()
1010 kn = __kernfs_new_node(root, NULL, "", S_IFDIR | S_IRUGO | S_IXUGO, in kernfs_create_root()
1014 idr_destroy(&root->ino_idr); in kernfs_create_root()
1015 kfree(root); in kernfs_create_root()
1016 return ERR_PTR(-ENOMEM); in kernfs_create_root()
1019 kn->priv = priv; in kernfs_create_root()
1020 kn->dir.root = root; in kernfs_create_root()
1022 root->syscall_ops = scops; in kernfs_create_root()
1023 root->flags = flags; in kernfs_create_root()
1024 root->kn = kn; in kernfs_create_root()
1025 init_waitqueue_head(&root->deactivate_waitq); in kernfs_create_root()
1027 if (!(root->flags & KERNFS_ROOT_CREATE_DEACTIVATED)) in kernfs_create_root()
1030 return root; in kernfs_create_root()
1034 * kernfs_destroy_root - destroy a kernfs hierarchy
1035 * @root: root of the hierarchy to destroy
1037 * Destroy the hierarchy anchored at @root by removing all existing
1038 * directories and destroying @root.
1040 void kernfs_destroy_root(struct kernfs_root *root) in kernfs_destroy_root() argument
1043 * kernfs_remove holds kernfs_rwsem from the root so the root in kernfs_destroy_root()
1046 kernfs_get(root->kn); in kernfs_destroy_root()
1047 kernfs_remove(root->kn); in kernfs_destroy_root()
1048 kernfs_put(root->kn); /* will also free @root */ in kernfs_destroy_root()
1052 * kernfs_root_to_node - return the kernfs_node associated with a kernfs_root
1053 * @root: root to use to lookup
1055 * Return: @root's kernfs_node
1057 struct kernfs_node *kernfs_root_to_node(struct kernfs_root *root) in kernfs_root_to_node() argument
1059 return root->kn; in kernfs_root_to_node()
1063 * kernfs_create_dir_ns - create a directory
1072 * Return: the created node on success, ERR_PTR() value on failure.
1086 return ERR_PTR(-ENOMEM); in kernfs_create_dir_ns()
1088 kn->dir.root = parent->dir.root; in kernfs_create_dir_ns()
1089 kn->ns = ns; in kernfs_create_dir_ns()
1090 kn->priv = priv; in kernfs_create_dir_ns()
1102 * kernfs_create_empty_dir - create an always empty directory
1106 * Return: the created node on success, ERR_PTR() value on failure.
1118 return ERR_PTR(-ENOMEM); in kernfs_create_empty_dir()
1120 kn->flags |= KERNFS_EMPTY_DIR; in kernfs_create_empty_dir()
1121 kn->dir.root = parent->dir.root; in kernfs_create_empty_dir()
1122 kn->ns = NULL; in kernfs_create_empty_dir()
1123 kn->priv = NULL; in kernfs_create_empty_dir()
1138 struct kernfs_root *root; in kernfs_dop_revalidate() local
1141 return -ECHILD; in kernfs_dop_revalidate()
1145 /* If the kernfs parent node has changed discard and in kernfs_dop_revalidate()
1146 * proceed to ->lookup. in kernfs_dop_revalidate()
1158 * changes and the lookup re-done so that a new positive in kernfs_dop_revalidate()
1161 root = kernfs_root_from_sb(dentry->d_sb); in kernfs_dop_revalidate()
1162 down_read(&root->kernfs_rwsem); in kernfs_dop_revalidate()
1163 parent = kernfs_dentry_node(dentry->d_parent); in kernfs_dop_revalidate()
1166 up_read(&root->kernfs_rwsem); in kernfs_dop_revalidate()
1170 up_read(&root->kernfs_rwsem); in kernfs_dop_revalidate()
1172 /* The kernfs parent node hasn't changed, leave the in kernfs_dop_revalidate()
1179 root = kernfs_root(kn); in kernfs_dop_revalidate()
1180 down_read(&root->kernfs_rwsem); in kernfs_dop_revalidate()
1182 /* The kernfs node has been deactivated */ in kernfs_dop_revalidate()
1187 /* The kernfs node has been moved? */ in kernfs_dop_revalidate()
1188 if (kernfs_dentry_node(dentry->d_parent) != parent) in kernfs_dop_revalidate()
1191 /* The kernfs node has been renamed */ in kernfs_dop_revalidate()
1192 if (strcmp(dentry->d_name.name, kernfs_rcu_name(kn)) != 0) in kernfs_dop_revalidate()
1195 /* The kernfs node has been moved to a different namespace */ in kernfs_dop_revalidate()
1197 kernfs_info(dentry->d_sb)->ns != kn->ns) in kernfs_dop_revalidate()
1200 up_read(&root->kernfs_rwsem); in kernfs_dop_revalidate()
1203 up_read(&root->kernfs_rwsem); in kernfs_dop_revalidate()
1215 struct kernfs_node *parent = dir->i_private; in kernfs_iop_lookup()
1217 struct kernfs_root *root; in kernfs_iop_lookup() local
1221 root = kernfs_root(parent); in kernfs_iop_lookup()
1222 down_read(&root->kernfs_rwsem); in kernfs_iop_lookup()
1224 ns = kernfs_info(dir->i_sb)->ns; in kernfs_iop_lookup()
1226 kn = kernfs_find_ns(parent, dentry->d_name.name, ns); in kernfs_iop_lookup()
1233 up_read(&root->kernfs_rwsem); in kernfs_iop_lookup()
1236 inode = kernfs_get_inode(dir->i_sb, kn); in kernfs_iop_lookup()
1238 inode = ERR_PTR(-ENOMEM); in kernfs_iop_lookup()
1248 up_read(&root->kernfs_rwsem); in kernfs_iop_lookup()
1258 struct kernfs_node *parent = dir->i_private; in kernfs_iop_mkdir()
1259 struct kernfs_syscall_ops *scops = kernfs_root(parent)->syscall_ops; in kernfs_iop_mkdir()
1262 if (!scops || !scops->mkdir) in kernfs_iop_mkdir()
1263 return ERR_PTR(-EPERM); in kernfs_iop_mkdir()
1266 return ERR_PTR(-ENODEV); in kernfs_iop_mkdir()
1268 ret = scops->mkdir(parent, dentry->d_name.name, mode); in kernfs_iop_mkdir()
1277 struct kernfs_syscall_ops *scops = kernfs_root(kn)->syscall_ops; in kernfs_iop_rmdir()
1280 if (!scops || !scops->rmdir) in kernfs_iop_rmdir()
1281 return -EPERM; in kernfs_iop_rmdir()
1284 return -ENODEV; in kernfs_iop_rmdir()
1286 ret = scops->rmdir(kn); in kernfs_iop_rmdir()
1298 struct kernfs_node *new_parent = new_dir->i_private; in kernfs_iop_rename()
1299 struct kernfs_syscall_ops *scops = kernfs_root(kn)->syscall_ops; in kernfs_iop_rename()
1303 return -EINVAL; in kernfs_iop_rename()
1305 if (!scops || !scops->rename) in kernfs_iop_rename()
1306 return -EPERM; in kernfs_iop_rename()
1309 return -ENODEV; in kernfs_iop_rename()
1313 return -ENODEV; in kernfs_iop_rename()
1316 ret = scops->rename(kn, new_parent, new_dentry->d_name.name); in kernfs_iop_rename()
1347 rbn = rb_first(&pos->dir.children); in kernfs_leftmost_descendant()
1358 * kernfs_next_descendant_post - find the next descendant for post-order walk
1360 * @root: kernfs_node whose descendants to walk
1362 * Find the next descendant to visit for post-order traversal of @root's
1363 * descendants. @root is included in the iteration and the last node to be
1369 struct kernfs_node *root) in kernfs_next_descendant_post() argument
1373 lockdep_assert_held_write(&kernfs_root(root)->kernfs_rwsem); in kernfs_next_descendant_post()
1375 /* if first iteration, visit leftmost descendant which may be root */ in kernfs_next_descendant_post()
1377 return kernfs_leftmost_descendant(root); in kernfs_next_descendant_post()
1379 /* if we visited @root, we're done */ in kernfs_next_descendant_post()
1380 if (pos == root) in kernfs_next_descendant_post()
1384 rbn = rb_next(&pos->rb); in kernfs_next_descendant_post()
1394 lockdep_assert_held_write(&kernfs_root(kn)->kernfs_rwsem); in kernfs_activate_one()
1396 kn->flags |= KERNFS_ACTIVATED; in kernfs_activate_one()
1398 if (kernfs_active(kn) || (kn->flags & (KERNFS_HIDDEN | KERNFS_REMOVING))) in kernfs_activate_one()
1401 WARN_ON_ONCE(rcu_access_pointer(kn->__parent) && RB_EMPTY_NODE(&kn->rb)); in kernfs_activate_one()
1402 WARN_ON_ONCE(atomic_read(&kn->active) != KN_DEACTIVATED_BIAS); in kernfs_activate_one()
1404 atomic_sub(KN_DEACTIVATED_BIAS, &kn->active); in kernfs_activate_one()
1408 * kernfs_activate - activate a node which started deactivated
1411 * If the root has KERNFS_ROOT_CREATE_DEACTIVATED set, a newly created node
1412 * needs to be explicitly activated. A node which hasn't been activated
1423 struct kernfs_root *root = kernfs_root(kn); in kernfs_activate() local
1425 down_write(&root->kernfs_rwsem); in kernfs_activate()
1431 up_write(&root->kernfs_rwsem); in kernfs_activate()
1435 * kernfs_show - show or hide a node
1439 * If @show is %false, @kn is marked hidden and deactivated. A hidden node is
1441 * state is restored. This function won't implicitly activate a new node in a
1442 * %KERNFS_ROOT_CREATE_DEACTIVATED root which hasn't been activated yet.
1448 struct kernfs_root *root = kernfs_root(kn); in kernfs_show() local
1453 down_write(&root->kernfs_rwsem); in kernfs_show()
1456 kn->flags &= ~KERNFS_HIDDEN; in kernfs_show()
1457 if (kn->flags & KERNFS_ACTIVATED) in kernfs_show()
1460 kn->flags |= KERNFS_HIDDEN; in kernfs_show()
1462 atomic_add(KN_DEACTIVATED_BIAS, &kn->active); in kernfs_show()
1466 up_write(&root->kernfs_rwsem); in kernfs_show()
1473 /* Short-circuit if non-root @kn has already finished removal. */ in __kernfs_remove()
1477 lockdep_assert_held_write(&kernfs_root(kn)->kernfs_rwsem); in __kernfs_remove()
1483 if (kernfs_parent(kn) && RB_EMPTY_NODE(&kn->rb)) in __kernfs_remove()
1491 pos->flags |= KERNFS_REMOVING; in __kernfs_remove()
1493 atomic_add(KN_DEACTIVATED_BIAS, &pos->active); in __kernfs_remove()
1496 /* deactivate and unlink the subtree node-by-node */ in __kernfs_remove()
1511 * kernfs_unlink_sibling() succeeds once per node. Use it in __kernfs_remove()
1516 parent ? parent->iattr : NULL; in __kernfs_remove()
1519 down_write(&kernfs_root(kn)->kernfs_iattr_rwsem); in __kernfs_remove()
1522 ktime_get_real_ts64(&ps_iattr->ia_ctime); in __kernfs_remove()
1523 ps_iattr->ia_mtime = ps_iattr->ia_ctime; in __kernfs_remove()
1526 up_write(&kernfs_root(kn)->kernfs_iattr_rwsem); in __kernfs_remove()
1535 * kernfs_remove - remove a kernfs_node recursively
1542 struct kernfs_root *root; in kernfs_remove() local
1547 root = kernfs_root(kn); in kernfs_remove()
1549 down_write(&root->kernfs_rwsem); in kernfs_remove()
1551 up_write(&root->kernfs_rwsem); in kernfs_remove()
1555 * kernfs_break_active_protection - break out of active protection
1559 * with an active reference - e.g. one of kernfs_ops. Each invocation of
1578 * kernfs_unbreak_active_protection - undo kernfs_break_active_protection()
1584 * restore the active protection - @kn may already or be in the process of
1596 * @kn->active could be in any state; however, the increment we do in kernfs_unbreak_active_protection()
1600 * soon-to-follow put will either finish deactivation or restore in kernfs_unbreak_active_protection()
1604 atomic_inc(&kn->active); in kernfs_unbreak_active_protection()
1606 rwsem_acquire(&kn->dep_map, 0, 1, _RET_IP_); in kernfs_unbreak_active_protection()
1610 * kernfs_remove_self - remove a kernfs_node from its own method
1614 * with an active reference - e.g. one of kernfs_ops. This can be used to
1629 * won self-removal finishes and return %false. Note that the losers wait
1640 struct kernfs_root *root = kernfs_root(kn); in kernfs_remove_self() local
1642 down_write(&root->kernfs_rwsem); in kernfs_remove_self()
1654 if (!(kn->flags & KERNFS_SUICIDAL)) { in kernfs_remove_self()
1655 kn->flags |= KERNFS_SUICIDAL; in kernfs_remove_self()
1657 kn->flags |= KERNFS_SUICIDED; in kernfs_remove_self()
1660 wait_queue_head_t *waitq = &kernfs_root(kn)->deactivate_waitq; in kernfs_remove_self()
1666 if ((kn->flags & KERNFS_SUICIDED) && in kernfs_remove_self()
1667 atomic_read(&kn->active) == KN_DEACTIVATED_BIAS) in kernfs_remove_self()
1670 up_write(&root->kernfs_rwsem); in kernfs_remove_self()
1672 down_write(&root->kernfs_rwsem); in kernfs_remove_self()
1675 WARN_ON_ONCE(!RB_EMPTY_NODE(&kn->rb)); in kernfs_remove_self()
1685 up_write(&root->kernfs_rwsem); in kernfs_remove_self()
1690 * kernfs_remove_by_name_ns - find a kernfs_node by name and remove it
1697 * Return: %0 on success, -ENOENT if such entry doesn't exist.
1703 struct kernfs_root *root; in kernfs_remove_by_name_ns() local
1708 return -ENOENT; in kernfs_remove_by_name_ns()
1711 root = kernfs_root(parent); in kernfs_remove_by_name_ns()
1712 down_write(&root->kernfs_rwsem); in kernfs_remove_by_name_ns()
1721 up_write(&root->kernfs_rwsem); in kernfs_remove_by_name_ns()
1726 return -ENOENT; in kernfs_remove_by_name_ns()
1730 * kernfs_rename_ns - move and rename a kernfs_node
1731 * @kn: target node
1736 * Return: %0 on success, -errno on failure.
1742 struct kernfs_root *root; in kernfs_rename_ns() local
1746 /* can't move or rename root */ in kernfs_rename_ns()
1747 if (!rcu_access_pointer(kn->__parent)) in kernfs_rename_ns()
1748 return -EINVAL; in kernfs_rename_ns()
1750 root = kernfs_root(kn); in kernfs_rename_ns()
1751 down_write(&root->kernfs_rwsem); in kernfs_rename_ns()
1753 error = -ENOENT; in kernfs_rename_ns()
1755 (new_parent->flags & KERNFS_EMPTY_DIR)) in kernfs_rename_ns()
1759 if (root->flags & KERNFS_ROOT_INVARIANT_PARENT) { in kernfs_rename_ns()
1760 error = -EINVAL; in kernfs_rename_ns()
1769 if ((old_parent == new_parent) && (kn->ns == new_ns) && in kernfs_rename_ns()
1773 error = -EEXIST; in kernfs_rename_ns()
1779 error = -ENOMEM; in kernfs_rename_ns()
1792 /* rename_lock protects ->parent accessors */ in kernfs_rename_ns()
1795 write_lock_irq(&root->kernfs_rename_lock); in kernfs_rename_ns()
1797 rcu_assign_pointer(kn->__parent, new_parent); in kernfs_rename_ns()
1799 kn->ns = new_ns; in kernfs_rename_ns()
1801 rcu_assign_pointer(kn->name, new_name); in kernfs_rename_ns()
1803 write_unlock_irq(&root->kernfs_rename_lock); in kernfs_rename_ns()
1807 kn->ns = new_ns; in kernfs_rename_ns()
1809 rcu_assign_pointer(kn->name, new_name); in kernfs_rename_ns()
1812 kn->hash = kernfs_name_hash(new_name ?: old_name, kn->ns); in kernfs_rename_ns()
1820 up_write(&root->kernfs_rwsem); in kernfs_rename_ns()
1826 kernfs_put(filp->private_data); in kernfs_dir_fop_release()
1835 rcu_access_pointer(pos->__parent) == parent && in kernfs_dir_pos()
1836 hash == pos->hash; in kernfs_dir_pos()
1842 struct rb_node *node = parent->dir.children.rb_node; in kernfs_dir_pos() local
1843 while (node) { in kernfs_dir_pos()
1844 pos = rb_to_kn(node); in kernfs_dir_pos()
1846 if (hash < pos->hash) in kernfs_dir_pos()
1847 node = node->rb_left; in kernfs_dir_pos()
1848 else if (hash > pos->hash) in kernfs_dir_pos()
1849 node = node->rb_right; in kernfs_dir_pos()
1855 while (pos && (!kernfs_active(pos) || pos->ns != ns)) { in kernfs_dir_pos()
1856 struct rb_node *node = rb_next(&pos->rb); in kernfs_dir_pos() local
1857 if (!node) in kernfs_dir_pos()
1860 pos = rb_to_kn(node); in kernfs_dir_pos()
1871 struct rb_node *node = rb_next(&pos->rb); in kernfs_dir_next_pos() local
1872 if (!node) in kernfs_dir_next_pos()
1875 pos = rb_to_kn(node); in kernfs_dir_next_pos()
1876 } while (pos && (!kernfs_active(pos) || pos->ns != ns)); in kernfs_dir_next_pos()
1883 struct dentry *dentry = file->f_path.dentry; in kernfs_fop_readdir()
1885 struct kernfs_node *pos = file->private_data; in kernfs_fop_readdir()
1886 struct kernfs_root *root; in kernfs_fop_readdir() local
1892 root = kernfs_root(parent); in kernfs_fop_readdir()
1893 down_read(&root->kernfs_rwsem); in kernfs_fop_readdir()
1896 ns = kernfs_info(dentry->d_sb)->ns; in kernfs_fop_readdir()
1898 for (pos = kernfs_dir_pos(ns, parent, ctx->pos, pos); in kernfs_fop_readdir()
1900 pos = kernfs_dir_next_pos(ns, parent, ctx->pos, pos)) { in kernfs_fop_readdir()
1902 unsigned int type = fs_umode_to_dtype(pos->mode); in kernfs_fop_readdir()
1906 ctx->pos = pos->hash; in kernfs_fop_readdir()
1907 file->private_data = pos; in kernfs_fop_readdir()
1911 up_read(&root->kernfs_rwsem); in kernfs_fop_readdir()
1915 up_read(&root->kernfs_rwsem); in kernfs_fop_readdir()
1916 file->private_data = NULL; in kernfs_fop_readdir()
1917 ctx->pos = INT_MAX; in kernfs_fop_readdir()