Lines Matching refs:kn

34 static bool __kernfs_active(struct kernfs_node *kn)  in __kernfs_active()  argument
36 return atomic_read(&kn->active) >= 0; in __kernfs_active()
39 static bool kernfs_active(struct kernfs_node *kn) in kernfs_active() argument
41 lockdep_assert_held(&kernfs_root(kn)->kernfs_rwsem); in kernfs_active()
42 return __kernfs_active(kn); in kernfs_active()
45 static bool kernfs_lockdep(struct kernfs_node *kn) in kernfs_lockdep() argument
48 return kn->flags & KERNFS_LOCKDEP; in kernfs_lockdep()
54 static int kernfs_name_locked(struct kernfs_node *kn, char *buf, size_t buflen) in kernfs_name_locked() argument
56 if (!kn) in kernfs_name_locked()
59 return strscpy(buf, kn->parent ? kn->name : "/", buflen); in kernfs_name_locked()
83 da = kernfs_depth(ra->kn, a); in kernfs_common_ancestor()
84 db = kernfs_depth(rb->kn, b); in kernfs_common_ancestor()
138 struct kernfs_node *kn, *common; in kernfs_path_from_node_locked() local
148 kn_from = kernfs_root(kn_to)->kn; in kernfs_path_from_node_locked()
171 for (kn = kn_to, j = 0; j < i; j++) in kernfs_path_from_node_locked()
172 kn = kn->parent; in kernfs_path_from_node_locked()
174 len += scnprintf(buf + len, buflen - len, "/%s", kn->name); in kernfs_path_from_node_locked()
196 int kernfs_name(struct kernfs_node *kn, char *buf, size_t buflen) in kernfs_name() argument
202 ret = kernfs_name_locked(kn, buf, buflen); in kernfs_name()
242 void pr_cont_kernfs_name(struct kernfs_node *kn) in pr_cont_kernfs_name() argument
248 kernfs_name(kn, kernfs_pr_cont_buf, sizeof(kernfs_pr_cont_buf)); in pr_cont_kernfs_name()
260 void pr_cont_kernfs_path(struct kernfs_node *kn) in pr_cont_kernfs_path() argument
267 sz = kernfs_path_from_node(kn, NULL, kernfs_pr_cont_buf, in pr_cont_kernfs_path()
292 struct kernfs_node *kernfs_get_parent(struct kernfs_node *kn) in kernfs_get_parent() argument
298 parent = kn->parent; in kernfs_get_parent()
329 const void *ns, const struct kernfs_node *kn) in kernfs_name_compare() argument
331 if (hash < kn->hash) in kernfs_name_compare()
333 if (hash > kn->hash) in kernfs_name_compare()
335 if (ns < kn->ns) in kernfs_name_compare()
337 if (ns > kn->ns) in kernfs_name_compare()
339 return strcmp(name, kn->name); in kernfs_name_compare()
361 static int kernfs_link_sibling(struct kernfs_node *kn) in kernfs_link_sibling() argument
363 struct rb_node **node = &kn->parent->dir.children.rb_node; in kernfs_link_sibling()
372 result = kernfs_sd_compare(kn, pos); in kernfs_link_sibling()
382 rb_link_node(&kn->rb, parent, node); in kernfs_link_sibling()
383 rb_insert_color(&kn->rb, &kn->parent->dir.children); in kernfs_link_sibling()
386 down_write(&kernfs_root(kn)->kernfs_iattr_rwsem); in kernfs_link_sibling()
387 if (kernfs_type(kn) == KERNFS_DIR) in kernfs_link_sibling()
388 kn->parent->dir.subdirs++; in kernfs_link_sibling()
389 kernfs_inc_rev(kn->parent); in kernfs_link_sibling()
390 up_write(&kernfs_root(kn)->kernfs_iattr_rwsem); in kernfs_link_sibling()
408 static bool kernfs_unlink_sibling(struct kernfs_node *kn) in kernfs_unlink_sibling() argument
410 if (RB_EMPTY_NODE(&kn->rb)) in kernfs_unlink_sibling()
413 down_write(&kernfs_root(kn)->kernfs_iattr_rwsem); in kernfs_unlink_sibling()
414 if (kernfs_type(kn) == KERNFS_DIR) in kernfs_unlink_sibling()
415 kn->parent->dir.subdirs--; in kernfs_unlink_sibling()
416 kernfs_inc_rev(kn->parent); in kernfs_unlink_sibling()
417 up_write(&kernfs_root(kn)->kernfs_iattr_rwsem); in kernfs_unlink_sibling()
419 rb_erase(&kn->rb, &kn->parent->dir.children); in kernfs_unlink_sibling()
420 RB_CLEAR_NODE(&kn->rb); in kernfs_unlink_sibling()
434 struct kernfs_node *kernfs_get_active(struct kernfs_node *kn) in kernfs_get_active() argument
436 if (unlikely(!kn)) in kernfs_get_active()
439 if (!atomic_inc_unless_negative(&kn->active)) in kernfs_get_active()
442 if (kernfs_lockdep(kn)) in kernfs_get_active()
443 rwsem_acquire_read(&kn->dep_map, 0, 1, _RET_IP_); in kernfs_get_active()
444 return kn; in kernfs_get_active()
454 void kernfs_put_active(struct kernfs_node *kn) in kernfs_put_active() argument
458 if (unlikely(!kn)) in kernfs_put_active()
461 if (kernfs_lockdep(kn)) in kernfs_put_active()
462 rwsem_release(&kn->dep_map, _RET_IP_); in kernfs_put_active()
463 v = atomic_dec_return(&kn->active); in kernfs_put_active()
467 wake_up_all(&kernfs_root(kn)->deactivate_waitq); in kernfs_put_active()
478 static void kernfs_drain(struct kernfs_node *kn) in kernfs_drain() argument
479 __releases(&kernfs_root(kn)->kernfs_rwsem) in kernfs_drain()
480 __acquires(&kernfs_root(kn)->kernfs_rwsem) in kernfs_drain()
482 struct kernfs_root *root = kernfs_root(kn); in kernfs_drain()
485 WARN_ON_ONCE(kernfs_active(kn)); in kernfs_drain()
493 if (atomic_read(&kn->active) == KN_DEACTIVATED_BIAS && in kernfs_drain()
494 !kernfs_should_drain_open_files(kn)) in kernfs_drain()
499 if (kernfs_lockdep(kn)) { in kernfs_drain()
500 rwsem_acquire(&kn->dep_map, 0, 0, _RET_IP_); in kernfs_drain()
501 if (atomic_read(&kn->active) != KN_DEACTIVATED_BIAS) in kernfs_drain()
502 lock_contended(&kn->dep_map, _RET_IP_); in kernfs_drain()
506 atomic_read(&kn->active) == KN_DEACTIVATED_BIAS); in kernfs_drain()
508 if (kernfs_lockdep(kn)) { in kernfs_drain()
509 lock_acquired(&kn->dep_map, _RET_IP_); in kernfs_drain()
510 rwsem_release(&kn->dep_map, _RET_IP_); in kernfs_drain()
513 if (kernfs_should_drain_open_files(kn)) in kernfs_drain()
514 kernfs_drain_open_files(kn); in kernfs_drain()
523 void kernfs_get(struct kernfs_node *kn) in kernfs_get() argument
525 if (kn) { in kernfs_get()
526 WARN_ON(!atomic_read(&kn->count)); in kernfs_get()
527 atomic_inc(&kn->count); in kernfs_get()
534 struct kernfs_node *kn = container_of(rcu, struct kernfs_node, rcu); in kernfs_free_rcu() local
536 kfree_const(kn->name); in kernfs_free_rcu()
538 if (kn->iattr) { in kernfs_free_rcu()
539 simple_xattrs_free(&kn->iattr->xattrs, NULL); in kernfs_free_rcu()
540 kmem_cache_free(kernfs_iattrs_cache, kn->iattr); in kernfs_free_rcu()
543 kmem_cache_free(kernfs_node_cache, kn); in kernfs_free_rcu()
552 void kernfs_put(struct kernfs_node *kn) in kernfs_put() argument
557 if (!kn || !atomic_dec_and_test(&kn->count)) in kernfs_put()
559 root = kernfs_root(kn); in kernfs_put()
565 parent = kn->parent; in kernfs_put()
567 WARN_ONCE(atomic_read(&kn->active) != KN_DEACTIVATED_BIAS, in kernfs_put()
569 parent ? parent->name : "", kn->name, atomic_read(&kn->active)); in kernfs_put()
571 if (kernfs_type(kn) == KERNFS_LINK) in kernfs_put()
572 kernfs_put(kn->symlink.target_kn); in kernfs_put()
575 idr_remove(&root->ino_idr, (u32)kernfs_ino(kn)); in kernfs_put()
578 call_rcu(&kn->rcu, kernfs_free_rcu); in kernfs_put()
580 kn = parent; in kernfs_put()
581 if (kn) { in kernfs_put()
582 if (atomic_dec_and_test(&kn->count)) in kernfs_put()
616 struct kernfs_node *kn; in __kernfs_new_node() local
624 kn = kmem_cache_zalloc(kernfs_node_cache, GFP_KERNEL); in __kernfs_new_node()
625 if (!kn) in __kernfs_new_node()
630 ret = idr_alloc_cyclic(&root->ino_idr, kn, 1, 0, GFP_ATOMIC); in __kernfs_new_node()
640 kn->id = (u64)id_highbits << 32 | ret; in __kernfs_new_node()
642 atomic_set(&kn->count, 1); in __kernfs_new_node()
643 atomic_set(&kn->active, KN_DEACTIVATED_BIAS); in __kernfs_new_node()
644 RB_CLEAR_NODE(&kn->rb); in __kernfs_new_node()
646 kn->name = name; in __kernfs_new_node()
647 kn->mode = mode; in __kernfs_new_node()
648 kn->flags = flags; in __kernfs_new_node()
657 ret = __kernfs_setattr(kn, &iattr); in __kernfs_new_node()
663 ret = security_kernfs_init_security(parent, kn); in __kernfs_new_node()
668 return kn; in __kernfs_new_node()
672 idr_remove(&root->ino_idr, (u32)kernfs_ino(kn)); in __kernfs_new_node()
675 kmem_cache_free(kernfs_node_cache, kn); in __kernfs_new_node()
686 struct kernfs_node *kn; in kernfs_new_node() local
700 kn = __kernfs_new_node(kernfs_root(parent), parent, in kernfs_new_node()
702 if (kn) { in kernfs_new_node()
704 kn->parent = parent; in kernfs_new_node()
706 return kn; in kernfs_new_node()
723 struct kernfs_node *kn; in kernfs_find_and_get_node_by_id() local
729 kn = idr_find(&root->ino_idr, (u32)ino); in kernfs_find_and_get_node_by_id()
730 if (!kn) in kernfs_find_and_get_node_by_id()
735 if (kernfs_ino(kn) != ino) in kernfs_find_and_get_node_by_id()
739 if (unlikely(gen && kernfs_gen(kn) != gen)) in kernfs_find_and_get_node_by_id()
748 if (unlikely(!__kernfs_active(kn) || !atomic_inc_not_zero(&kn->count))) in kernfs_find_and_get_node_by_id()
752 return kn; in kernfs_find_and_get_node_by_id()
770 int kernfs_add_one(struct kernfs_node *kn) in kernfs_add_one() argument
772 struct kernfs_node *parent = kn->parent; in kernfs_add_one()
782 if (WARN(has_ns != (bool)kn->ns, KERN_WARNING "kernfs: ns %s in '%s' for '%s'\n", in kernfs_add_one()
783 has_ns ? "required" : "invalid", parent->name, kn->name)) in kernfs_add_one()
793 kn->hash = kernfs_name_hash(kn->name, kn->ns); in kernfs_add_one()
795 ret = kernfs_link_sibling(kn); in kernfs_add_one()
818 if (!(kernfs_root(kn)->flags & KERNFS_ROOT_CREATE_DEACTIVATED)) in kernfs_add_one()
819 kernfs_activate(kn); in kernfs_add_one()
855 struct kernfs_node *kn; in kernfs_find_ns() local
858 kn = rb_to_kn(node); in kernfs_find_ns()
859 result = kernfs_name_compare(hash, name, ns, kn); in kernfs_find_ns()
865 return kn; in kernfs_find_ns()
915 struct kernfs_node *kn; in kernfs_find_and_get_ns() local
919 kn = kernfs_find_ns(parent, name, ns); in kernfs_find_and_get_ns()
920 kernfs_get(kn); in kernfs_find_and_get_ns()
923 return kn; in kernfs_find_and_get_ns()
941 struct kernfs_node *kn; in kernfs_walk_and_get_ns() local
945 kn = kernfs_walk_ns(parent, path, ns); in kernfs_walk_and_get_ns()
946 kernfs_get(kn); in kernfs_walk_and_get_ns()
949 return kn; in kernfs_walk_and_get_ns()
965 struct kernfs_node *kn; in kernfs_create_root() local
988 kn = __kernfs_new_node(root, NULL, "", S_IFDIR | S_IRUGO | S_IXUGO, in kernfs_create_root()
991 if (!kn) { in kernfs_create_root()
997 kn->priv = priv; in kernfs_create_root()
998 kn->dir.root = root; in kernfs_create_root()
1002 root->kn = kn; in kernfs_create_root()
1006 kernfs_activate(kn); in kernfs_create_root()
1024 kernfs_get(root->kn); in kernfs_destroy_root()
1025 kernfs_remove(root->kn); in kernfs_destroy_root()
1026 kernfs_put(root->kn); /* will also free @root */ in kernfs_destroy_root()
1037 return root->kn; in kernfs_root_to_node()
1057 struct kernfs_node *kn; in kernfs_create_dir_ns() local
1061 kn = kernfs_new_node(parent, name, mode | S_IFDIR, in kernfs_create_dir_ns()
1063 if (!kn) in kernfs_create_dir_ns()
1066 kn->dir.root = parent->dir.root; in kernfs_create_dir_ns()
1067 kn->ns = ns; in kernfs_create_dir_ns()
1068 kn->priv = priv; in kernfs_create_dir_ns()
1071 rc = kernfs_add_one(kn); in kernfs_create_dir_ns()
1073 return kn; in kernfs_create_dir_ns()
1075 kernfs_put(kn); in kernfs_create_dir_ns()
1089 struct kernfs_node *kn; in kernfs_create_empty_dir() local
1093 kn = kernfs_new_node(parent, name, S_IRUGO|S_IXUGO|S_IFDIR, in kernfs_create_empty_dir()
1095 if (!kn) in kernfs_create_empty_dir()
1098 kn->flags |= KERNFS_EMPTY_DIR; in kernfs_create_empty_dir()
1099 kn->dir.root = parent->dir.root; in kernfs_create_empty_dir()
1100 kn->ns = NULL; in kernfs_create_empty_dir()
1101 kn->priv = NULL; in kernfs_create_empty_dir()
1104 rc = kernfs_add_one(kn); in kernfs_create_empty_dir()
1106 return kn; in kernfs_create_empty_dir()
1108 kernfs_put(kn); in kernfs_create_empty_dir()
1114 struct kernfs_node *kn; in kernfs_dop_revalidate() local
1157 kn = kernfs_dentry_node(dentry); in kernfs_dop_revalidate()
1158 root = kernfs_root(kn); in kernfs_dop_revalidate()
1162 if (!kernfs_active(kn)) in kernfs_dop_revalidate()
1166 if (kernfs_dentry_node(dentry->d_parent) != kn->parent) in kernfs_dop_revalidate()
1170 if (strcmp(dentry->d_name.name, kn->name) != 0) in kernfs_dop_revalidate()
1174 if (kn->parent && kernfs_ns_enabled(kn->parent) && in kernfs_dop_revalidate()
1175 kernfs_info(dentry->d_sb)->ns != kn->ns) in kernfs_dop_revalidate()
1194 struct kernfs_node *kn; in kernfs_iop_lookup() local
1204 kn = kernfs_find_ns(parent, dentry->d_name.name, ns); in kernfs_iop_lookup()
1206 if (kn) { in kernfs_iop_lookup()
1210 if (!kernfs_active(kn)) { in kernfs_iop_lookup()
1214 inode = kernfs_get_inode(dir->i_sb, kn); in kernfs_iop_lookup()
1254 struct kernfs_node *kn = kernfs_dentry_node(dentry); in kernfs_iop_rmdir() local
1255 struct kernfs_syscall_ops *scops = kernfs_root(kn)->syscall_ops; in kernfs_iop_rmdir()
1261 if (!kernfs_get_active(kn)) in kernfs_iop_rmdir()
1264 ret = scops->rmdir(kn); in kernfs_iop_rmdir()
1266 kernfs_put_active(kn); in kernfs_iop_rmdir()
1275 struct kernfs_node *kn = kernfs_dentry_node(old_dentry); in kernfs_iop_rename() local
1277 struct kernfs_syscall_ops *scops = kernfs_root(kn)->syscall_ops; in kernfs_iop_rename()
1286 if (!kernfs_get_active(kn)) in kernfs_iop_rename()
1290 kernfs_put_active(kn); in kernfs_iop_rename()
1294 ret = scops->rename(kn, new_parent, new_dentry->d_name.name); in kernfs_iop_rename()
1297 kernfs_put_active(kn); in kernfs_iop_rename()
1370 static void kernfs_activate_one(struct kernfs_node *kn) in kernfs_activate_one() argument
1372 lockdep_assert_held_write(&kernfs_root(kn)->kernfs_rwsem); in kernfs_activate_one()
1374 kn->flags |= KERNFS_ACTIVATED; in kernfs_activate_one()
1376 if (kernfs_active(kn) || (kn->flags & (KERNFS_HIDDEN | KERNFS_REMOVING))) in kernfs_activate_one()
1379 WARN_ON_ONCE(kn->parent && RB_EMPTY_NODE(&kn->rb)); in kernfs_activate_one()
1380 WARN_ON_ONCE(atomic_read(&kn->active) != KN_DEACTIVATED_BIAS); in kernfs_activate_one()
1382 atomic_sub(KN_DEACTIVATED_BIAS, &kn->active); in kernfs_activate_one()
1398 void kernfs_activate(struct kernfs_node *kn) in kernfs_activate() argument
1401 struct kernfs_root *root = kernfs_root(kn); in kernfs_activate()
1406 while ((pos = kernfs_next_descendant_post(pos, kn))) in kernfs_activate()
1424 void kernfs_show(struct kernfs_node *kn, bool show) in kernfs_show() argument
1426 struct kernfs_root *root = kernfs_root(kn); in kernfs_show()
1428 if (WARN_ON_ONCE(kernfs_type(kn) == KERNFS_DIR)) in kernfs_show()
1434 kn->flags &= ~KERNFS_HIDDEN; in kernfs_show()
1435 if (kn->flags & KERNFS_ACTIVATED) in kernfs_show()
1436 kernfs_activate_one(kn); in kernfs_show()
1438 kn->flags |= KERNFS_HIDDEN; in kernfs_show()
1439 if (kernfs_active(kn)) in kernfs_show()
1440 atomic_add(KN_DEACTIVATED_BIAS, &kn->active); in kernfs_show()
1441 kernfs_drain(kn); in kernfs_show()
1447 static void __kernfs_remove(struct kernfs_node *kn) in __kernfs_remove() argument
1452 if (!kn) in __kernfs_remove()
1455 lockdep_assert_held_write(&kernfs_root(kn)->kernfs_rwsem); in __kernfs_remove()
1461 if (kn->parent && RB_EMPTY_NODE(&kn->rb)) in __kernfs_remove()
1464 pr_debug("kernfs %s: removing\n", kn->name); in __kernfs_remove()
1468 while ((pos = kernfs_next_descendant_post(pos, kn))) { in __kernfs_remove()
1476 pos = kernfs_leftmost_descendant(kn); in __kernfs_remove()
1497 down_write(&kernfs_root(kn)->kernfs_iattr_rwsem); in __kernfs_remove()
1504 up_write(&kernfs_root(kn)->kernfs_iattr_rwsem); in __kernfs_remove()
1509 } while (pos != kn); in __kernfs_remove()
1518 void kernfs_remove(struct kernfs_node *kn) in kernfs_remove() argument
1522 if (!kn) in kernfs_remove()
1525 root = kernfs_root(kn); in kernfs_remove()
1528 __kernfs_remove(kn); in kernfs_remove()
1546 void kernfs_break_active_protection(struct kernfs_node *kn) in kernfs_break_active_protection() argument
1552 kernfs_put_active(kn); in kernfs_break_active_protection()
1570 void kernfs_unbreak_active_protection(struct kernfs_node *kn) in kernfs_unbreak_active_protection() argument
1581 atomic_inc(&kn->active); in kernfs_unbreak_active_protection()
1582 if (kernfs_lockdep(kn)) in kernfs_unbreak_active_protection()
1583 rwsem_acquire(&kn->dep_map, 0, 1, _RET_IP_); in kernfs_unbreak_active_protection()
1614 bool kernfs_remove_self(struct kernfs_node *kn) in kernfs_remove_self() argument
1617 struct kernfs_root *root = kernfs_root(kn); in kernfs_remove_self()
1620 kernfs_break_active_protection(kn); in kernfs_remove_self()
1631 if (!(kn->flags & KERNFS_SUICIDAL)) { in kernfs_remove_self()
1632 kn->flags |= KERNFS_SUICIDAL; in kernfs_remove_self()
1633 __kernfs_remove(kn); in kernfs_remove_self()
1634 kn->flags |= KERNFS_SUICIDED; in kernfs_remove_self()
1637 wait_queue_head_t *waitq = &kernfs_root(kn)->deactivate_waitq; in kernfs_remove_self()
1643 if ((kn->flags & KERNFS_SUICIDED) && in kernfs_remove_self()
1644 atomic_read(&kn->active) == KN_DEACTIVATED_BIAS) in kernfs_remove_self()
1652 WARN_ON_ONCE(!RB_EMPTY_NODE(&kn->rb)); in kernfs_remove_self()
1660 kernfs_unbreak_active_protection(kn); in kernfs_remove_self()
1679 struct kernfs_node *kn; in kernfs_remove_by_name_ns() local
1691 kn = kernfs_find_ns(parent, name, ns); in kernfs_remove_by_name_ns()
1692 if (kn) { in kernfs_remove_by_name_ns()
1693 kernfs_get(kn); in kernfs_remove_by_name_ns()
1694 __kernfs_remove(kn); in kernfs_remove_by_name_ns()
1695 kernfs_put(kn); in kernfs_remove_by_name_ns()
1700 if (kn) in kernfs_remove_by_name_ns()
1715 int kernfs_rename_ns(struct kernfs_node *kn, struct kernfs_node *new_parent, in kernfs_rename_ns() argument
1724 if (!kn->parent) in kernfs_rename_ns()
1727 root = kernfs_root(kn); in kernfs_rename_ns()
1731 if (!kernfs_active(kn) || !kernfs_active(new_parent) || in kernfs_rename_ns()
1736 if ((kn->parent == new_parent) && (kn->ns == new_ns) && in kernfs_rename_ns()
1737 (strcmp(kn->name, new_name) == 0)) in kernfs_rename_ns()
1745 if (strcmp(kn->name, new_name) != 0) { in kernfs_rename_ns()
1757 kernfs_unlink_sibling(kn); in kernfs_rename_ns()
1763 old_parent = kn->parent; in kernfs_rename_ns()
1764 kn->parent = new_parent; in kernfs_rename_ns()
1766 kn->ns = new_ns; in kernfs_rename_ns()
1768 old_name = kn->name; in kernfs_rename_ns()
1769 kn->name = new_name; in kernfs_rename_ns()
1774 kn->hash = kernfs_name_hash(kn->name, kn->ns); in kernfs_rename_ns()
1775 kernfs_link_sibling(kn); in kernfs_rename_ns()