Lines Matching full:tree

46  * the same tree.
53 * tree.chunks anchors chunk.owners[].list hash_lock
54 * tree.rules anchors rule.rlist audit_filter_mutex
55 * chunk.trees anchors tree.same_root hash_lock
59 * tree is refcounted; one reference for "some rules on rules_list refer to
75 struct audit_tree *tree; in alloc_tree() local
77 tree = kmalloc(sizeof(struct audit_tree) + strlen(s) + 1, GFP_KERNEL); in alloc_tree()
78 if (tree) { in alloc_tree()
79 atomic_set(&tree->count, 1); in alloc_tree()
80 tree->goner = 0; in alloc_tree()
81 INIT_LIST_HEAD(&tree->chunks); in alloc_tree()
82 INIT_LIST_HEAD(&tree->rules); in alloc_tree()
83 INIT_LIST_HEAD(&tree->list); in alloc_tree()
84 INIT_LIST_HEAD(&tree->same_root); in alloc_tree()
85 tree->root = NULL; in alloc_tree()
86 strcpy(tree->pathname, s); in alloc_tree()
88 return tree; in alloc_tree()
91 static inline void get_tree(struct audit_tree *tree) in get_tree() argument
93 atomic_inc(&tree->count); in get_tree()
96 static inline void put_tree(struct audit_tree *tree) in put_tree() argument
98 if (atomic_dec_and_test(&tree->count)) in put_tree()
99 kfree_rcu(tree, head); in put_tree()
103 const char *audit_tree_path(struct audit_tree *tree) in audit_tree_path() argument
105 return tree->pathname; in audit_tree_path()
198 int audit_tree_match(struct audit_chunk *chunk, struct audit_tree *tree) in audit_tree_match() argument
202 if (chunk->owners[n].owner == tree) in audit_tree_match()
316 static int create_chunk(struct inode *inode, struct audit_tree *tree) in create_chunk() argument
331 if (tree->goner) { in create_chunk()
340 chunk->owners[0].owner = tree; in create_chunk()
341 get_tree(tree); in create_chunk()
342 list_add(&chunk->owners[0].list, &tree->chunks); in create_chunk()
343 if (!tree->root) { in create_chunk()
344 tree->root = chunk; in create_chunk()
345 list_add(&tree->same_root, &chunk->trees); in create_chunk()
353 /* the first tagged inode becomes root of tree */
354 static int tag_chunk(struct inode *inode, struct audit_tree *tree) in tag_chunk() argument
364 return create_chunk(inode, tree); in tag_chunk()
371 if (old->owners[n].owner == tree) { in tag_chunk()
409 if (tree->goner) { in tag_chunk()
432 p->owner = tree; in tag_chunk()
433 get_tree(tree); in tag_chunk()
434 list_add(&p->list, &tree->chunks); in tag_chunk()
439 if (!tree->root) { in tag_chunk()
440 tree->root = chunk; in tag_chunk()
441 list_add(&tree->same_root, &chunk->trees); in tag_chunk()
452 static void kill_rules(struct audit_tree *tree) in kill_rules() argument
458 list_for_each_entry_safe(rule, next, &tree->rules, rlist) { in kill_rules()
462 if (rule->tree) { in kill_rules()
468 audit_log_untrustedstring(ab, rule->tree->pathname); in kill_rules()
472 rule->tree = NULL; in kill_rules()
497 /* trim the uncommitted chunks from tree */
499 static void trim_marked(struct audit_tree *tree) in trim_marked() argument
503 if (tree->goner) { in trim_marked()
508 for (p = tree->chunks.next; p != &tree->chunks; p = q) { in trim_marked()
513 list_add(p, &tree->chunks); in trim_marked()
517 while (!list_empty(&tree->chunks)) { in trim_marked()
520 node = list_entry(tree->chunks.next, struct node, list); in trim_marked()
528 if (!tree->root && !tree->goner) { in trim_marked()
529 tree->goner = 1; in trim_marked()
532 kill_rules(tree); in trim_marked()
533 list_del_init(&tree->list); in trim_marked()
535 prune_one(tree); in trim_marked()
546 struct audit_tree *tree; in audit_remove_tree_rule() local
547 tree = rule->tree; in audit_remove_tree_rule()
548 if (tree) { in audit_remove_tree_rule()
551 if (list_empty(&tree->rules) && !tree->goner) { in audit_remove_tree_rule()
552 tree->root = NULL; in audit_remove_tree_rule()
553 list_del_init(&tree->same_root); in audit_remove_tree_rule()
554 tree->goner = 1; in audit_remove_tree_rule()
555 list_move(&tree->list, &prune_list); in audit_remove_tree_rule()
556 rule->tree = NULL; in audit_remove_tree_rule()
561 rule->tree = NULL; in audit_remove_tree_rule()
580 struct audit_tree *tree; in audit_trim_trees() local
586 tree = container_of(cursor.next, struct audit_tree, list); in audit_trim_trees()
587 get_tree(tree); in audit_trim_trees()
589 list_add(&cursor, &tree->list); in audit_trim_trees()
592 err = kern_path(tree->pathname, 0, &path); in audit_trim_trees()
602 list_for_each_entry(node, &tree->chunks, list) { in audit_trim_trees()
611 trim_marked(tree); in audit_trim_trees()
612 put_tree(tree); in audit_trim_trees()
627 rule->inode_f || rule->watch || rule->tree) in audit_make_tree()
629 rule->tree = alloc_tree(pathname); in audit_make_tree()
630 if (!rule->tree) in audit_make_tree()
635 void audit_put_tree(struct audit_tree *tree) in audit_put_tree() argument
637 put_tree(tree); in audit_put_tree()
648 struct audit_tree *seed = rule->tree, *tree; in audit_add_tree_rule() local
653 list_for_each_entry(tree, &tree_list, list) { in audit_add_tree_rule()
654 if (!strcmp(seed->pathname, tree->pathname)) { in audit_add_tree_rule()
656 rule->tree = tree; in audit_add_tree_rule()
657 list_add(&rule->rlist, &tree->rules); in audit_add_tree_rule()
661 tree = seed; in audit_add_tree_rule()
662 list_add(&tree->list, &tree_list); in audit_add_tree_rule()
663 list_add(&rule->rlist, &tree->rules); in audit_add_tree_rule()
664 /* do not set rule->tree yet */ in audit_add_tree_rule()
667 err = kern_path(tree->pathname, 0, &path); in audit_add_tree_rule()
677 get_tree(tree); in audit_add_tree_rule()
678 err = iterate_mounts(tag_mount, tree, mnt); in audit_add_tree_rule()
684 list_for_each_entry(node, &tree->chunks, list) in audit_add_tree_rule()
688 trim_marked(tree); in audit_add_tree_rule()
694 put_tree(tree); in audit_add_tree_rule()
697 rule->tree = tree; in audit_add_tree_rule()
698 put_tree(tree); in audit_add_tree_rule()
703 list_del_init(&tree->list); in audit_add_tree_rule()
704 list_del_init(&tree->rules); in audit_add_tree_rule()
705 put_tree(tree); in audit_add_tree_rule()
736 struct audit_tree *tree; in audit_tag_tree() local
739 tree = container_of(cursor.next, struct audit_tree, list); in audit_tag_tree()
740 get_tree(tree); in audit_tag_tree()
742 list_add(&cursor, &tree->list); in audit_tag_tree()
745 err = kern_path(tree->pathname, 0, &path2); in audit_tag_tree()
752 put_tree(tree); in audit_tag_tree()
757 failed = iterate_mounts(tag_mount, tree, tagged); in audit_tag_tree()
759 put_tree(tree); in audit_tag_tree()
766 if (!tree->goner) { in audit_tag_tree()
767 list_del(&tree->list); in audit_tag_tree()
768 list_add(&tree->list, &tree_list); in audit_tag_tree()
771 put_tree(tree); in audit_tag_tree()
775 struct audit_tree *tree; in audit_tag_tree() local
777 tree = container_of(barrier.prev, struct audit_tree, list); in audit_tag_tree()
778 get_tree(tree); in audit_tag_tree()
779 list_del(&tree->list); in audit_tag_tree()
780 list_add(&tree->list, &barrier); in audit_tag_tree()
786 list_for_each_entry(node, &tree->chunks, list) in audit_tag_tree()
790 trim_marked(tree); in audit_tag_tree()
793 put_tree(tree); in audit_tag_tree()