Lines Matching refs:filemon

83 struct filemon {  struct
96 static void filemon_output(struct filemon *filemon, char *msg, size_t len); argument
98 static __inline struct filemon *
99 filemon_acquire(struct filemon *filemon) in filemon_acquire() argument
102 if (filemon != NULL) in filemon_acquire()
103 refcount_acquire(&filemon->refcnt); in filemon_acquire()
104 return (filemon); in filemon_acquire()
111 filemon_release(struct filemon *filemon) in filemon_release() argument
114 if (refcount_release(&filemon->refcnt) == 0) in filemon_release()
121 sx_assert(&filemon->lock, SA_UNLOCKED); in filemon_release()
123 if (filemon->cred != NULL) in filemon_release()
124 crfree(filemon->cred); in filemon_release()
125 sx_destroy(&filemon->lock); in filemon_release()
126 free(filemon, M_FILEMON); in filemon_release()
133 static struct filemon *
136 struct filemon *filemon; in filemon_proc_get() local
141 filemon = filemon_acquire(p->p_filemon); in filemon_proc_get()
144 if (filemon == NULL) in filemon_proc_get()
150 sx_xlock(&filemon->lock); in filemon_proc_get()
151 return (filemon); in filemon_proc_get()
158 struct filemon *filemon; in filemon_proc_drop() local
164 filemon = p->p_filemon; in filemon_proc_drop()
166 --filemon->proccnt; in filemon_proc_drop()
173 KASSERT(filemon->refcnt > 1, ("%s: proc %p dropping filemon %p " in filemon_proc_drop()
174 "with last reference", __func__, p, filemon)); in filemon_proc_drop()
175 filemon_release(filemon); in filemon_proc_drop()
180 filemon_drop(struct filemon *filemon) in filemon_drop() argument
183 sx_xunlock(&filemon->lock); in filemon_drop()
184 filemon_release(filemon); in filemon_drop()
190 filemon_write_header(struct filemon *filemon) in filemon_write_header() argument
197 len = snprintf(filemon->msgbufr, sizeof(filemon->msgbufr), in filemon_write_header()
201 if (len < sizeof(filemon->msgbufr)) in filemon_write_header()
202 filemon_output(filemon, filemon->msgbufr, len); in filemon_write_header()
209 filemon_untrack_processes(struct filemon *filemon) in filemon_untrack_processes() argument
213 sx_assert(&filemon->lock, SA_XLOCKED); in filemon_untrack_processes()
216 if (filemon->proccnt == 0) in filemon_untrack_processes()
232 if (p->p_filemon == filemon) in filemon_untrack_processes()
242 KASSERT(filemon->refcnt > 0, ("%s: filemon %p should have " in filemon_untrack_processes()
243 "references still.", __func__, filemon)); in filemon_untrack_processes()
244 KASSERT(filemon->proccnt == 0, ("%s: filemon %p should not have " in filemon_untrack_processes()
245 "attached procs still.", __func__, filemon)); in filemon_untrack_processes()
252 filemon_close_log(struct filemon *filemon) in filemon_close_log() argument
258 sx_assert(&filemon->lock, SA_XLOCKED); in filemon_close_log()
259 if (filemon->fp == NULL) in filemon_close_log()
264 len = snprintf(filemon->msgbufr, in filemon_close_log()
265 sizeof(filemon->msgbufr), in filemon_close_log()
269 if (len < sizeof(filemon->msgbufr)) in filemon_close_log()
270 filemon_output(filemon, filemon->msgbufr, len); in filemon_close_log()
271 fp = filemon->fp; in filemon_close_log()
272 filemon->fp = NULL; in filemon_close_log()
274 sx_xunlock(&filemon->lock); in filemon_close_log()
276 sx_xlock(&filemon->lock); in filemon_close_log()
286 struct filemon *filemon = data; in filemon_dtr() local
288 if (filemon == NULL) in filemon_dtr()
291 sx_xlock(&filemon->lock); in filemon_dtr()
295 filemon_untrack_processes(filemon); in filemon_dtr()
296 filemon_close_log(filemon); in filemon_dtr()
297 filemon_drop(filemon); in filemon_dtr()
302 filemon_attach_proc(struct filemon *filemon, struct proc *p) in filemon_attach_proc() argument
304 struct filemon *filemon2; in filemon_attach_proc()
306 sx_assert(&filemon->lock, SA_XLOCKED); in filemon_attach_proc()
310 __func__, filemon, p)); in filemon_attach_proc()
313 __func__, filemon, p)); in filemon_attach_proc()
315 if (p->p_filemon == filemon) in filemon_attach_proc()
332 sx_xunlock(&filemon->lock); in filemon_attach_proc()
339 sx_xlock(&filemon->lock); in filemon_attach_proc()
350 p->p_filemon = filemon_acquire(filemon); in filemon_attach_proc()
351 ++filemon->proccnt; in filemon_attach_proc()
360 struct filemon *filemon; in filemon_ioctl() local
365 if ((error = devfs_get_cdevpriv((void **) &filemon)) != 0) in filemon_ioctl()
368 sx_xlock(&filemon->lock); in filemon_ioctl()
373 if (filemon->fp != NULL) { in filemon_ioctl()
389 filemon->fp = fp; in filemon_ioctl()
391 filemon_write_header(filemon); in filemon_ioctl()
398 filemon_untrack_processes(filemon); in filemon_ioctl()
403 KASSERT(p->p_filemon != filemon, in filemon_ioctl()
405 __func__, p, filemon)); in filemon_ioctl()
406 error = filemon_attach_proc(filemon, p); in filemon_ioctl()
416 sx_xunlock(&filemon->lock); in filemon_ioctl()
425 struct filemon *filemon; in filemon_open() local
427 filemon = malloc(sizeof(*filemon), M_FILEMON, in filemon_open()
429 sx_init(&filemon->lock, "filemon"); in filemon_open()
430 refcount_init(&filemon->refcnt, 1); in filemon_open()
431 filemon->cred = crhold(td->td_ucred); in filemon_open()
433 error = devfs_set_cdevpriv(filemon, filemon_dtr); in filemon_open()
435 filemon_release(filemon); in filemon_open()
445 struct filemon *filemon; in filemon_close() local
448 if ((error = devfs_get_cdevpriv((void **) &filemon)) != 0) in filemon_close()
451 sx_xlock(&filemon->lock); in filemon_close()
452 filemon_close_log(filemon); in filemon_close()
453 error = filemon->error; in filemon_close()
454 sx_xunlock(&filemon->lock); in filemon_close()
519 DEV_MODULE(filemon, filemon_modevent, NULL);
520 MODULE_VERSION(filemon, 1);