Lines Matching refs:kn
27 static bool kernfs_active(struct kernfs_node *kn) in kernfs_active() argument
30 return atomic_read(&kn->active) >= 0; in kernfs_active()
33 static bool kernfs_lockdep(struct kernfs_node *kn) in kernfs_lockdep() argument
36 return kn->flags & KERNFS_LOCKDEP; in kernfs_lockdep()
42 static int kernfs_name_locked(struct kernfs_node *kn, char *buf, size_t buflen) in kernfs_name_locked() argument
44 if (!kn) in kernfs_name_locked()
47 return strlcpy(buf, kn->parent ? kn->name : "/", buflen); in kernfs_name_locked()
71 da = kernfs_depth(ra->kn, a); in kernfs_common_ancestor()
72 db = kernfs_depth(rb->kn, b); in kernfs_common_ancestor()
126 struct kernfs_node *kn, *common; in kernfs_path_from_node_locked() local
135 kn_from = kernfs_root(kn_to)->kn; in kernfs_path_from_node_locked()
158 for (kn = kn_to, j = 0; j < i; j++) in kernfs_path_from_node_locked()
159 kn = kn->parent; in kernfs_path_from_node_locked()
162 len += strlcpy(buf + len, kn->name, in kernfs_path_from_node_locked()
183 int kernfs_name(struct kernfs_node *kn, char *buf, size_t buflen) in kernfs_name() argument
189 ret = kernfs_name_locked(kn, buf, buflen); in kernfs_name()
229 void pr_cont_kernfs_name(struct kernfs_node *kn) in pr_cont_kernfs_name() argument
235 kernfs_name_locked(kn, kernfs_pr_cont_buf, sizeof(kernfs_pr_cont_buf)); in pr_cont_kernfs_name()
247 void pr_cont_kernfs_path(struct kernfs_node *kn) in pr_cont_kernfs_path() argument
254 sz = kernfs_path_from_node_locked(kn, NULL, kernfs_pr_cont_buf, in pr_cont_kernfs_path()
279 struct kernfs_node *kernfs_get_parent(struct kernfs_node *kn) in kernfs_get_parent() argument
285 parent = kn->parent; in kernfs_get_parent()
316 const void *ns, const struct kernfs_node *kn) in kernfs_name_compare() argument
318 if (hash < kn->hash) in kernfs_name_compare()
320 if (hash > kn->hash) in kernfs_name_compare()
322 if (ns < kn->ns) in kernfs_name_compare()
324 if (ns > kn->ns) in kernfs_name_compare()
326 return strcmp(name, kn->name); in kernfs_name_compare()
348 static int kernfs_link_sibling(struct kernfs_node *kn) in kernfs_link_sibling() argument
350 struct rb_node **node = &kn->parent->dir.children.rb_node; in kernfs_link_sibling()
359 result = kernfs_sd_compare(kn, pos); in kernfs_link_sibling()
369 rb_link_node(&kn->rb, parent, node); in kernfs_link_sibling()
370 rb_insert_color(&kn->rb, &kn->parent->dir.children); in kernfs_link_sibling()
373 if (kernfs_type(kn) == KERNFS_DIR) in kernfs_link_sibling()
374 kn->parent->dir.subdirs++; in kernfs_link_sibling()
390 static bool kernfs_unlink_sibling(struct kernfs_node *kn) in kernfs_unlink_sibling() argument
392 if (RB_EMPTY_NODE(&kn->rb)) in kernfs_unlink_sibling()
395 if (kernfs_type(kn) == KERNFS_DIR) in kernfs_unlink_sibling()
396 kn->parent->dir.subdirs--; in kernfs_unlink_sibling()
398 rb_erase(&kn->rb, &kn->parent->dir.children); in kernfs_unlink_sibling()
399 RB_CLEAR_NODE(&kn->rb); in kernfs_unlink_sibling()
413 struct kernfs_node *kernfs_get_active(struct kernfs_node *kn) in kernfs_get_active() argument
415 if (unlikely(!kn)) in kernfs_get_active()
418 if (!atomic_inc_unless_negative(&kn->active)) in kernfs_get_active()
421 if (kernfs_lockdep(kn)) in kernfs_get_active()
422 rwsem_acquire_read(&kn->dep_map, 0, 1, _RET_IP_); in kernfs_get_active()
423 return kn; in kernfs_get_active()
433 void kernfs_put_active(struct kernfs_node *kn) in kernfs_put_active() argument
437 if (unlikely(!kn)) in kernfs_put_active()
440 if (kernfs_lockdep(kn)) in kernfs_put_active()
441 rwsem_release(&kn->dep_map, 1, _RET_IP_); in kernfs_put_active()
442 v = atomic_dec_return(&kn->active); in kernfs_put_active()
446 wake_up_all(&kernfs_root(kn)->deactivate_waitq); in kernfs_put_active()
457 static void kernfs_drain(struct kernfs_node *kn) in kernfs_drain() argument
460 struct kernfs_root *root = kernfs_root(kn); in kernfs_drain()
463 WARN_ON_ONCE(kernfs_active(kn)); in kernfs_drain()
467 if (kernfs_lockdep(kn)) { in kernfs_drain()
468 rwsem_acquire(&kn->dep_map, 0, 0, _RET_IP_); in kernfs_drain()
469 if (atomic_read(&kn->active) != KN_DEACTIVATED_BIAS) in kernfs_drain()
470 lock_contended(&kn->dep_map, _RET_IP_); in kernfs_drain()
475 atomic_read(&kn->active) == KN_DEACTIVATED_BIAS); in kernfs_drain()
477 if (kernfs_lockdep(kn)) { in kernfs_drain()
478 lock_acquired(&kn->dep_map, _RET_IP_); in kernfs_drain()
479 rwsem_release(&kn->dep_map, 1, _RET_IP_); in kernfs_drain()
482 kernfs_drain_open_files(kn); in kernfs_drain()
491 void kernfs_get(struct kernfs_node *kn) in kernfs_get() argument
493 if (kn) { in kernfs_get()
494 WARN_ON(!atomic_read(&kn->count)); in kernfs_get()
495 atomic_inc(&kn->count); in kernfs_get()
506 void kernfs_put(struct kernfs_node *kn) in kernfs_put() argument
515 if (!kn || !atomic_dec_and_test(&kn->count)) in kernfs_put()
517 root = kernfs_root(kn); in kernfs_put()
523 parent = kn->parent; in kernfs_put()
525 WARN_ONCE(atomic_read(&kn->active) != KN_DEACTIVATED_BIAS, in kernfs_put()
527 parent ? parent->name : "", kn->name, atomic_read(&kn->active)); in kernfs_put()
529 if (kernfs_type(kn) == KERNFS_LINK) in kernfs_put()
530 kernfs_put(kn->symlink.target_kn); in kernfs_put()
532 kfree_const(kn->name); in kernfs_put()
534 if (kn->iattr) { in kernfs_put()
535 simple_xattrs_free(&kn->iattr->xattrs); in kernfs_put()
536 kmem_cache_free(kernfs_iattrs_cache, kn->iattr); in kernfs_put()
539 idr_remove(&root->ino_idr, kn->id.ino); in kernfs_put()
541 kmem_cache_free(kernfs_node_cache, kn); in kernfs_put()
543 kn = parent; in kernfs_put()
544 if (kn) { in kernfs_put()
545 if (atomic_dec_and_test(&kn->count)) in kernfs_put()
557 struct kernfs_node *kn; in kernfs_dop_revalidate() local
566 kn = kernfs_dentry_node(dentry); in kernfs_dop_revalidate()
570 if (!kernfs_active(kn)) in kernfs_dop_revalidate()
574 if (kernfs_dentry_node(dentry->d_parent) != kn->parent) in kernfs_dop_revalidate()
578 if (strcmp(dentry->d_name.name, kn->name) != 0) in kernfs_dop_revalidate()
582 if (kn->parent && kernfs_ns_enabled(kn->parent) && in kernfs_dop_revalidate()
583 kernfs_info(dentry->d_sb)->ns != kn->ns) in kernfs_dop_revalidate()
623 struct kernfs_node *kn; in __kernfs_new_node() local
632 kn = kmem_cache_zalloc(kernfs_node_cache, GFP_KERNEL); in __kernfs_new_node()
633 if (!kn) in __kernfs_new_node()
639 ret = idr_alloc_cyclic(&root->ino_idr, kn, 1, 0, GFP_ATOMIC); in __kernfs_new_node()
647 kn->id.ino = ret; in __kernfs_new_node()
648 kn->id.generation = gen; in __kernfs_new_node()
654 atomic_set_release(&kn->count, 1); in __kernfs_new_node()
655 atomic_set(&kn->active, KN_DEACTIVATED_BIAS); in __kernfs_new_node()
656 RB_CLEAR_NODE(&kn->rb); in __kernfs_new_node()
658 kn->name = name; in __kernfs_new_node()
659 kn->mode = mode; in __kernfs_new_node()
660 kn->flags = flags; in __kernfs_new_node()
669 ret = __kernfs_setattr(kn, &iattr); in __kernfs_new_node()
675 ret = security_kernfs_init_security(parent, kn); in __kernfs_new_node()
680 return kn; in __kernfs_new_node()
683 idr_remove(&root->ino_idr, kn->id.ino); in __kernfs_new_node()
685 kmem_cache_free(kernfs_node_cache, kn); in __kernfs_new_node()
696 struct kernfs_node *kn; in kernfs_new_node() local
698 kn = __kernfs_new_node(kernfs_root(parent), parent, in kernfs_new_node()
700 if (kn) { in kernfs_new_node()
702 kn->parent = parent; in kernfs_new_node()
704 return kn; in kernfs_new_node()
718 struct kernfs_node *kn; in kernfs_find_and_get_node_by_ino() local
721 kn = idr_find(&root->ino_idr, ino); in kernfs_find_and_get_node_by_ino()
722 if (!kn) in kernfs_find_and_get_node_by_ino()
732 if (!atomic_inc_not_zero(&kn->count)) { in kernfs_find_and_get_node_by_ino()
733 kn = NULL; in kernfs_find_and_get_node_by_ino()
744 if (kn->id.ino != ino) in kernfs_find_and_get_node_by_ino()
748 return kn; in kernfs_find_and_get_node_by_ino()
751 kernfs_put(kn); in kernfs_find_and_get_node_by_ino()
767 int kernfs_add_one(struct kernfs_node *kn) in kernfs_add_one() argument
769 struct kernfs_node *parent = kn->parent; in kernfs_add_one()
778 if (WARN(has_ns != (bool)kn->ns, KERN_WARNING "kernfs: ns %s in '%s' for '%s'\n", in kernfs_add_one()
779 has_ns ? "required" : "invalid", parent->name, kn->name)) in kernfs_add_one()
792 kn->hash = kernfs_name_hash(kn->name, kn->ns); in kernfs_add_one()
794 ret = kernfs_link_sibling(kn); in kernfs_add_one()
814 if (!(kernfs_root(kn)->flags & KERNFS_ROOT_CREATE_DEACTIVATED)) in kernfs_add_one()
815 kernfs_activate(kn); in kernfs_add_one()
850 struct kernfs_node *kn; in kernfs_find_ns() local
853 kn = rb_to_kn(node); in kernfs_find_ns()
854 result = kernfs_name_compare(hash, name, ns, kn); in kernfs_find_ns()
860 return kn; in kernfs_find_ns()
910 struct kernfs_node *kn; in kernfs_find_and_get_ns() local
913 kn = kernfs_find_ns(parent, name, ns); in kernfs_find_and_get_ns()
914 kernfs_get(kn); in kernfs_find_and_get_ns()
917 return kn; in kernfs_find_and_get_ns()
934 struct kernfs_node *kn; in kernfs_walk_and_get_ns() local
937 kn = kernfs_walk_ns(parent, path, ns); in kernfs_walk_and_get_ns()
938 kernfs_get(kn); in kernfs_walk_and_get_ns()
941 return kn; in kernfs_walk_and_get_ns()
957 struct kernfs_node *kn; in kernfs_create_root() local
967 kn = __kernfs_new_node(root, NULL, "", S_IFDIR | S_IRUGO | S_IXUGO, in kernfs_create_root()
970 if (!kn) { in kernfs_create_root()
976 kn->priv = priv; in kernfs_create_root()
977 kn->dir.root = root; in kernfs_create_root()
981 root->kn = kn; in kernfs_create_root()
985 kernfs_activate(kn); in kernfs_create_root()
999 kernfs_remove(root->kn); /* will also free @root */ in kernfs_destroy_root()
1019 struct kernfs_node *kn; in kernfs_create_dir_ns() local
1023 kn = kernfs_new_node(parent, name, mode | S_IFDIR, in kernfs_create_dir_ns()
1025 if (!kn) in kernfs_create_dir_ns()
1028 kn->dir.root = parent->dir.root; in kernfs_create_dir_ns()
1029 kn->ns = ns; in kernfs_create_dir_ns()
1030 kn->priv = priv; in kernfs_create_dir_ns()
1033 rc = kernfs_add_one(kn); in kernfs_create_dir_ns()
1035 return kn; in kernfs_create_dir_ns()
1037 kernfs_put(kn); in kernfs_create_dir_ns()
1051 struct kernfs_node *kn; in kernfs_create_empty_dir() local
1055 kn = kernfs_new_node(parent, name, S_IRUGO|S_IXUGO|S_IFDIR, in kernfs_create_empty_dir()
1057 if (!kn) in kernfs_create_empty_dir()
1060 kn->flags |= KERNFS_EMPTY_DIR; in kernfs_create_empty_dir()
1061 kn->dir.root = parent->dir.root; in kernfs_create_empty_dir()
1062 kn->ns = NULL; in kernfs_create_empty_dir()
1063 kn->priv = NULL; in kernfs_create_empty_dir()
1066 rc = kernfs_add_one(kn); in kernfs_create_empty_dir()
1068 return kn; in kernfs_create_empty_dir()
1070 kernfs_put(kn); in kernfs_create_empty_dir()
1080 struct kernfs_node *kn; in kernfs_iop_lookup() local
1089 kn = kernfs_find_ns(parent, dentry->d_name.name, ns); in kernfs_iop_lookup()
1092 if (!kn || !kernfs_active(kn)) { in kernfs_iop_lookup()
1098 inode = kernfs_get_inode(dir->i_sb, kn); in kernfs_iop_lookup()
1132 struct kernfs_node *kn = kernfs_dentry_node(dentry); in kernfs_iop_rmdir() local
1133 struct kernfs_syscall_ops *scops = kernfs_root(kn)->syscall_ops; in kernfs_iop_rmdir()
1139 if (!kernfs_get_active(kn)) in kernfs_iop_rmdir()
1142 ret = scops->rmdir(kn); in kernfs_iop_rmdir()
1144 kernfs_put_active(kn); in kernfs_iop_rmdir()
1152 struct kernfs_node *kn = kernfs_dentry_node(old_dentry); in kernfs_iop_rename() local
1154 struct kernfs_syscall_ops *scops = kernfs_root(kn)->syscall_ops; in kernfs_iop_rename()
1163 if (!kernfs_get_active(kn)) in kernfs_iop_rename()
1167 kernfs_put_active(kn); in kernfs_iop_rename()
1171 ret = scops->rename(kn, new_parent, new_dentry->d_name.name); in kernfs_iop_rename()
1174 kernfs_put_active(kn); in kernfs_iop_rename()
1258 void kernfs_activate(struct kernfs_node *kn) in kernfs_activate() argument
1265 while ((pos = kernfs_next_descendant_post(pos, kn))) { in kernfs_activate()
1279 static void __kernfs_remove(struct kernfs_node *kn) in __kernfs_remove() argument
1290 if (!kn || (kn->parent && RB_EMPTY_NODE(&kn->rb))) in __kernfs_remove()
1293 pr_debug("kernfs %s: removing\n", kn->name); in __kernfs_remove()
1297 while ((pos = kernfs_next_descendant_post(pos, kn))) in __kernfs_remove()
1303 pos = kernfs_leftmost_descendant(kn); in __kernfs_remove()
1319 if (kn->flags & KERNFS_ACTIVATED) in __kernfs_remove()
1322 WARN_ON_ONCE(atomic_read(&kn->active) != KN_DEACTIVATED_BIAS); in __kernfs_remove()
1342 } while (pos != kn); in __kernfs_remove()
1351 void kernfs_remove(struct kernfs_node *kn) in kernfs_remove() argument
1354 __kernfs_remove(kn); in kernfs_remove()
1372 void kernfs_break_active_protection(struct kernfs_node *kn) in kernfs_break_active_protection() argument
1378 kernfs_put_active(kn); in kernfs_break_active_protection()
1396 void kernfs_unbreak_active_protection(struct kernfs_node *kn) in kernfs_unbreak_active_protection() argument
1407 atomic_inc(&kn->active); in kernfs_unbreak_active_protection()
1408 if (kernfs_lockdep(kn)) in kernfs_unbreak_active_protection()
1409 rwsem_acquire(&kn->dep_map, 0, 1, _RET_IP_); in kernfs_unbreak_active_protection()
1438 bool kernfs_remove_self(struct kernfs_node *kn) in kernfs_remove_self() argument
1443 kernfs_break_active_protection(kn); in kernfs_remove_self()
1454 if (!(kn->flags & KERNFS_SUICIDAL)) { in kernfs_remove_self()
1455 kn->flags |= KERNFS_SUICIDAL; in kernfs_remove_self()
1456 __kernfs_remove(kn); in kernfs_remove_self()
1457 kn->flags |= KERNFS_SUICIDED; in kernfs_remove_self()
1460 wait_queue_head_t *waitq = &kernfs_root(kn)->deactivate_waitq; in kernfs_remove_self()
1466 if ((kn->flags & KERNFS_SUICIDED) && in kernfs_remove_self()
1467 atomic_read(&kn->active) == KN_DEACTIVATED_BIAS) in kernfs_remove_self()
1475 WARN_ON_ONCE(!RB_EMPTY_NODE(&kn->rb)); in kernfs_remove_self()
1483 kernfs_unbreak_active_protection(kn); in kernfs_remove_self()
1501 struct kernfs_node *kn; in kernfs_remove_by_name_ns() local
1511 kn = kernfs_find_ns(parent, name, ns); in kernfs_remove_by_name_ns()
1512 if (kn) in kernfs_remove_by_name_ns()
1513 __kernfs_remove(kn); in kernfs_remove_by_name_ns()
1517 if (kn) in kernfs_remove_by_name_ns()
1530 int kernfs_rename_ns(struct kernfs_node *kn, struct kernfs_node *new_parent, in kernfs_rename_ns() argument
1538 if (!kn->parent) in kernfs_rename_ns()
1544 if (!kernfs_active(kn) || !kernfs_active(new_parent) || in kernfs_rename_ns()
1549 if ((kn->parent == new_parent) && (kn->ns == new_ns) && in kernfs_rename_ns()
1550 (strcmp(kn->name, new_name) == 0)) in kernfs_rename_ns()
1558 if (strcmp(kn->name, new_name) != 0) { in kernfs_rename_ns()
1570 kernfs_unlink_sibling(kn); in kernfs_rename_ns()
1576 old_parent = kn->parent; in kernfs_rename_ns()
1577 kn->parent = new_parent; in kernfs_rename_ns()
1579 kn->ns = new_ns; in kernfs_rename_ns()
1581 old_name = kn->name; in kernfs_rename_ns()
1582 kn->name = new_name; in kernfs_rename_ns()
1587 kn->hash = kernfs_name_hash(kn->name, kn->ns); in kernfs_rename_ns()
1588 kernfs_link_sibling(kn); in kernfs_rename_ns()
1600 static inline unsigned char dt_type(struct kernfs_node *kn) in dt_type() argument
1602 return (kn->mode >> 12) & 15; in dt_type()