• Home
  • Raw
  • Download

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 return strlcpy(buf, kn->parent ? kn->name : "/", buflen); in kernfs_name_locked()
47 static char * __must_check kernfs_path_locked(struct kernfs_node *kn, char *buf, in kernfs_path_locked() argument
56 len = strlen(kn->name); in kernfs_path_locked()
63 memcpy(p, kn->name, len); in kernfs_path_locked()
65 kn = kn->parent; in kernfs_path_locked()
66 } while (kn && kn->parent); in kernfs_path_locked()
83 int kernfs_name(struct kernfs_node *kn, char *buf, size_t buflen) in kernfs_name() argument
89 ret = kernfs_name_locked(kn, buf, buflen); in kernfs_name()
100 size_t kernfs_path_len(struct kernfs_node *kn) in kernfs_path_len() argument
108 len += strlen(kn->name) + 1; in kernfs_path_len()
109 kn = kn->parent; in kernfs_path_len()
110 } while (kn && kn->parent); in kernfs_path_len()
128 char *kernfs_path(struct kernfs_node *kn, char *buf, size_t buflen) in kernfs_path() argument
134 p = kernfs_path_locked(kn, buf, buflen); in kernfs_path()
146 void pr_cont_kernfs_name(struct kernfs_node *kn) in pr_cont_kernfs_name() argument
152 kernfs_name_locked(kn, kernfs_pr_cont_buf, sizeof(kernfs_pr_cont_buf)); in pr_cont_kernfs_name()
164 void pr_cont_kernfs_path(struct kernfs_node *kn) in pr_cont_kernfs_path() argument
171 p = kernfs_path_locked(kn, kernfs_pr_cont_buf, in pr_cont_kernfs_path()
188 struct kernfs_node *kernfs_get_parent(struct kernfs_node *kn) in kernfs_get_parent() argument
194 parent = kn->parent; in kernfs_get_parent()
225 const void *ns, const struct kernfs_node *kn) in kernfs_name_compare() argument
227 if (hash < kn->hash) in kernfs_name_compare()
229 if (hash > kn->hash) in kernfs_name_compare()
231 if (ns < kn->ns) in kernfs_name_compare()
233 if (ns > kn->ns) in kernfs_name_compare()
235 return strcmp(name, kn->name); in kernfs_name_compare()
257 static int kernfs_link_sibling(struct kernfs_node *kn) in kernfs_link_sibling() argument
259 struct rb_node **node = &kn->parent->dir.children.rb_node; in kernfs_link_sibling()
268 result = kernfs_sd_compare(kn, pos); in kernfs_link_sibling()
278 rb_link_node(&kn->rb, parent, node); in kernfs_link_sibling()
279 rb_insert_color(&kn->rb, &kn->parent->dir.children); in kernfs_link_sibling()
282 if (kernfs_type(kn) == KERNFS_DIR) in kernfs_link_sibling()
283 kn->parent->dir.subdirs++; in kernfs_link_sibling()
299 static bool kernfs_unlink_sibling(struct kernfs_node *kn) in kernfs_unlink_sibling() argument
301 if (RB_EMPTY_NODE(&kn->rb)) in kernfs_unlink_sibling()
304 if (kernfs_type(kn) == KERNFS_DIR) in kernfs_unlink_sibling()
305 kn->parent->dir.subdirs--; in kernfs_unlink_sibling()
307 rb_erase(&kn->rb, &kn->parent->dir.children); in kernfs_unlink_sibling()
308 RB_CLEAR_NODE(&kn->rb); in kernfs_unlink_sibling()
322 struct kernfs_node *kernfs_get_active(struct kernfs_node *kn) in kernfs_get_active() argument
324 if (unlikely(!kn)) in kernfs_get_active()
327 if (!atomic_inc_unless_negative(&kn->active)) in kernfs_get_active()
330 if (kernfs_lockdep(kn)) in kernfs_get_active()
331 rwsem_acquire_read(&kn->dep_map, 0, 1, _RET_IP_); in kernfs_get_active()
332 return kn; in kernfs_get_active()
342 void kernfs_put_active(struct kernfs_node *kn) in kernfs_put_active() argument
344 struct kernfs_root *root = kernfs_root(kn); in kernfs_put_active()
347 if (unlikely(!kn)) in kernfs_put_active()
350 if (kernfs_lockdep(kn)) in kernfs_put_active()
351 rwsem_release(&kn->dep_map, 1, _RET_IP_); in kernfs_put_active()
352 v = atomic_dec_return(&kn->active); in kernfs_put_active()
367 static void kernfs_drain(struct kernfs_node *kn) in kernfs_drain() argument
370 struct kernfs_root *root = kernfs_root(kn); in kernfs_drain()
373 WARN_ON_ONCE(kernfs_active(kn)); in kernfs_drain()
377 if (kernfs_lockdep(kn)) { in kernfs_drain()
378 rwsem_acquire(&kn->dep_map, 0, 0, _RET_IP_); in kernfs_drain()
379 if (atomic_read(&kn->active) != KN_DEACTIVATED_BIAS) in kernfs_drain()
380 lock_contended(&kn->dep_map, _RET_IP_); in kernfs_drain()
385 atomic_read(&kn->active) == KN_DEACTIVATED_BIAS); in kernfs_drain()
387 if (kernfs_lockdep(kn)) { in kernfs_drain()
388 lock_acquired(&kn->dep_map, _RET_IP_); in kernfs_drain()
389 rwsem_release(&kn->dep_map, 1, _RET_IP_); in kernfs_drain()
392 kernfs_unmap_bin_file(kn); in kernfs_drain()
401 void kernfs_get(struct kernfs_node *kn) in kernfs_get() argument
403 if (kn) { in kernfs_get()
404 WARN_ON(!atomic_read(&kn->count)); in kernfs_get()
405 atomic_inc(&kn->count); in kernfs_get()
416 void kernfs_put(struct kernfs_node *kn) in kernfs_put() argument
421 if (!kn || !atomic_dec_and_test(&kn->count)) in kernfs_put()
423 root = kernfs_root(kn); in kernfs_put()
429 parent = kn->parent; in kernfs_put()
431 WARN_ONCE(atomic_read(&kn->active) != KN_DEACTIVATED_BIAS, in kernfs_put()
433 parent ? parent->name : "", kn->name, atomic_read(&kn->active)); in kernfs_put()
435 if (kernfs_type(kn) == KERNFS_LINK) in kernfs_put()
436 kernfs_put(kn->symlink.target_kn); in kernfs_put()
438 kfree_const(kn->name); in kernfs_put()
440 if (kn->iattr) { in kernfs_put()
441 if (kn->iattr->ia_secdata) in kernfs_put()
442 security_release_secctx(kn->iattr->ia_secdata, in kernfs_put()
443 kn->iattr->ia_secdata_len); in kernfs_put()
444 simple_xattrs_free(&kn->iattr->xattrs); in kernfs_put()
446 kfree(kn->iattr); in kernfs_put()
447 ida_simple_remove(&root->ino_ida, kn->ino); in kernfs_put()
448 kmem_cache_free(kernfs_node_cache, kn); in kernfs_put()
450 kn = parent; in kernfs_put()
451 if (kn) { in kernfs_put()
452 if (atomic_dec_and_test(&kn->count)) in kernfs_put()
464 struct kernfs_node *kn; in kernfs_dop_revalidate() local
473 kn = dentry->d_fsdata; in kernfs_dop_revalidate()
477 if (!kernfs_active(kn)) in kernfs_dop_revalidate()
481 if (dentry->d_parent->d_fsdata != kn->parent) in kernfs_dop_revalidate()
485 if (strcmp(dentry->d_name.name, kn->name) != 0) in kernfs_dop_revalidate()
489 if (kn->parent && kernfs_ns_enabled(kn->parent) && in kernfs_dop_revalidate()
490 kernfs_info(dentry->d_sb)->ns != kn->ns) in kernfs_dop_revalidate()
533 struct kernfs_node *kn; in __kernfs_new_node() local
540 kn = kmem_cache_zalloc(kernfs_node_cache, GFP_KERNEL); in __kernfs_new_node()
541 if (!kn) in __kernfs_new_node()
554 kn->ino = ret; in __kernfs_new_node()
556 atomic_set(&kn->count, 1); in __kernfs_new_node()
557 atomic_set(&kn->active, KN_DEACTIVATED_BIAS); in __kernfs_new_node()
558 RB_CLEAR_NODE(&kn->rb); in __kernfs_new_node()
560 kn->name = name; in __kernfs_new_node()
561 kn->mode = mode; in __kernfs_new_node()
562 kn->flags = flags; in __kernfs_new_node()
564 return kn; in __kernfs_new_node()
567 kmem_cache_free(kernfs_node_cache, kn); in __kernfs_new_node()
577 struct kernfs_node *kn; in kernfs_new_node() local
579 kn = __kernfs_new_node(kernfs_root(parent), name, mode, flags); in kernfs_new_node()
580 if (kn) { in kernfs_new_node()
582 kn->parent = parent; in kernfs_new_node()
584 return kn; in kernfs_new_node()
599 int kernfs_add_one(struct kernfs_node *kn) in kernfs_add_one() argument
601 struct kernfs_node *parent = kn->parent; in kernfs_add_one()
610 if (WARN(has_ns != (bool)kn->ns, KERN_WARNING "kernfs: ns %s in '%s' for '%s'\n", in kernfs_add_one()
611 has_ns ? "required" : "invalid", parent->name, kn->name)) in kernfs_add_one()
624 kn->hash = kernfs_name_hash(kn->name, kn->ns); in kernfs_add_one()
626 ret = kernfs_link_sibling(kn); in kernfs_add_one()
646 if (!(kernfs_root(kn)->flags & KERNFS_ROOT_CREATE_DEACTIVATED)) in kernfs_add_one()
647 kernfs_activate(kn); in kernfs_add_one()
682 struct kernfs_node *kn; in kernfs_find_ns() local
685 kn = rb_to_kn(node); in kernfs_find_ns()
686 result = kernfs_name_compare(hash, name, ns, kn); in kernfs_find_ns()
692 return kn; in kernfs_find_ns()
710 struct kernfs_node *kn; in kernfs_find_and_get_ns() local
713 kn = kernfs_find_ns(parent, name, ns); in kernfs_find_and_get_ns()
714 kernfs_get(kn); in kernfs_find_and_get_ns()
717 return kn; in kernfs_find_and_get_ns()
734 struct kernfs_node *kn; in kernfs_create_root() local
743 kn = __kernfs_new_node(root, "", S_IFDIR | S_IRUGO | S_IXUGO, in kernfs_create_root()
745 if (!kn) { in kernfs_create_root()
751 kn->priv = priv; in kernfs_create_root()
752 kn->dir.root = root; in kernfs_create_root()
756 root->kn = kn; in kernfs_create_root()
760 kernfs_activate(kn); in kernfs_create_root()
774 kernfs_remove(root->kn); /* will also free @root */ in kernfs_destroy_root()
791 struct kernfs_node *kn; in kernfs_create_dir_ns() local
795 kn = kernfs_new_node(parent, name, mode | S_IFDIR, KERNFS_DIR); in kernfs_create_dir_ns()
796 if (!kn) in kernfs_create_dir_ns()
799 kn->dir.root = parent->dir.root; in kernfs_create_dir_ns()
800 kn->ns = ns; in kernfs_create_dir_ns()
801 kn->priv = priv; in kernfs_create_dir_ns()
804 rc = kernfs_add_one(kn); in kernfs_create_dir_ns()
806 return kn; in kernfs_create_dir_ns()
808 kernfs_put(kn); in kernfs_create_dir_ns()
822 struct kernfs_node *kn; in kernfs_create_empty_dir() local
826 kn = kernfs_new_node(parent, name, S_IRUGO|S_IXUGO|S_IFDIR, KERNFS_DIR); in kernfs_create_empty_dir()
827 if (!kn) in kernfs_create_empty_dir()
830 kn->flags |= KERNFS_EMPTY_DIR; in kernfs_create_empty_dir()
831 kn->dir.root = parent->dir.root; in kernfs_create_empty_dir()
832 kn->ns = NULL; in kernfs_create_empty_dir()
833 kn->priv = NULL; in kernfs_create_empty_dir()
836 rc = kernfs_add_one(kn); in kernfs_create_empty_dir()
838 return kn; in kernfs_create_empty_dir()
840 kernfs_put(kn); in kernfs_create_empty_dir()
850 struct kernfs_node *kn; in kernfs_iop_lookup() local
859 kn = kernfs_find_ns(parent, dentry->d_name.name, ns); in kernfs_iop_lookup()
862 if (!kn || !kernfs_active(kn)) { in kernfs_iop_lookup()
866 kernfs_get(kn); in kernfs_iop_lookup()
867 dentry->d_fsdata = kn; in kernfs_iop_lookup()
870 inode = kernfs_get_inode(dir->i_sb, kn); in kernfs_iop_lookup()
904 struct kernfs_node *kn = dentry->d_fsdata; in kernfs_iop_rmdir() local
905 struct kernfs_syscall_ops *scops = kernfs_root(kn)->syscall_ops; in kernfs_iop_rmdir()
911 if (!kernfs_get_active(kn)) in kernfs_iop_rmdir()
914 ret = scops->rmdir(kn); in kernfs_iop_rmdir()
916 kernfs_put_active(kn); in kernfs_iop_rmdir()
923 struct kernfs_node *kn = old_dentry->d_fsdata; in kernfs_iop_rename() local
925 struct kernfs_syscall_ops *scops = kernfs_root(kn)->syscall_ops; in kernfs_iop_rename()
931 if (!kernfs_get_active(kn)) in kernfs_iop_rename()
935 kernfs_put_active(kn); in kernfs_iop_rename()
939 ret = scops->rename(kn, new_parent, new_dentry->d_name.name); in kernfs_iop_rename()
942 kernfs_put_active(kn); in kernfs_iop_rename()
1029 void kernfs_activate(struct kernfs_node *kn) in kernfs_activate() argument
1036 while ((pos = kernfs_next_descendant_post(pos, kn))) { in kernfs_activate()
1050 static void __kernfs_remove(struct kernfs_node *kn) in __kernfs_remove() argument
1061 if (!kn || (kn->parent && RB_EMPTY_NODE(&kn->rb))) in __kernfs_remove()
1064 pr_debug("kernfs %s: removing\n", kn->name); in __kernfs_remove()
1068 while ((pos = kernfs_next_descendant_post(pos, kn))) in __kernfs_remove()
1074 pos = kernfs_leftmost_descendant(kn); in __kernfs_remove()
1090 if (kn->flags & KERNFS_ACTIVATED) in __kernfs_remove()
1093 WARN_ON_ONCE(atomic_read(&kn->active) != KN_DEACTIVATED_BIAS); in __kernfs_remove()
1113 } while (pos != kn); in __kernfs_remove()
1122 void kernfs_remove(struct kernfs_node *kn) in kernfs_remove() argument
1125 __kernfs_remove(kn); in kernfs_remove()
1143 void kernfs_break_active_protection(struct kernfs_node *kn) in kernfs_break_active_protection() argument
1149 kernfs_put_active(kn); in kernfs_break_active_protection()
1167 void kernfs_unbreak_active_protection(struct kernfs_node *kn) in kernfs_unbreak_active_protection() argument
1178 atomic_inc(&kn->active); in kernfs_unbreak_active_protection()
1179 if (kernfs_lockdep(kn)) in kernfs_unbreak_active_protection()
1180 rwsem_acquire(&kn->dep_map, 0, 1, _RET_IP_); in kernfs_unbreak_active_protection()
1209 bool kernfs_remove_self(struct kernfs_node *kn) in kernfs_remove_self() argument
1214 kernfs_break_active_protection(kn); in kernfs_remove_self()
1225 if (!(kn->flags & KERNFS_SUICIDAL)) { in kernfs_remove_self()
1226 kn->flags |= KERNFS_SUICIDAL; in kernfs_remove_self()
1227 __kernfs_remove(kn); in kernfs_remove_self()
1228 kn->flags |= KERNFS_SUICIDED; in kernfs_remove_self()
1231 wait_queue_head_t *waitq = &kernfs_root(kn)->deactivate_waitq; in kernfs_remove_self()
1237 if ((kn->flags & KERNFS_SUICIDED) && in kernfs_remove_self()
1238 atomic_read(&kn->active) == KN_DEACTIVATED_BIAS) in kernfs_remove_self()
1246 WARN_ON_ONCE(!RB_EMPTY_NODE(&kn->rb)); in kernfs_remove_self()
1254 kernfs_unbreak_active_protection(kn); in kernfs_remove_self()
1272 struct kernfs_node *kn; in kernfs_remove_by_name_ns() local
1282 kn = kernfs_find_ns(parent, name, ns); in kernfs_remove_by_name_ns()
1283 if (kn) in kernfs_remove_by_name_ns()
1284 __kernfs_remove(kn); in kernfs_remove_by_name_ns()
1288 if (kn) in kernfs_remove_by_name_ns()
1301 int kernfs_rename_ns(struct kernfs_node *kn, struct kernfs_node *new_parent, in kernfs_rename_ns() argument
1309 if (!kn->parent) in kernfs_rename_ns()
1315 if (!kernfs_active(kn) || !kernfs_active(new_parent) || in kernfs_rename_ns()
1320 if ((kn->parent == new_parent) && (kn->ns == new_ns) && in kernfs_rename_ns()
1321 (strcmp(kn->name, new_name) == 0)) in kernfs_rename_ns()
1329 if (strcmp(kn->name, new_name) != 0) { in kernfs_rename_ns()
1341 kernfs_unlink_sibling(kn); in kernfs_rename_ns()
1347 old_parent = kn->parent; in kernfs_rename_ns()
1348 kn->parent = new_parent; in kernfs_rename_ns()
1350 kn->ns = new_ns; in kernfs_rename_ns()
1352 old_name = kn->name; in kernfs_rename_ns()
1353 kn->name = new_name; in kernfs_rename_ns()
1358 kn->hash = kernfs_name_hash(kn->name, kn->ns); in kernfs_rename_ns()
1359 kernfs_link_sibling(kn); in kernfs_rename_ns()
1371 static inline unsigned char dt_type(struct kernfs_node *kn) in dt_type() argument
1373 return (kn->mode >> 12) & 15; in dt_type()