Lines Matching full:watch

33  * 	audit_krule holds a reference to its associated watch.
100 void audit_get_watch(struct audit_watch *watch)
102 refcount_inc(&watch->count);
105 void audit_put_watch(struct audit_watch *watch)
107 if (refcount_dec_and_test(&watch->count)) {
108 WARN_ON(watch->parent);
109 WARN_ON(!list_empty(&watch->rules));
110 kfree(watch->path);
111 kfree(watch);
115 static void audit_remove_watch(struct audit_watch *watch)
117 list_del(&watch->wlist);
118 audit_put_parent(watch->parent);
119 watch->parent = NULL;
120 audit_put_watch(watch); /* match initial get */
123 char *audit_watch_path(struct audit_watch *watch)
125 return watch->path;
128 int audit_watch_compare(struct audit_watch *watch, u64 ino, dev_t dev)
130 return (watch->ino != AUDIT_INO_UNSET) &&
131 (watch->ino == ino) &&
132 (watch->dev == dev);
135 /* Initialize a parent watch entry. */
159 /* Initialize a watch entry. */
162 struct audit_watch *watch;
164 watch = kzalloc_obj(*watch);
165 if (unlikely(!watch))
168 INIT_LIST_HEAD(&watch->rules);
169 refcount_set(&watch->count, 1);
170 watch->path = path;
171 watch->dev = AUDIT_DEV_UNSET;
172 watch->ino = AUDIT_INO_UNSET;
174 return watch;
177 /* Translate a watch string to kernel representation. */
180 struct audit_watch *watch;
189 krule->inode_f || krule->watch || krule->tree)
192 watch = audit_init_watch(path);
193 if (IS_ERR(watch))
194 return PTR_ERR(watch);
196 krule->watch = watch;
201 /* Duplicate the given audit watch. The new watch's rules list is initialized
267 * are on so we need a new watch for the new list */
271 audit_panic("error updating watch, skipping");
286 audit_panic("error updating watch, removing");
291 * nentry->rule.watch == oentry->rule.watch so
293 * new watch.
295 audit_put_watch(nentry->rule.watch);
297 nentry->rule.watch = nwatch;
310 goto add_watch_to_parent; /* event applies to a single watch */
348 static int audit_get_nd(struct audit_watch *watch, struct path *parent)
352 d = kern_path_parent(watch->path, parent);
357 /* update watch filter fields */
358 watch->dev = d->d_sb->s_dev;
359 watch->ino = d_backing_inode(d)->i_ino;
371 struct audit_watch *w, *watch = krule->watch;
377 if (strcmp(watch->path, w->path))
382 /* put krule's ref to temporary watch */
383 audit_put_watch(watch);
386 krule->watch = watch = w;
393 watch->parent = parent;
395 audit_get_watch(watch);
396 list_add(&watch->wlist, &parent->watches);
398 list_add(&krule->rlist, &watch->rules);
401 /* Find a matching watch entry, or add this one.
405 struct audit_watch *watch = krule->watch;
411 * When we will be calling audit_add_to_parent, krule->watch might have
412 * been updated and watch might have been freed.
413 * So we need to keep a reference of watch.
415 audit_get_watch(watch);
420 ret = audit_get_nd(watch, &parent_path);
426 audit_put_watch(watch);
442 h = audit_hash_ino(watch->ino);
446 audit_put_watch(watch);
452 struct audit_watch *watch = krule->watch;
453 struct audit_parent *parent = watch->parent;
457 if (list_empty(&watch->rules)) {
463 audit_remove_watch(watch);
470 /* Update watch data in audit rules based on fsnotify events. */