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"
20 static DEFINE_SPINLOCK(kernfs_rename_lock); /* kn->parent and ->name */
30 static DEFINE_SPINLOCK(kernfs_idr_lock); /* root->ino_idr */
36 return atomic_read(&kn->active) >= 0; in __kernfs_active()
41 lockdep_assert_held(&kernfs_root(kn)->kernfs_rwsem); in kernfs_active()
48 return kn->flags & KERNFS_LOCKDEP; in kernfs_lockdep()
59 return strlcpy(buf, kn->parent ? kn->name : "/", buflen); in kernfs_name_locked()
62 /* kernfs_node_depth - compute depth from @from to @to */
67 while (to->parent && to != from) { in kernfs_depth()
69 to = to->parent; in kernfs_depth()
83 da = kernfs_depth(ra->kn, a); in kernfs_common_ancestor()
84 db = kernfs_depth(rb->kn, b); in kernfs_common_ancestor()
87 a = a->parent; in kernfs_common_ancestor()
88 da--; in kernfs_common_ancestor()
91 b = b->parent; in kernfs_common_ancestor()
92 db--; in kernfs_common_ancestor()
95 /* worst case b and a will be the same at root */ in kernfs_common_ancestor()
97 b = b->parent; in kernfs_common_ancestor()
98 a = a->parent; in kernfs_common_ancestor()
105 * kernfs_path_from_node_locked - find a pseudo-absolute path to @kn_to,
106 * where kn_from is treated as root of the path.
107 * @kn_from: kernfs node which should be treated as root for the path
108 * @kn_to: kernfs node to which path is needed
132 * '\0'. On error, -errno is returned.
147 kn_from = kernfs_root(kn_to)->kn; in kernfs_path_from_node_locked()
153 return -EINVAL; in kernfs_path_from_node_locked()
157 return -EINVAL; in kernfs_path_from_node_locked()
166 len < buflen ? buflen - len : 0); in kernfs_path_from_node_locked()
169 for (i = depth_to - 1; i >= 0; i--) { in kernfs_path_from_node_locked()
171 kn = kn->parent; in kernfs_path_from_node_locked()
173 len < buflen ? buflen - len : 0); in kernfs_path_from_node_locked()
174 len += strlcpy(buf + len, kn->name, in kernfs_path_from_node_locked()
175 len < buflen ? buflen - len : 0); in kernfs_path_from_node_locked()
182 * kernfs_name - obtain the name of a given node
189 * isn't long enough, it's filled upto @buflen-1 and nul terminated.
207 * kernfs_path_from_node - build path of node @to relative to @from.
214 * be on the same kernfs-root. If @from is not parent of @to, then a relative
220 * '\0'. On error, -errno is returned.
236 * pr_cont_kernfs_name - pr_cont name of a kernfs_node
254 * pr_cont_kernfs_path - pr_cont path of a kernfs_node
285 * kernfs_get_parent - determine the parent node and pin it
297 parent = kn->parent; in kernfs_get_parent()
315 while (len--) in kernfs_name_hash()
323 hash = INT_MAX - 1; in kernfs_name_hash()
330 if (hash < kn->hash) in kernfs_name_compare()
331 return -1; in kernfs_name_compare()
332 if (hash > kn->hash) in kernfs_name_compare()
334 if (ns < kn->ns) in kernfs_name_compare()
335 return -1; in kernfs_name_compare()
336 if (ns > kn->ns) in kernfs_name_compare()
338 return strcmp(name, kn->name); in kernfs_name_compare()
344 return kernfs_name_compare(left->hash, left->name, left->ns, right); in kernfs_sd_compare()
348 * kernfs_link_sibling - link kernfs_node into sibling rbtree
352 * @kn->parent->dir.children.
358 * 0 on susccess -EEXIST on failure.
362 struct rb_node **node = &kn->parent->dir.children.rb_node; in kernfs_link_sibling() local
365 while (*node) { in kernfs_link_sibling()
369 pos = rb_to_kn(*node); in kernfs_link_sibling()
370 parent = *node; in kernfs_link_sibling()
373 node = &pos->rb.rb_left; in kernfs_link_sibling()
375 node = &pos->rb.rb_right; in kernfs_link_sibling()
377 return -EEXIST; in kernfs_link_sibling()
380 /* add new node and rebalance the tree */ in kernfs_link_sibling()
381 rb_link_node(&kn->rb, parent, node); in kernfs_link_sibling()
382 rb_insert_color(&kn->rb, &kn->parent->dir.children); in kernfs_link_sibling()
386 kn->parent->dir.subdirs++; in kernfs_link_sibling()
387 kernfs_inc_rev(kn->parent); in kernfs_link_sibling()
393 * kernfs_unlink_sibling - unlink kernfs_node from sibling rbtree
397 * kn->parent->dir.children. Returns %true if @kn was actually
405 if (RB_EMPTY_NODE(&kn->rb)) in kernfs_unlink_sibling()
409 kn->parent->dir.subdirs--; in kernfs_unlink_sibling()
410 kernfs_inc_rev(kn->parent); in kernfs_unlink_sibling()
412 rb_erase(&kn->rb, &kn->parent->dir.children); in kernfs_unlink_sibling()
413 RB_CLEAR_NODE(&kn->rb); in kernfs_unlink_sibling()
418 * kernfs_get_active - get an active reference to kernfs_node
432 if (!atomic_inc_unless_negative(&kn->active)) in kernfs_get_active()
436 rwsem_acquire_read(&kn->dep_map, 0, 1, _RET_IP_); in kernfs_get_active()
441 * kernfs_put_active - put an active reference to kernfs_node
455 rwsem_release(&kn->dep_map, _RET_IP_); in kernfs_put_active()
456 v = atomic_dec_return(&kn->active); in kernfs_put_active()
460 wake_up_all(&kernfs_root(kn)->deactivate_waitq); in kernfs_put_active()
464 * kernfs_drain - drain kernfs_node
472 __releases(&kernfs_root(kn)->kernfs_rwsem) in kernfs_drain()
473 __acquires(&kernfs_root(kn)->kernfs_rwsem) in kernfs_drain()
475 struct kernfs_root *root = kernfs_root(kn); in kernfs_drain() local
477 lockdep_assert_held_write(&root->kernfs_rwsem); in kernfs_drain()
486 if (atomic_read(&kn->active) == KN_DEACTIVATED_BIAS && in kernfs_drain()
490 up_write(&root->kernfs_rwsem); in kernfs_drain()
493 rwsem_acquire(&kn->dep_map, 0, 0, _RET_IP_); in kernfs_drain()
494 if (atomic_read(&kn->active) != KN_DEACTIVATED_BIAS) in kernfs_drain()
495 lock_contended(&kn->dep_map, _RET_IP_); in kernfs_drain()
498 wait_event(root->deactivate_waitq, in kernfs_drain()
499 atomic_read(&kn->active) == KN_DEACTIVATED_BIAS); in kernfs_drain()
502 lock_acquired(&kn->dep_map, _RET_IP_); in kernfs_drain()
503 rwsem_release(&kn->dep_map, _RET_IP_); in kernfs_drain()
509 down_write(&root->kernfs_rwsem); in kernfs_drain()
513 * kernfs_get - get a reference count on a kernfs_node
519 WARN_ON(!atomic_read(&kn->count)); in kernfs_get()
520 atomic_inc(&kn->count); in kernfs_get()
526 * kernfs_put - put a reference count on a kernfs_node
534 struct kernfs_root *root; in kernfs_put() local
536 if (!kn || !atomic_dec_and_test(&kn->count)) in kernfs_put()
538 root = kernfs_root(kn); in kernfs_put()
542 * kn->parent won't change beneath us. in kernfs_put()
544 parent = kn->parent; in kernfs_put()
546 WARN_ONCE(atomic_read(&kn->active) != KN_DEACTIVATED_BIAS, in kernfs_put()
548 parent ? parent->name : "", kn->name, atomic_read(&kn->active)); in kernfs_put()
551 kernfs_put(kn->symlink.target_kn); in kernfs_put()
553 kfree_const(kn->name); in kernfs_put()
555 if (kn->iattr) { in kernfs_put()
556 simple_xattrs_free(&kn->iattr->xattrs); in kernfs_put()
557 kmem_cache_free(kernfs_iattrs_cache, kn->iattr); in kernfs_put()
560 idr_remove(&root->ino_idr, (u32)kernfs_ino(kn)); in kernfs_put()
566 if (atomic_dec_and_test(&kn->count)) in kernfs_put()
569 /* just released the root kn, free @root too */ in kernfs_put()
570 idr_destroy(&root->ino_idr); in kernfs_put()
571 kfree(root); in kernfs_put()
577 * kernfs_node_from_dentry - determine kernfs_node associated with a dentry
584 * is accessible, the returned node can be in any state and the caller is
589 if (dentry->d_sb->s_op == &kernfs_sops) in kernfs_node_from_dentry()
594 static struct kernfs_node *__kernfs_new_node(struct kernfs_root *root, in __kernfs_new_node() argument
614 ret = idr_alloc_cyclic(&root->ino_idr, kn, 1, 0, GFP_ATOMIC); in __kernfs_new_node()
615 if (ret >= 0 && ret < root->last_id_lowbits) in __kernfs_new_node()
616 root->id_highbits++; in __kernfs_new_node()
617 id_highbits = root->id_highbits; in __kernfs_new_node()
618 root->last_id_lowbits = ret; in __kernfs_new_node()
624 kn->id = (u64)id_highbits << 32 | ret; in __kernfs_new_node()
626 atomic_set(&kn->count, 1); in __kernfs_new_node()
627 atomic_set(&kn->active, KN_DEACTIVATED_BIAS); in __kernfs_new_node()
628 RB_CLEAR_NODE(&kn->rb); in __kernfs_new_node()
630 kn->name = name; in __kernfs_new_node()
631 kn->mode = mode; in __kernfs_new_node()
632 kn->flags = flags; in __kernfs_new_node()
655 idr_remove(&root->ino_idr, (u32)kernfs_ino(kn)); in __kernfs_new_node()
674 kn->parent = parent; in kernfs_new_node()
680 * kernfs_find_and_get_node_by_id - get kernfs_node from node id
681 * @root: the kernfs root
682 * @id: the target node id
688 * NULL on failure. Return a kernfs node with reference counter incremented
690 struct kernfs_node *kernfs_find_and_get_node_by_id(struct kernfs_root *root, in kernfs_find_and_get_node_by_id() argument
699 kn = idr_find(&root->ino_idr, (u32)ino); in kernfs_find_and_get_node_by_id()
716 * __kernfs_active() which tests @kn->active without kernfs_rwsem. in kernfs_find_and_get_node_by_id()
718 if (unlikely(!__kernfs_active(kn) || !atomic_inc_not_zero(&kn->count))) in kernfs_find_and_get_node_by_id()
729 * kernfs_add_one - add kernfs_node to parent without warning
732 * The caller must already have initialized @kn->parent. This
737 * 0 on success, -EEXIST if entry with the given name already
742 struct kernfs_node *parent = kn->parent; in kernfs_add_one()
743 struct kernfs_root *root = kernfs_root(parent); in kernfs_add_one() local
748 down_write(&root->kernfs_rwsem); in kernfs_add_one()
750 ret = -EINVAL; in kernfs_add_one()
752 if (WARN(has_ns != (bool)kn->ns, KERN_WARNING "kernfs: ns %s in '%s' for '%s'\n", in kernfs_add_one()
753 has_ns ? "required" : "invalid", parent->name, kn->name)) in kernfs_add_one()
759 ret = -ENOENT; in kernfs_add_one()
760 if (parent->flags & (KERNFS_REMOVING | KERNFS_EMPTY_DIR)) in kernfs_add_one()
763 kn->hash = kernfs_name_hash(kn->name, kn->ns); in kernfs_add_one()
770 ps_iattr = parent->iattr; in kernfs_add_one()
772 ktime_get_real_ts64(&ps_iattr->ia_ctime); in kernfs_add_one()
773 ps_iattr->ia_mtime = ps_iattr->ia_ctime; in kernfs_add_one()
776 up_write(&root->kernfs_rwsem); in kernfs_add_one()
779 * Activate the new node unless CREATE_DEACTIVATED is requested. in kernfs_add_one()
781 * activating the node with kernfs_activate(). A node which hasn't in kernfs_add_one()
785 if (!(kernfs_root(kn)->flags & KERNFS_ROOT_CREATE_DEACTIVATED)) in kernfs_add_one()
790 up_write(&root->kernfs_rwsem); in kernfs_add_one()
795 * kernfs_find_ns - find kernfs_node with the given name
807 struct rb_node *node = parent->dir.children.rb_node; in kernfs_find_ns() local
811 lockdep_assert_held(&kernfs_root(parent)->kernfs_rwsem); in kernfs_find_ns()
815 has_ns ? "required" : "invalid", parent->name, name); in kernfs_find_ns()
820 while (node) { in kernfs_find_ns()
824 kn = rb_to_kn(node); in kernfs_find_ns()
827 node = node->rb_left; in kernfs_find_ns()
829 node = node->rb_right; in kernfs_find_ns()
843 lockdep_assert_held_read(&kernfs_root(parent)->kernfs_rwsem); in kernfs_walk_ns()
868 * kernfs_find_and_get_ns - find and get kernfs_node with the given name
881 struct kernfs_root *root = kernfs_root(parent); in kernfs_find_and_get_ns() local
883 down_read(&root->kernfs_rwsem); in kernfs_find_and_get_ns()
886 up_read(&root->kernfs_rwsem); in kernfs_find_and_get_ns()
893 * kernfs_walk_and_get_ns - find and get kernfs_node with the given path
906 struct kernfs_root *root = kernfs_root(parent); in kernfs_walk_and_get_ns() local
908 down_read(&root->kernfs_rwsem); in kernfs_walk_and_get_ns()
911 up_read(&root->kernfs_rwsem); in kernfs_walk_and_get_ns()
917 * kernfs_create_root - create a new kernfs hierarchy
922 * Returns the root of the new hierarchy on success, ERR_PTR() value on
928 struct kernfs_root *root; in kernfs_create_root() local
931 root = kzalloc(sizeof(*root), GFP_KERNEL); in kernfs_create_root()
932 if (!root) in kernfs_create_root()
933 return ERR_PTR(-ENOMEM); in kernfs_create_root()
935 idr_init(&root->ino_idr); in kernfs_create_root()
936 init_rwsem(&root->kernfs_rwsem); in kernfs_create_root()
937 INIT_LIST_HEAD(&root->supers); in kernfs_create_root()
946 root->id_highbits = 0; in kernfs_create_root()
948 root->id_highbits = 1; in kernfs_create_root()
950 kn = __kernfs_new_node(root, NULL, "", S_IFDIR | S_IRUGO | S_IXUGO, in kernfs_create_root()
954 idr_destroy(&root->ino_idr); in kernfs_create_root()
955 kfree(root); in kernfs_create_root()
956 return ERR_PTR(-ENOMEM); in kernfs_create_root()
959 kn->priv = priv; in kernfs_create_root()
960 kn->dir.root = root; in kernfs_create_root()
962 root->syscall_ops = scops; in kernfs_create_root()
963 root->flags = flags; in kernfs_create_root()
964 root->kn = kn; in kernfs_create_root()
965 init_waitqueue_head(&root->deactivate_waitq); in kernfs_create_root()
967 if (!(root->flags & KERNFS_ROOT_CREATE_DEACTIVATED)) in kernfs_create_root()
970 return root; in kernfs_create_root()
974 * kernfs_destroy_root - destroy a kernfs hierarchy
975 * @root: root of the hierarchy to destroy
977 * Destroy the hierarchy anchored at @root by removing all existing
978 * directories and destroying @root.
980 void kernfs_destroy_root(struct kernfs_root *root) in kernfs_destroy_root() argument
983 * kernfs_remove holds kernfs_rwsem from the root so the root in kernfs_destroy_root()
986 kernfs_get(root->kn); in kernfs_destroy_root()
987 kernfs_remove(root->kn); in kernfs_destroy_root()
988 kernfs_put(root->kn); /* will also free @root */ in kernfs_destroy_root()
992 * kernfs_root_to_node - return the kernfs_node associated with a kernfs_root
993 * @root: root to use to lookup
995 struct kernfs_node *kernfs_root_to_node(struct kernfs_root *root) in kernfs_root_to_node() argument
997 return root->kn; in kernfs_root_to_node()
1001 * kernfs_create_dir_ns - create a directory
1010 * Returns the created node on success, ERR_PTR() value on failure.
1024 return ERR_PTR(-ENOMEM); in kernfs_create_dir_ns()
1026 kn->dir.root = parent->dir.root; in kernfs_create_dir_ns()
1027 kn->ns = ns; in kernfs_create_dir_ns()
1028 kn->priv = priv; in kernfs_create_dir_ns()
1040 * kernfs_create_empty_dir - create an always empty directory
1044 * Returns the created node on success, ERR_PTR() value on failure.
1056 return ERR_PTR(-ENOMEM); in kernfs_create_empty_dir()
1058 kn->flags |= KERNFS_EMPTY_DIR; in kernfs_create_empty_dir()
1059 kn->dir.root = parent->dir.root; in kernfs_create_empty_dir()
1060 kn->ns = NULL; in kernfs_create_empty_dir()
1061 kn->priv = NULL; in kernfs_create_empty_dir()
1075 struct kernfs_root *root; in kernfs_dop_revalidate() local
1078 return -ECHILD; in kernfs_dop_revalidate()
1084 /* If the kernfs parent node has changed discard and in kernfs_dop_revalidate()
1085 * proceed to ->lookup. in kernfs_dop_revalidate()
1087 spin_lock(&dentry->d_lock); in kernfs_dop_revalidate()
1088 parent = kernfs_dentry_node(dentry->d_parent); in kernfs_dop_revalidate()
1090 spin_unlock(&dentry->d_lock); in kernfs_dop_revalidate()
1091 root = kernfs_root(parent); in kernfs_dop_revalidate()
1092 down_read(&root->kernfs_rwsem); in kernfs_dop_revalidate()
1094 up_read(&root->kernfs_rwsem); in kernfs_dop_revalidate()
1097 up_read(&root->kernfs_rwsem); in kernfs_dop_revalidate()
1099 spin_unlock(&dentry->d_lock); in kernfs_dop_revalidate()
1101 /* The kernfs parent node hasn't changed, leave the in kernfs_dop_revalidate()
1108 root = kernfs_root(kn); in kernfs_dop_revalidate()
1109 down_read(&root->kernfs_rwsem); in kernfs_dop_revalidate()
1111 /* The kernfs node has been deactivated */ in kernfs_dop_revalidate()
1115 /* The kernfs node has been moved? */ in kernfs_dop_revalidate()
1116 if (kernfs_dentry_node(dentry->d_parent) != kn->parent) in kernfs_dop_revalidate()
1119 /* The kernfs node has been renamed */ in kernfs_dop_revalidate()
1120 if (strcmp(dentry->d_name.name, kn->name) != 0) in kernfs_dop_revalidate()
1123 /* The kernfs node has been moved to a different namespace */ in kernfs_dop_revalidate()
1124 if (kn->parent && kernfs_ns_enabled(kn->parent) && in kernfs_dop_revalidate()
1125 kernfs_info(dentry->d_sb)->ns != kn->ns) in kernfs_dop_revalidate()
1128 up_read(&root->kernfs_rwsem); in kernfs_dop_revalidate()
1131 up_read(&root->kernfs_rwsem); in kernfs_dop_revalidate()
1143 struct kernfs_node *parent = dir->i_private; in kernfs_iop_lookup()
1145 struct kernfs_root *root; in kernfs_iop_lookup() local
1149 root = kernfs_root(parent); in kernfs_iop_lookup()
1150 down_read(&root->kernfs_rwsem); in kernfs_iop_lookup()
1152 ns = kernfs_info(dir->i_sb)->ns; in kernfs_iop_lookup()
1154 kn = kernfs_find_ns(parent, dentry->d_name.name, ns); in kernfs_iop_lookup()
1161 up_read(&root->kernfs_rwsem); in kernfs_iop_lookup()
1164 inode = kernfs_get_inode(dir->i_sb, kn); in kernfs_iop_lookup()
1166 inode = ERR_PTR(-ENOMEM); in kernfs_iop_lookup()
1176 up_read(&root->kernfs_rwsem); in kernfs_iop_lookup()
1186 struct kernfs_node *parent = dir->i_private; in kernfs_iop_mkdir()
1187 struct kernfs_syscall_ops *scops = kernfs_root(parent)->syscall_ops; in kernfs_iop_mkdir()
1190 if (!scops || !scops->mkdir) in kernfs_iop_mkdir()
1191 return -EPERM; in kernfs_iop_mkdir()
1194 return -ENODEV; in kernfs_iop_mkdir()
1196 ret = scops->mkdir(parent, dentry->d_name.name, mode); in kernfs_iop_mkdir()
1205 struct kernfs_syscall_ops *scops = kernfs_root(kn)->syscall_ops; in kernfs_iop_rmdir()
1208 if (!scops || !scops->rmdir) in kernfs_iop_rmdir()
1209 return -EPERM; in kernfs_iop_rmdir()
1212 return -ENODEV; in kernfs_iop_rmdir()
1214 ret = scops->rmdir(kn); in kernfs_iop_rmdir()
1226 struct kernfs_node *new_parent = new_dir->i_private; in kernfs_iop_rename()
1227 struct kernfs_syscall_ops *scops = kernfs_root(kn)->syscall_ops; in kernfs_iop_rename()
1231 return -EINVAL; in kernfs_iop_rename()
1233 if (!scops || !scops->rename) in kernfs_iop_rename()
1234 return -EPERM; in kernfs_iop_rename()
1237 return -ENODEV; in kernfs_iop_rename()
1241 return -ENODEV; in kernfs_iop_rename()
1244 ret = scops->rename(kn, new_parent, new_dentry->d_name.name); in kernfs_iop_rename()
1275 rbn = rb_first(&pos->dir.children); in kernfs_leftmost_descendant()
1286 * kernfs_next_descendant_post - find the next descendant for post-order walk
1288 * @root: kernfs_node whose descendants to walk
1290 * Find the next descendant to visit for post-order traversal of @root's
1291 * descendants. @root is included in the iteration and the last node to be
1295 struct kernfs_node *root) in kernfs_next_descendant_post() argument
1299 lockdep_assert_held_write(&kernfs_root(root)->kernfs_rwsem); in kernfs_next_descendant_post()
1301 /* if first iteration, visit leftmost descendant which may be root */ in kernfs_next_descendant_post()
1303 return kernfs_leftmost_descendant(root); in kernfs_next_descendant_post()
1305 /* if we visited @root, we're done */ in kernfs_next_descendant_post()
1306 if (pos == root) in kernfs_next_descendant_post()
1310 rbn = rb_next(&pos->rb); in kernfs_next_descendant_post()
1315 return pos->parent; in kernfs_next_descendant_post()
1320 lockdep_assert_held_write(&kernfs_root(kn)->kernfs_rwsem); in kernfs_activate_one()
1322 kn->flags |= KERNFS_ACTIVATED; in kernfs_activate_one()
1324 if (kernfs_active(kn) || (kn->flags & (KERNFS_HIDDEN | KERNFS_REMOVING))) in kernfs_activate_one()
1327 WARN_ON_ONCE(kn->parent && RB_EMPTY_NODE(&kn->rb)); in kernfs_activate_one()
1328 WARN_ON_ONCE(atomic_read(&kn->active) != KN_DEACTIVATED_BIAS); in kernfs_activate_one()
1330 atomic_sub(KN_DEACTIVATED_BIAS, &kn->active); in kernfs_activate_one()
1334 * kernfs_activate - activate a node which started deactivated
1337 * If the root has KERNFS_ROOT_CREATE_DEACTIVATED set, a newly created node
1338 * needs to be explicitly activated. A node which hasn't been activated
1349 struct kernfs_root *root = kernfs_root(kn); in kernfs_activate() local
1351 down_write(&root->kernfs_rwsem); in kernfs_activate()
1357 up_write(&root->kernfs_rwsem); in kernfs_activate()
1361 * kernfs_show - show or hide a node
1365 * If @show is %false, @kn is marked hidden and deactivated. A hidden node is
1367 * state is restored. This function won't implicitly activate a new node in a
1368 * %KERNFS_ROOT_CREATE_DEACTIVATED root which hasn't been activated yet.
1374 struct kernfs_root *root = kernfs_root(kn); in kernfs_show() local
1379 down_write(&root->kernfs_rwsem); in kernfs_show()
1382 kn->flags &= ~KERNFS_HIDDEN; in kernfs_show()
1383 if (kn->flags & KERNFS_ACTIVATED) in kernfs_show()
1386 kn->flags |= KERNFS_HIDDEN; in kernfs_show()
1388 atomic_add(KN_DEACTIVATED_BIAS, &kn->active); in kernfs_show()
1392 up_write(&root->kernfs_rwsem); in kernfs_show()
1399 /* Short-circuit if non-root @kn has already finished removal. */ in __kernfs_remove()
1403 lockdep_assert_held_write(&kernfs_root(kn)->kernfs_rwsem); in __kernfs_remove()
1409 if (kn->parent && RB_EMPTY_NODE(&kn->rb)) in __kernfs_remove()
1412 pr_debug("kernfs %s: removing\n", kn->name); in __kernfs_remove()
1417 pos->flags |= KERNFS_REMOVING; in __kernfs_remove()
1419 atomic_add(KN_DEACTIVATED_BIAS, &pos->active); in __kernfs_remove()
1422 /* deactivate and unlink the subtree node-by-node */ in __kernfs_remove()
1437 * kernfs_unlink_sibling() succeeds once per node. Use it in __kernfs_remove()
1440 if (!pos->parent || kernfs_unlink_sibling(pos)) { in __kernfs_remove()
1442 pos->parent ? pos->parent->iattr : NULL; in __kernfs_remove()
1446 ktime_get_real_ts64(&ps_iattr->ia_ctime); in __kernfs_remove()
1447 ps_iattr->ia_mtime = ps_iattr->ia_ctime; in __kernfs_remove()
1458 * kernfs_remove - remove a kernfs_node recursively
1465 struct kernfs_root *root; in kernfs_remove() local
1470 root = kernfs_root(kn); in kernfs_remove()
1472 down_write(&root->kernfs_rwsem); in kernfs_remove()
1474 up_write(&root->kernfs_rwsem); in kernfs_remove()
1478 * kernfs_break_active_protection - break out of active protection
1482 * with an active reference - e.g. one of kernfs_ops. Each invocation of
1501 * kernfs_unbreak_active_protection - undo kernfs_break_active_protection()
1507 * restore the active protection - @kn may already or be in the process of
1518 * @kn->active could be in any state; however, the increment we do in kernfs_unbreak_active_protection()
1522 * soon-to-follow put will either finish deactivation or restore in kernfs_unbreak_active_protection()
1526 atomic_inc(&kn->active); in kernfs_unbreak_active_protection()
1528 rwsem_acquire(&kn->dep_map, 0, 1, _RET_IP_); in kernfs_unbreak_active_protection()
1532 * kernfs_remove_self - remove a kernfs_node from its own method
1536 * with an active reference - e.g. one of kernfs_ops. This can be used to
1551 * won self-removal finishes and return %false. Note that the losers wait
1560 struct kernfs_root *root = kernfs_root(kn); in kernfs_remove_self() local
1562 down_write(&root->kernfs_rwsem); in kernfs_remove_self()
1574 if (!(kn->flags & KERNFS_SUICIDAL)) { in kernfs_remove_self()
1575 kn->flags |= KERNFS_SUICIDAL; in kernfs_remove_self()
1577 kn->flags |= KERNFS_SUICIDED; in kernfs_remove_self()
1580 wait_queue_head_t *waitq = &kernfs_root(kn)->deactivate_waitq; in kernfs_remove_self()
1586 if ((kn->flags & KERNFS_SUICIDED) && in kernfs_remove_self()
1587 atomic_read(&kn->active) == KN_DEACTIVATED_BIAS) in kernfs_remove_self()
1590 up_write(&root->kernfs_rwsem); in kernfs_remove_self()
1592 down_write(&root->kernfs_rwsem); in kernfs_remove_self()
1595 WARN_ON_ONCE(!RB_EMPTY_NODE(&kn->rb)); in kernfs_remove_self()
1605 up_write(&root->kernfs_rwsem); in kernfs_remove_self()
1610 * kernfs_remove_by_name_ns - find a kernfs_node by name and remove it
1616 * Returns 0 on success, -ENOENT if such entry doesn't exist.
1622 struct kernfs_root *root; in kernfs_remove_by_name_ns() local
1627 return -ENOENT; in kernfs_remove_by_name_ns()
1630 root = kernfs_root(parent); in kernfs_remove_by_name_ns()
1631 down_write(&root->kernfs_rwsem); in kernfs_remove_by_name_ns()
1640 up_write(&root->kernfs_rwsem); in kernfs_remove_by_name_ns()
1645 return -ENOENT; in kernfs_remove_by_name_ns()
1649 * kernfs_rename_ns - move and rename a kernfs_node
1650 * @kn: target node
1659 struct kernfs_root *root; in kernfs_rename_ns() local
1663 /* can't move or rename root */ in kernfs_rename_ns()
1664 if (!kn->parent) in kernfs_rename_ns()
1665 return -EINVAL; in kernfs_rename_ns()
1667 root = kernfs_root(kn); in kernfs_rename_ns()
1668 down_write(&root->kernfs_rwsem); in kernfs_rename_ns()
1670 error = -ENOENT; in kernfs_rename_ns()
1672 (new_parent->flags & KERNFS_EMPTY_DIR)) in kernfs_rename_ns()
1676 if ((kn->parent == new_parent) && (kn->ns == new_ns) && in kernfs_rename_ns()
1677 (strcmp(kn->name, new_name) == 0)) in kernfs_rename_ns()
1680 error = -EEXIST; in kernfs_rename_ns()
1685 if (strcmp(kn->name, new_name) != 0) { in kernfs_rename_ns()
1686 error = -ENOMEM; in kernfs_rename_ns()
1700 /* rename_lock protects ->parent and ->name accessors */ in kernfs_rename_ns()
1703 old_parent = kn->parent; in kernfs_rename_ns()
1704 kn->parent = new_parent; in kernfs_rename_ns()
1706 kn->ns = new_ns; in kernfs_rename_ns()
1708 old_name = kn->name; in kernfs_rename_ns()
1709 kn->name = new_name; in kernfs_rename_ns()
1714 kn->hash = kernfs_name_hash(kn->name, kn->ns); in kernfs_rename_ns()
1722 up_write(&root->kernfs_rwsem); in kernfs_rename_ns()
1729 return (kn->mode >> 12) & 15; in dt_type()
1734 kernfs_put(filp->private_data); in kernfs_dir_fop_release()
1743 pos->parent == parent && hash == pos->hash; in kernfs_dir_pos()
1749 struct rb_node *node = parent->dir.children.rb_node; in kernfs_dir_pos() local
1750 while (node) { in kernfs_dir_pos()
1751 pos = rb_to_kn(node); in kernfs_dir_pos()
1753 if (hash < pos->hash) in kernfs_dir_pos()
1754 node = node->rb_left; in kernfs_dir_pos()
1755 else if (hash > pos->hash) in kernfs_dir_pos()
1756 node = node->rb_right; in kernfs_dir_pos()
1762 while (pos && (!kernfs_active(pos) || pos->ns != ns)) { in kernfs_dir_pos()
1763 struct rb_node *node = rb_next(&pos->rb); in kernfs_dir_pos() local
1764 if (!node) in kernfs_dir_pos()
1767 pos = rb_to_kn(node); in kernfs_dir_pos()
1778 struct rb_node *node = rb_next(&pos->rb); in kernfs_dir_next_pos() local
1779 if (!node) in kernfs_dir_next_pos()
1782 pos = rb_to_kn(node); in kernfs_dir_next_pos()
1783 } while (pos && (!kernfs_active(pos) || pos->ns != ns)); in kernfs_dir_next_pos()
1790 struct dentry *dentry = file->f_path.dentry; in kernfs_fop_readdir()
1792 struct kernfs_node *pos = file->private_data; in kernfs_fop_readdir()
1793 struct kernfs_root *root; in kernfs_fop_readdir() local
1799 root = kernfs_root(parent); in kernfs_fop_readdir()
1800 down_read(&root->kernfs_rwsem); in kernfs_fop_readdir()
1803 ns = kernfs_info(dentry->d_sb)->ns; in kernfs_fop_readdir()
1805 for (pos = kernfs_dir_pos(ns, parent, ctx->pos, pos); in kernfs_fop_readdir()
1807 pos = kernfs_dir_next_pos(ns, parent, ctx->pos, pos)) { in kernfs_fop_readdir()
1808 const char *name = pos->name; in kernfs_fop_readdir()
1813 ctx->pos = pos->hash; in kernfs_fop_readdir()
1814 file->private_data = pos; in kernfs_fop_readdir()
1817 up_read(&root->kernfs_rwsem); in kernfs_fop_readdir()
1820 down_read(&root->kernfs_rwsem); in kernfs_fop_readdir()
1822 up_read(&root->kernfs_rwsem); in kernfs_fop_readdir()
1823 file->private_data = NULL; in kernfs_fop_readdir()
1824 ctx->pos = INT_MAX; in kernfs_fop_readdir()