audit: Simplify locking around untag_chunk()
[sfrench/cifs-2.6.git] / kernel / audit_tree.c
1 // SPDX-License-Identifier: GPL-2.0
2 #include "audit.h"
3 #include <linux/fsnotify_backend.h>
4 #include <linux/namei.h>
5 #include <linux/mount.h>
6 #include <linux/kthread.h>
7 #include <linux/refcount.h>
8 #include <linux/slab.h>
9
10 struct audit_tree;
11 struct audit_chunk;
12
13 struct audit_tree {
14         refcount_t count;
15         int goner;
16         struct audit_chunk *root;
17         struct list_head chunks;
18         struct list_head rules;
19         struct list_head list;
20         struct list_head same_root;
21         struct rcu_head head;
22         char pathname[];
23 };
24
25 struct audit_chunk {
26         struct list_head hash;
27         unsigned long key;
28         struct fsnotify_mark *mark;
29         struct list_head trees;         /* with root here */
30         int dead;
31         int count;
32         atomic_long_t refs;
33         struct rcu_head head;
34         struct node {
35                 struct list_head list;
36                 struct audit_tree *owner;
37                 unsigned index;         /* index; upper bit indicates 'will prune' */
38         } owners[];
39 };
40
41 struct audit_tree_mark {
42         struct fsnotify_mark mark;
43         struct audit_chunk *chunk;
44 };
45
46 static LIST_HEAD(tree_list);
47 static LIST_HEAD(prune_list);
48 static struct task_struct *prune_thread;
49
50 /*
51  * One struct chunk is attached to each inode of interest.
52  * We replace struct chunk on tagging/untagging.
53  * Rules have pointer to struct audit_tree.
54  * Rules have struct list_head rlist forming a list of rules over
55  * the same tree.
56  * References to struct chunk are collected at audit_inode{,_child}()
57  * time and used in AUDIT_TREE rule matching.
58  * These references are dropped at the same time we are calling
59  * audit_free_names(), etc.
60  *
61  * Cyclic lists galore:
62  * tree.chunks anchors chunk.owners[].list                      hash_lock
63  * tree.rules anchors rule.rlist                                audit_filter_mutex
64  * chunk.trees anchors tree.same_root                           hash_lock
65  * chunk.hash is a hash with middle bits of watch.inode as
66  * a hash function.                                             RCU, hash_lock
67  *
68  * tree is refcounted; one reference for "some rules on rules_list refer to
69  * it", one for each chunk with pointer to it.
70  *
71  * chunk is refcounted by embedded fsnotify_mark + .refs (non-zero refcount
72  * of watch contributes 1 to .refs).
73  *
74  * node.index allows to get from node.list to containing chunk.
75  * MSB of that sucker is stolen to mark taggings that we might have to
76  * revert - several operations have very unpleasant cleanup logics and
77  * that makes a difference.  Some.
78  */
79
80 static struct fsnotify_group *audit_tree_group;
81 static struct kmem_cache *audit_tree_mark_cachep __read_mostly;
82
83 static struct audit_tree *alloc_tree(const char *s)
84 {
85         struct audit_tree *tree;
86
87         tree = kmalloc(sizeof(struct audit_tree) + strlen(s) + 1, GFP_KERNEL);
88         if (tree) {
89                 refcount_set(&tree->count, 1);
90                 tree->goner = 0;
91                 INIT_LIST_HEAD(&tree->chunks);
92                 INIT_LIST_HEAD(&tree->rules);
93                 INIT_LIST_HEAD(&tree->list);
94                 INIT_LIST_HEAD(&tree->same_root);
95                 tree->root = NULL;
96                 strcpy(tree->pathname, s);
97         }
98         return tree;
99 }
100
101 static inline void get_tree(struct audit_tree *tree)
102 {
103         refcount_inc(&tree->count);
104 }
105
106 static inline void put_tree(struct audit_tree *tree)
107 {
108         if (refcount_dec_and_test(&tree->count))
109                 kfree_rcu(tree, head);
110 }
111
112 /* to avoid bringing the entire thing in audit.h */
113 const char *audit_tree_path(struct audit_tree *tree)
114 {
115         return tree->pathname;
116 }
117
118 static void free_chunk(struct audit_chunk *chunk)
119 {
120         int i;
121
122         for (i = 0; i < chunk->count; i++) {
123                 if (chunk->owners[i].owner)
124                         put_tree(chunk->owners[i].owner);
125         }
126         kfree(chunk);
127 }
128
129 void audit_put_chunk(struct audit_chunk *chunk)
130 {
131         if (atomic_long_dec_and_test(&chunk->refs))
132                 free_chunk(chunk);
133 }
134
135 static void __put_chunk(struct rcu_head *rcu)
136 {
137         struct audit_chunk *chunk = container_of(rcu, struct audit_chunk, head);
138         audit_put_chunk(chunk);
139 }
140
141 /*
142  * Drop reference to the chunk that was held by the mark. This is the reference
143  * that gets dropped after we've removed the chunk from the hash table and we
144  * use it to make sure chunk cannot be freed before RCU grace period expires.
145  */
146 static void audit_mark_put_chunk(struct audit_chunk *chunk)
147 {
148         call_rcu(&chunk->head, __put_chunk);
149 }
150
151 static inline struct audit_tree_mark *audit_mark(struct fsnotify_mark *entry)
152 {
153         return container_of(entry, struct audit_tree_mark, mark);
154 }
155
156 static struct audit_chunk *mark_chunk(struct fsnotify_mark *mark)
157 {
158         return audit_mark(mark)->chunk;
159 }
160
161 static void audit_tree_destroy_watch(struct fsnotify_mark *entry)
162 {
163         struct audit_chunk *chunk = mark_chunk(entry);
164         audit_mark_put_chunk(chunk);
165         kmem_cache_free(audit_tree_mark_cachep, audit_mark(entry));
166 }
167
168 static struct fsnotify_mark *alloc_mark(void)
169 {
170         struct audit_tree_mark *amark;
171
172         amark = kmem_cache_zalloc(audit_tree_mark_cachep, GFP_KERNEL);
173         if (!amark)
174                 return NULL;
175         fsnotify_init_mark(&amark->mark, audit_tree_group);
176         amark->mark.mask = FS_IN_IGNORED;
177         return &amark->mark;
178 }
179
180 static struct audit_chunk *alloc_chunk(int count)
181 {
182         struct audit_chunk *chunk;
183         size_t size;
184         int i;
185
186         size = offsetof(struct audit_chunk, owners) + count * sizeof(struct node);
187         chunk = kzalloc(size, GFP_KERNEL);
188         if (!chunk)
189                 return NULL;
190
191         chunk->mark = alloc_mark();
192         if (!chunk->mark) {
193                 kfree(chunk);
194                 return NULL;
195         }
196         audit_mark(chunk->mark)->chunk = chunk;
197
198         INIT_LIST_HEAD(&chunk->hash);
199         INIT_LIST_HEAD(&chunk->trees);
200         chunk->count = count;
201         atomic_long_set(&chunk->refs, 1);
202         for (i = 0; i < count; i++) {
203                 INIT_LIST_HEAD(&chunk->owners[i].list);
204                 chunk->owners[i].index = i;
205         }
206         return chunk;
207 }
208
209 enum {HASH_SIZE = 128};
210 static struct list_head chunk_hash_heads[HASH_SIZE];
211 static __cacheline_aligned_in_smp DEFINE_SPINLOCK(hash_lock);
212
213 /* Function to return search key in our hash from inode. */
214 static unsigned long inode_to_key(const struct inode *inode)
215 {
216         /* Use address pointed to by connector->obj as the key */
217         return (unsigned long)&inode->i_fsnotify_marks;
218 }
219
220 static inline struct list_head *chunk_hash(unsigned long key)
221 {
222         unsigned long n = key / L1_CACHE_BYTES;
223         return chunk_hash_heads + n % HASH_SIZE;
224 }
225
226 /* hash_lock & entry->group->mark_mutex is held by caller */
227 static void insert_hash(struct audit_chunk *chunk)
228 {
229         struct list_head *list;
230
231         /*
232          * Make sure chunk is fully initialized before making it visible in the
233          * hash. Pairs with a data dependency barrier in READ_ONCE() in
234          * audit_tree_lookup().
235          */
236         smp_wmb();
237         WARN_ON_ONCE(!chunk->key);
238         list = chunk_hash(chunk->key);
239         list_add_rcu(&chunk->hash, list);
240 }
241
242 /* called under rcu_read_lock */
243 struct audit_chunk *audit_tree_lookup(const struct inode *inode)
244 {
245         unsigned long key = inode_to_key(inode);
246         struct list_head *list = chunk_hash(key);
247         struct audit_chunk *p;
248
249         list_for_each_entry_rcu(p, list, hash) {
250                 /*
251                  * We use a data dependency barrier in READ_ONCE() to make sure
252                  * the chunk we see is fully initialized.
253                  */
254                 if (READ_ONCE(p->key) == key) {
255                         atomic_long_inc(&p->refs);
256                         return p;
257                 }
258         }
259         return NULL;
260 }
261
262 bool audit_tree_match(struct audit_chunk *chunk, struct audit_tree *tree)
263 {
264         int n;
265         for (n = 0; n < chunk->count; n++)
266                 if (chunk->owners[n].owner == tree)
267                         return true;
268         return false;
269 }
270
271 /* tagging and untagging inodes with trees */
272
273 static struct audit_chunk *find_chunk(struct node *p)
274 {
275         int index = p->index & ~(1U<<31);
276         p -= index;
277         return container_of(p, struct audit_chunk, owners[0]);
278 }
279
280 static void replace_chunk(struct audit_chunk *new, struct audit_chunk *old)
281 {
282         struct audit_tree *owner;
283         int i, j;
284
285         new->key = old->key;
286         list_splice_init(&old->trees, &new->trees);
287         list_for_each_entry(owner, &new->trees, same_root)
288                 owner->root = new;
289         for (i = j = 0; j < old->count; i++, j++) {
290                 if (!old->owners[j].owner) {
291                         i--;
292                         continue;
293                 }
294                 owner = old->owners[j].owner;
295                 new->owners[i].owner = owner;
296                 new->owners[i].index = old->owners[j].index - j + i;
297                 if (!owner) /* result of earlier fallback */
298                         continue;
299                 get_tree(owner);
300                 list_replace_init(&old->owners[j].list, &new->owners[i].list);
301         }
302         /*
303          * Make sure chunk is fully initialized before making it visible in the
304          * hash. Pairs with a data dependency barrier in READ_ONCE() in
305          * audit_tree_lookup().
306          */
307         smp_wmb();
308         list_replace_rcu(&old->hash, &new->hash);
309 }
310
311 static void remove_chunk_node(struct audit_chunk *chunk, struct node *p)
312 {
313         struct audit_tree *owner = p->owner;
314
315         if (owner->root == chunk) {
316                 list_del_init(&owner->same_root);
317                 owner->root = NULL;
318         }
319         list_del_init(&p->list);
320         p->owner = NULL;
321         put_tree(owner);
322 }
323
324 static int chunk_count_trees(struct audit_chunk *chunk)
325 {
326         int i;
327         int ret = 0;
328
329         for (i = 0; i < chunk->count; i++)
330                 if (chunk->owners[i].owner)
331                         ret++;
332         return ret;
333 }
334
335 static void untag_chunk(struct audit_chunk *chunk, struct fsnotify_mark *entry)
336 {
337         struct audit_chunk *new;
338         int size;
339
340         mutex_lock(&audit_tree_group->mark_mutex);
341         /*
342          * mark_mutex protects mark from getting detached and thus also from
343          * mark->connector->obj getting NULL.
344          */
345         if (chunk->dead || !(entry->flags & FSNOTIFY_MARK_FLAG_ATTACHED))
346                 goto out_mutex;
347
348         size = chunk_count_trees(chunk);
349         if (!size) {
350                 chunk->dead = 1;
351                 spin_lock(&hash_lock);
352                 list_del_init(&chunk->trees);
353                 list_del_rcu(&chunk->hash);
354                 spin_unlock(&hash_lock);
355                 fsnotify_detach_mark(entry);
356                 mutex_unlock(&audit_tree_group->mark_mutex);
357                 fsnotify_free_mark(entry);
358                 return;
359         }
360
361         new = alloc_chunk(size);
362         if (!new)
363                 goto out_mutex;
364
365         if (fsnotify_add_mark_locked(new->mark, entry->connector->obj,
366                                      FSNOTIFY_OBJ_TYPE_INODE, 1)) {
367                 fsnotify_put_mark(new->mark);
368                 goto out_mutex;
369         }
370
371         chunk->dead = 1;
372         spin_lock(&hash_lock);
373         /*
374          * This has to go last when updating chunk as once replace_chunk() is
375          * called, new RCU readers can see the new chunk.
376          */
377         replace_chunk(new, chunk);
378         spin_unlock(&hash_lock);
379         fsnotify_detach_mark(entry);
380         mutex_unlock(&audit_tree_group->mark_mutex);
381         fsnotify_free_mark(entry);
382         fsnotify_put_mark(new->mark);   /* drop initial reference */
383         return;
384
385 out_mutex:
386         mutex_unlock(&audit_tree_group->mark_mutex);
387 }
388
389 /* Call with group->mark_mutex held, releases it */
390 static int create_chunk(struct inode *inode, struct audit_tree *tree)
391 {
392         struct fsnotify_mark *entry;
393         struct audit_chunk *chunk = alloc_chunk(1);
394
395         if (!chunk) {
396                 mutex_unlock(&audit_tree_group->mark_mutex);
397                 return -ENOMEM;
398         }
399
400         entry = chunk->mark;
401         if (fsnotify_add_inode_mark_locked(entry, inode, 0)) {
402                 mutex_unlock(&audit_tree_group->mark_mutex);
403                 fsnotify_put_mark(entry);
404                 return -ENOSPC;
405         }
406
407         spin_lock(&hash_lock);
408         if (tree->goner) {
409                 spin_unlock(&hash_lock);
410                 chunk->dead = 1;
411                 fsnotify_detach_mark(entry);
412                 mutex_unlock(&audit_tree_group->mark_mutex);
413                 fsnotify_free_mark(entry);
414                 fsnotify_put_mark(entry);
415                 return 0;
416         }
417         chunk->owners[0].index = (1U << 31);
418         chunk->owners[0].owner = tree;
419         get_tree(tree);
420         list_add(&chunk->owners[0].list, &tree->chunks);
421         if (!tree->root) {
422                 tree->root = chunk;
423                 list_add(&tree->same_root, &chunk->trees);
424         }
425         chunk->key = inode_to_key(inode);
426         /*
427          * Inserting into the hash table has to go last as once we do that RCU
428          * readers can see the chunk.
429          */
430         insert_hash(chunk);
431         spin_unlock(&hash_lock);
432         mutex_unlock(&audit_tree_group->mark_mutex);
433         fsnotify_put_mark(entry);       /* drop initial reference */
434         return 0;
435 }
436
437 /* the first tagged inode becomes root of tree */
438 static int tag_chunk(struct inode *inode, struct audit_tree *tree)
439 {
440         struct fsnotify_mark *old_entry, *chunk_entry;
441         struct audit_chunk *chunk, *old;
442         struct node *p;
443         int n;
444
445         mutex_lock(&audit_tree_group->mark_mutex);
446         old_entry = fsnotify_find_mark(&inode->i_fsnotify_marks,
447                                        audit_tree_group);
448         if (!old_entry)
449                 return create_chunk(inode, tree);
450
451         old = mark_chunk(old_entry);
452
453         /* are we already there? */
454         spin_lock(&hash_lock);
455         for (n = 0; n < old->count; n++) {
456                 if (old->owners[n].owner == tree) {
457                         spin_unlock(&hash_lock);
458                         mutex_unlock(&audit_tree_group->mark_mutex);
459                         fsnotify_put_mark(old_entry);
460                         return 0;
461                 }
462         }
463         spin_unlock(&hash_lock);
464
465         chunk = alloc_chunk(old->count + 1);
466         if (!chunk) {
467                 mutex_unlock(&audit_tree_group->mark_mutex);
468                 fsnotify_put_mark(old_entry);
469                 return -ENOMEM;
470         }
471
472         chunk_entry = chunk->mark;
473
474         /*
475          * mark_mutex protects mark from getting detached and thus also from
476          * mark->connector->obj getting NULL.
477          */
478         if (!(old_entry->flags & FSNOTIFY_MARK_FLAG_ATTACHED)) {
479                 /* old_entry is being shot, lets just lie */
480                 mutex_unlock(&audit_tree_group->mark_mutex);
481                 fsnotify_put_mark(old_entry);
482                 fsnotify_put_mark(chunk->mark);
483                 return -ENOENT;
484         }
485
486         if (fsnotify_add_mark_locked(chunk_entry, old_entry->connector->obj,
487                                      FSNOTIFY_OBJ_TYPE_INODE, 1)) {
488                 mutex_unlock(&audit_tree_group->mark_mutex);
489                 fsnotify_put_mark(chunk_entry);
490                 fsnotify_put_mark(old_entry);
491                 return -ENOSPC;
492         }
493
494         spin_lock(&hash_lock);
495         if (tree->goner) {
496                 spin_unlock(&hash_lock);
497                 chunk->dead = 1;
498                 fsnotify_detach_mark(chunk_entry);
499                 mutex_unlock(&audit_tree_group->mark_mutex);
500                 fsnotify_free_mark(chunk_entry);
501                 fsnotify_put_mark(chunk_entry);
502                 fsnotify_put_mark(old_entry);
503                 return 0;
504         }
505         p = &chunk->owners[chunk->count - 1];
506         p->index = (chunk->count - 1) | (1U<<31);
507         p->owner = tree;
508         get_tree(tree);
509         list_add(&p->list, &tree->chunks);
510         old->dead = 1;
511         if (!tree->root) {
512                 tree->root = chunk;
513                 list_add(&tree->same_root, &chunk->trees);
514         }
515         /*
516          * This has to go last when updating chunk as once replace_chunk() is
517          * called, new RCU readers can see the new chunk.
518          */
519         replace_chunk(chunk, old);
520         spin_unlock(&hash_lock);
521         fsnotify_detach_mark(old_entry);
522         mutex_unlock(&audit_tree_group->mark_mutex);
523         fsnotify_free_mark(old_entry);
524         fsnotify_put_mark(chunk_entry); /* drop initial reference */
525         fsnotify_put_mark(old_entry); /* pair to fsnotify_find mark_entry */
526         return 0;
527 }
528
529 static void audit_tree_log_remove_rule(struct audit_krule *rule)
530 {
531         struct audit_buffer *ab;
532
533         if (!audit_enabled)
534                 return;
535         ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_CONFIG_CHANGE);
536         if (unlikely(!ab))
537                 return;
538         audit_log_format(ab, "op=remove_rule");
539         audit_log_format(ab, " dir=");
540         audit_log_untrustedstring(ab, rule->tree->pathname);
541         audit_log_key(ab, rule->filterkey);
542         audit_log_format(ab, " list=%d res=1", rule->listnr);
543         audit_log_end(ab);
544 }
545
546 static void kill_rules(struct audit_tree *tree)
547 {
548         struct audit_krule *rule, *next;
549         struct audit_entry *entry;
550
551         list_for_each_entry_safe(rule, next, &tree->rules, rlist) {
552                 entry = container_of(rule, struct audit_entry, rule);
553
554                 list_del_init(&rule->rlist);
555                 if (rule->tree) {
556                         /* not a half-baked one */
557                         audit_tree_log_remove_rule(rule);
558                         if (entry->rule.exe)
559                                 audit_remove_mark(entry->rule.exe);
560                         rule->tree = NULL;
561                         list_del_rcu(&entry->list);
562                         list_del(&entry->rule.list);
563                         call_rcu(&entry->rcu, audit_free_rule_rcu);
564                 }
565         }
566 }
567
568 /*
569  * Remove tree from chunks. If 'tagged' is set, remove tree only from tagged
570  * chunks. The function expects tagged chunks are all at the beginning of the
571  * chunks list.
572  */
573 static void prune_tree_chunks(struct audit_tree *victim, bool tagged)
574 {
575         spin_lock(&hash_lock);
576         while (!list_empty(&victim->chunks)) {
577                 struct node *p;
578                 struct audit_chunk *chunk;
579                 struct fsnotify_mark *mark;
580
581                 p = list_first_entry(&victim->chunks, struct node, list);
582                 /* have we run out of marked? */
583                 if (tagged && !(p->index & (1U<<31)))
584                         break;
585                 chunk = find_chunk(p);
586                 mark = chunk->mark;
587                 remove_chunk_node(chunk, p);
588                 fsnotify_get_mark(mark);
589                 spin_unlock(&hash_lock);
590
591                 untag_chunk(chunk, mark);
592                 fsnotify_put_mark(mark);
593
594                 spin_lock(&hash_lock);
595         }
596         spin_unlock(&hash_lock);
597         put_tree(victim);
598 }
599
600 /*
601  * finish killing struct audit_tree
602  */
603 static void prune_one(struct audit_tree *victim)
604 {
605         prune_tree_chunks(victim, false);
606 }
607
608 /* trim the uncommitted chunks from tree */
609
610 static void trim_marked(struct audit_tree *tree)
611 {
612         struct list_head *p, *q;
613         spin_lock(&hash_lock);
614         if (tree->goner) {
615                 spin_unlock(&hash_lock);
616                 return;
617         }
618         /* reorder */
619         for (p = tree->chunks.next; p != &tree->chunks; p = q) {
620                 struct node *node = list_entry(p, struct node, list);
621                 q = p->next;
622                 if (node->index & (1U<<31)) {
623                         list_del_init(p);
624                         list_add(p, &tree->chunks);
625                 }
626         }
627         spin_unlock(&hash_lock);
628
629         prune_tree_chunks(tree, true);
630
631         spin_lock(&hash_lock);
632         if (!tree->root && !tree->goner) {
633                 tree->goner = 1;
634                 spin_unlock(&hash_lock);
635                 mutex_lock(&audit_filter_mutex);
636                 kill_rules(tree);
637                 list_del_init(&tree->list);
638                 mutex_unlock(&audit_filter_mutex);
639                 prune_one(tree);
640         } else {
641                 spin_unlock(&hash_lock);
642         }
643 }
644
645 static void audit_schedule_prune(void);
646
647 /* called with audit_filter_mutex */
648 int audit_remove_tree_rule(struct audit_krule *rule)
649 {
650         struct audit_tree *tree;
651         tree = rule->tree;
652         if (tree) {
653                 spin_lock(&hash_lock);
654                 list_del_init(&rule->rlist);
655                 if (list_empty(&tree->rules) && !tree->goner) {
656                         tree->root = NULL;
657                         list_del_init(&tree->same_root);
658                         tree->goner = 1;
659                         list_move(&tree->list, &prune_list);
660                         rule->tree = NULL;
661                         spin_unlock(&hash_lock);
662                         audit_schedule_prune();
663                         return 1;
664                 }
665                 rule->tree = NULL;
666                 spin_unlock(&hash_lock);
667                 return 1;
668         }
669         return 0;
670 }
671
672 static int compare_root(struct vfsmount *mnt, void *arg)
673 {
674         return inode_to_key(d_backing_inode(mnt->mnt_root)) ==
675                (unsigned long)arg;
676 }
677
678 void audit_trim_trees(void)
679 {
680         struct list_head cursor;
681
682         mutex_lock(&audit_filter_mutex);
683         list_add(&cursor, &tree_list);
684         while (cursor.next != &tree_list) {
685                 struct audit_tree *tree;
686                 struct path path;
687                 struct vfsmount *root_mnt;
688                 struct node *node;
689                 int err;
690
691                 tree = container_of(cursor.next, struct audit_tree, list);
692                 get_tree(tree);
693                 list_del(&cursor);
694                 list_add(&cursor, &tree->list);
695                 mutex_unlock(&audit_filter_mutex);
696
697                 err = kern_path(tree->pathname, 0, &path);
698                 if (err)
699                         goto skip_it;
700
701                 root_mnt = collect_mounts(&path);
702                 path_put(&path);
703                 if (IS_ERR(root_mnt))
704                         goto skip_it;
705
706                 spin_lock(&hash_lock);
707                 list_for_each_entry(node, &tree->chunks, list) {
708                         struct audit_chunk *chunk = find_chunk(node);
709                         /* this could be NULL if the watch is dying else where... */
710                         node->index |= 1U<<31;
711                         if (iterate_mounts(compare_root,
712                                            (void *)(chunk->key),
713                                            root_mnt))
714                                 node->index &= ~(1U<<31);
715                 }
716                 spin_unlock(&hash_lock);
717                 trim_marked(tree);
718                 drop_collected_mounts(root_mnt);
719 skip_it:
720                 put_tree(tree);
721                 mutex_lock(&audit_filter_mutex);
722         }
723         list_del(&cursor);
724         mutex_unlock(&audit_filter_mutex);
725 }
726
727 int audit_make_tree(struct audit_krule *rule, char *pathname, u32 op)
728 {
729
730         if (pathname[0] != '/' ||
731             rule->listnr != AUDIT_FILTER_EXIT ||
732             op != Audit_equal ||
733             rule->inode_f || rule->watch || rule->tree)
734                 return -EINVAL;
735         rule->tree = alloc_tree(pathname);
736         if (!rule->tree)
737                 return -ENOMEM;
738         return 0;
739 }
740
741 void audit_put_tree(struct audit_tree *tree)
742 {
743         put_tree(tree);
744 }
745
746 static int tag_mount(struct vfsmount *mnt, void *arg)
747 {
748         return tag_chunk(d_backing_inode(mnt->mnt_root), arg);
749 }
750
751 /*
752  * That gets run when evict_chunk() ends up needing to kill audit_tree.
753  * Runs from a separate thread.
754  */
755 static int prune_tree_thread(void *unused)
756 {
757         for (;;) {
758                 if (list_empty(&prune_list)) {
759                         set_current_state(TASK_INTERRUPTIBLE);
760                         schedule();
761                 }
762
763                 audit_ctl_lock();
764                 mutex_lock(&audit_filter_mutex);
765
766                 while (!list_empty(&prune_list)) {
767                         struct audit_tree *victim;
768
769                         victim = list_entry(prune_list.next,
770                                         struct audit_tree, list);
771                         list_del_init(&victim->list);
772
773                         mutex_unlock(&audit_filter_mutex);
774
775                         prune_one(victim);
776
777                         mutex_lock(&audit_filter_mutex);
778                 }
779
780                 mutex_unlock(&audit_filter_mutex);
781                 audit_ctl_unlock();
782         }
783         return 0;
784 }
785
786 static int audit_launch_prune(void)
787 {
788         if (prune_thread)
789                 return 0;
790         prune_thread = kthread_run(prune_tree_thread, NULL,
791                                 "audit_prune_tree");
792         if (IS_ERR(prune_thread)) {
793                 pr_err("cannot start thread audit_prune_tree");
794                 prune_thread = NULL;
795                 return -ENOMEM;
796         }
797         return 0;
798 }
799
800 /* called with audit_filter_mutex */
801 int audit_add_tree_rule(struct audit_krule *rule)
802 {
803         struct audit_tree *seed = rule->tree, *tree;
804         struct path path;
805         struct vfsmount *mnt;
806         int err;
807
808         rule->tree = NULL;
809         list_for_each_entry(tree, &tree_list, list) {
810                 if (!strcmp(seed->pathname, tree->pathname)) {
811                         put_tree(seed);
812                         rule->tree = tree;
813                         list_add(&rule->rlist, &tree->rules);
814                         return 0;
815                 }
816         }
817         tree = seed;
818         list_add(&tree->list, &tree_list);
819         list_add(&rule->rlist, &tree->rules);
820         /* do not set rule->tree yet */
821         mutex_unlock(&audit_filter_mutex);
822
823         if (unlikely(!prune_thread)) {
824                 err = audit_launch_prune();
825                 if (err)
826                         goto Err;
827         }
828
829         err = kern_path(tree->pathname, 0, &path);
830         if (err)
831                 goto Err;
832         mnt = collect_mounts(&path);
833         path_put(&path);
834         if (IS_ERR(mnt)) {
835                 err = PTR_ERR(mnt);
836                 goto Err;
837         }
838
839         get_tree(tree);
840         err = iterate_mounts(tag_mount, tree, mnt);
841         drop_collected_mounts(mnt);
842
843         if (!err) {
844                 struct node *node;
845                 spin_lock(&hash_lock);
846                 list_for_each_entry(node, &tree->chunks, list)
847                         node->index &= ~(1U<<31);
848                 spin_unlock(&hash_lock);
849         } else {
850                 trim_marked(tree);
851                 goto Err;
852         }
853
854         mutex_lock(&audit_filter_mutex);
855         if (list_empty(&rule->rlist)) {
856                 put_tree(tree);
857                 return -ENOENT;
858         }
859         rule->tree = tree;
860         put_tree(tree);
861
862         return 0;
863 Err:
864         mutex_lock(&audit_filter_mutex);
865         list_del_init(&tree->list);
866         list_del_init(&tree->rules);
867         put_tree(tree);
868         return err;
869 }
870
871 int audit_tag_tree(char *old, char *new)
872 {
873         struct list_head cursor, barrier;
874         int failed = 0;
875         struct path path1, path2;
876         struct vfsmount *tagged;
877         int err;
878
879         err = kern_path(new, 0, &path2);
880         if (err)
881                 return err;
882         tagged = collect_mounts(&path2);
883         path_put(&path2);
884         if (IS_ERR(tagged))
885                 return PTR_ERR(tagged);
886
887         err = kern_path(old, 0, &path1);
888         if (err) {
889                 drop_collected_mounts(tagged);
890                 return err;
891         }
892
893         mutex_lock(&audit_filter_mutex);
894         list_add(&barrier, &tree_list);
895         list_add(&cursor, &barrier);
896
897         while (cursor.next != &tree_list) {
898                 struct audit_tree *tree;
899                 int good_one = 0;
900
901                 tree = container_of(cursor.next, struct audit_tree, list);
902                 get_tree(tree);
903                 list_del(&cursor);
904                 list_add(&cursor, &tree->list);
905                 mutex_unlock(&audit_filter_mutex);
906
907                 err = kern_path(tree->pathname, 0, &path2);
908                 if (!err) {
909                         good_one = path_is_under(&path1, &path2);
910                         path_put(&path2);
911                 }
912
913                 if (!good_one) {
914                         put_tree(tree);
915                         mutex_lock(&audit_filter_mutex);
916                         continue;
917                 }
918
919                 failed = iterate_mounts(tag_mount, tree, tagged);
920                 if (failed) {
921                         put_tree(tree);
922                         mutex_lock(&audit_filter_mutex);
923                         break;
924                 }
925
926                 mutex_lock(&audit_filter_mutex);
927                 spin_lock(&hash_lock);
928                 if (!tree->goner) {
929                         list_del(&tree->list);
930                         list_add(&tree->list, &tree_list);
931                 }
932                 spin_unlock(&hash_lock);
933                 put_tree(tree);
934         }
935
936         while (barrier.prev != &tree_list) {
937                 struct audit_tree *tree;
938
939                 tree = container_of(barrier.prev, struct audit_tree, list);
940                 get_tree(tree);
941                 list_del(&tree->list);
942                 list_add(&tree->list, &barrier);
943                 mutex_unlock(&audit_filter_mutex);
944
945                 if (!failed) {
946                         struct node *node;
947                         spin_lock(&hash_lock);
948                         list_for_each_entry(node, &tree->chunks, list)
949                                 node->index &= ~(1U<<31);
950                         spin_unlock(&hash_lock);
951                 } else {
952                         trim_marked(tree);
953                 }
954
955                 put_tree(tree);
956                 mutex_lock(&audit_filter_mutex);
957         }
958         list_del(&barrier);
959         list_del(&cursor);
960         mutex_unlock(&audit_filter_mutex);
961         path_put(&path1);
962         drop_collected_mounts(tagged);
963         return failed;
964 }
965
966
967 static void audit_schedule_prune(void)
968 {
969         wake_up_process(prune_thread);
970 }
971
972 /*
973  * ... and that one is done if evict_chunk() decides to delay until the end
974  * of syscall.  Runs synchronously.
975  */
976 void audit_kill_trees(struct list_head *list)
977 {
978         audit_ctl_lock();
979         mutex_lock(&audit_filter_mutex);
980
981         while (!list_empty(list)) {
982                 struct audit_tree *victim;
983
984                 victim = list_entry(list->next, struct audit_tree, list);
985                 kill_rules(victim);
986                 list_del_init(&victim->list);
987
988                 mutex_unlock(&audit_filter_mutex);
989
990                 prune_one(victim);
991
992                 mutex_lock(&audit_filter_mutex);
993         }
994
995         mutex_unlock(&audit_filter_mutex);
996         audit_ctl_unlock();
997 }
998
999 /*
1000  *  Here comes the stuff asynchronous to auditctl operations
1001  */
1002
1003 static void evict_chunk(struct audit_chunk *chunk)
1004 {
1005         struct audit_tree *owner;
1006         struct list_head *postponed = audit_killed_trees();
1007         int need_prune = 0;
1008         int n;
1009
1010         if (chunk->dead)
1011                 return;
1012
1013         chunk->dead = 1;
1014         mutex_lock(&audit_filter_mutex);
1015         spin_lock(&hash_lock);
1016         while (!list_empty(&chunk->trees)) {
1017                 owner = list_entry(chunk->trees.next,
1018                                    struct audit_tree, same_root);
1019                 owner->goner = 1;
1020                 owner->root = NULL;
1021                 list_del_init(&owner->same_root);
1022                 spin_unlock(&hash_lock);
1023                 if (!postponed) {
1024                         kill_rules(owner);
1025                         list_move(&owner->list, &prune_list);
1026                         need_prune = 1;
1027                 } else {
1028                         list_move(&owner->list, postponed);
1029                 }
1030                 spin_lock(&hash_lock);
1031         }
1032         list_del_rcu(&chunk->hash);
1033         for (n = 0; n < chunk->count; n++)
1034                 list_del_init(&chunk->owners[n].list);
1035         spin_unlock(&hash_lock);
1036         mutex_unlock(&audit_filter_mutex);
1037         if (need_prune)
1038                 audit_schedule_prune();
1039 }
1040
1041 static int audit_tree_handle_event(struct fsnotify_group *group,
1042                                    struct inode *to_tell,
1043                                    u32 mask, const void *data, int data_type,
1044                                    const unsigned char *file_name, u32 cookie,
1045                                    struct fsnotify_iter_info *iter_info)
1046 {
1047         return 0;
1048 }
1049
1050 static void audit_tree_freeing_mark(struct fsnotify_mark *entry, struct fsnotify_group *group)
1051 {
1052         struct audit_chunk *chunk = mark_chunk(entry);
1053
1054         evict_chunk(chunk);
1055
1056         /*
1057          * We are guaranteed to have at least one reference to the mark from
1058          * either the inode or the caller of fsnotify_destroy_mark().
1059          */
1060         BUG_ON(refcount_read(&entry->refcnt) < 1);
1061 }
1062
1063 static const struct fsnotify_ops audit_tree_ops = {
1064         .handle_event = audit_tree_handle_event,
1065         .freeing_mark = audit_tree_freeing_mark,
1066         .free_mark = audit_tree_destroy_watch,
1067 };
1068
1069 static int __init audit_tree_init(void)
1070 {
1071         int i;
1072
1073         audit_tree_mark_cachep = KMEM_CACHE(audit_tree_mark, SLAB_PANIC);
1074
1075         audit_tree_group = fsnotify_alloc_group(&audit_tree_ops);
1076         if (IS_ERR(audit_tree_group))
1077                 audit_panic("cannot initialize fsnotify group for rectree watches");
1078
1079         for (i = 0; i < HASH_SIZE; i++)
1080                 INIT_LIST_HEAD(&chunk_hash_heads[i]);
1081
1082         return 0;
1083 }
1084 __initcall(audit_tree_init);