Lines Matching refs:filemon

82 struct filemon {  struct
95 static void filemon_output(struct filemon *filemon, char *msg, size_t len); argument
97 static __inline struct filemon *
98 filemon_acquire(struct filemon *filemon) in filemon_acquire() argument
101 if (filemon != NULL) in filemon_acquire()
102 refcount_acquire(&filemon->refcnt); in filemon_acquire()
103 return (filemon); in filemon_acquire()
110 filemon_release(struct filemon *filemon) in filemon_release() argument
113 if (refcount_release(&filemon->refcnt) == 0) in filemon_release()
120 sx_assert(&filemon->lock, SA_UNLOCKED); in filemon_release()
122 if (filemon->cred != NULL) in filemon_release()
123 crfree(filemon->cred); in filemon_release()
124 sx_destroy(&filemon->lock); in filemon_release()
125 free(filemon, M_FILEMON); in filemon_release()
132 static struct filemon *
135 struct filemon *filemon; in filemon_proc_get() local
140 filemon = filemon_acquire(p->p_filemon); in filemon_proc_get()
143 if (filemon == NULL) in filemon_proc_get()
149 sx_xlock(&filemon->lock); in filemon_proc_get()
150 return (filemon); in filemon_proc_get()
157 struct filemon *filemon; in filemon_proc_drop() local
163 filemon = p->p_filemon; in filemon_proc_drop()
165 --filemon->proccnt; in filemon_proc_drop()
172 KASSERT(filemon->refcnt > 1, ("%s: proc %p dropping filemon %p " in filemon_proc_drop()
173 "with last reference", __func__, p, filemon)); in filemon_proc_drop()
174 filemon_release(filemon); in filemon_proc_drop()
179 filemon_drop(struct filemon *filemon) in filemon_drop() argument
182 sx_xunlock(&filemon->lock); in filemon_drop()
183 filemon_release(filemon); in filemon_drop()
189 filemon_write_header(struct filemon *filemon) in filemon_write_header() argument
196 len = snprintf(filemon->msgbufr, sizeof(filemon->msgbufr), in filemon_write_header()
200 if (len < sizeof(filemon->msgbufr)) in filemon_write_header()
201 filemon_output(filemon, filemon->msgbufr, len); in filemon_write_header()
208 filemon_untrack_processes(struct filemon *filemon) in filemon_untrack_processes() argument
212 sx_assert(&filemon->lock, SA_XLOCKED); in filemon_untrack_processes()
215 if (filemon->proccnt == 0) in filemon_untrack_processes()
231 if (p->p_filemon == filemon) in filemon_untrack_processes()
241 KASSERT(filemon->refcnt > 0, ("%s: filemon %p should have " in filemon_untrack_processes()
242 "references still.", __func__, filemon)); in filemon_untrack_processes()
243 KASSERT(filemon->proccnt == 0, ("%s: filemon %p should not have " in filemon_untrack_processes()
244 "attached procs still.", __func__, filemon)); in filemon_untrack_processes()
251 filemon_close_log(struct filemon *filemon) in filemon_close_log() argument
257 sx_assert(&filemon->lock, SA_XLOCKED); in filemon_close_log()
258 if (filemon->fp == NULL) in filemon_close_log()
263 len = snprintf(filemon->msgbufr, in filemon_close_log()
264 sizeof(filemon->msgbufr), in filemon_close_log()
268 if (len < sizeof(filemon->msgbufr)) in filemon_close_log()
269 filemon_output(filemon, filemon->msgbufr, len); in filemon_close_log()
270 fp = filemon->fp; in filemon_close_log()
271 filemon->fp = NULL; in filemon_close_log()
273 sx_xunlock(&filemon->lock); in filemon_close_log()
275 sx_xlock(&filemon->lock); in filemon_close_log()
285 struct filemon *filemon = data; in filemon_dtr() local
287 if (filemon == NULL) in filemon_dtr()
290 sx_xlock(&filemon->lock); in filemon_dtr()
294 filemon_untrack_processes(filemon); in filemon_dtr()
295 filemon_close_log(filemon); in filemon_dtr()
296 filemon_drop(filemon); in filemon_dtr()
301 filemon_attach_proc(struct filemon *filemon, struct proc *p) in filemon_attach_proc() argument
303 struct filemon *filemon2; in filemon_attach_proc()
305 sx_assert(&filemon->lock, SA_XLOCKED); in filemon_attach_proc()
309 __func__, filemon, p)); in filemon_attach_proc()
312 __func__, filemon, p)); in filemon_attach_proc()
314 if (p->p_filemon == filemon) in filemon_attach_proc()
331 sx_xunlock(&filemon->lock); in filemon_attach_proc()
338 sx_xlock(&filemon->lock); in filemon_attach_proc()
349 p->p_filemon = filemon_acquire(filemon); in filemon_attach_proc()
350 ++filemon->proccnt; in filemon_attach_proc()
359 struct filemon *filemon; in filemon_ioctl() local
364 if ((error = devfs_get_cdevpriv((void **) &filemon)) != 0) in filemon_ioctl()
367 sx_xlock(&filemon->lock); in filemon_ioctl()
372 if (filemon->fp != NULL) { in filemon_ioctl()
388 filemon->fp = fp; in filemon_ioctl()
390 filemon_write_header(filemon); in filemon_ioctl()
397 filemon_untrack_processes(filemon); in filemon_ioctl()
402 KASSERT(p->p_filemon != filemon, in filemon_ioctl()
404 __func__, p, filemon)); in filemon_ioctl()
405 error = filemon_attach_proc(filemon, p); in filemon_ioctl()
415 sx_xunlock(&filemon->lock); in filemon_ioctl()
424 struct filemon *filemon; in filemon_open() local
426 filemon = malloc(sizeof(*filemon), M_FILEMON, in filemon_open()
428 sx_init(&filemon->lock, "filemon"); in filemon_open()
429 refcount_init(&filemon->refcnt, 1); in filemon_open()
430 filemon->cred = crhold(td->td_ucred); in filemon_open()
432 error = devfs_set_cdevpriv(filemon, filemon_dtr); in filemon_open()
434 filemon_release(filemon); in filemon_open()
444 struct filemon *filemon; in filemon_close() local
447 if ((error = devfs_get_cdevpriv((void **) &filemon)) != 0) in filemon_close()
450 sx_xlock(&filemon->lock); in filemon_close()
451 filemon_close_log(filemon); in filemon_close()
452 error = filemon->error; in filemon_close()
453 sx_xunlock(&filemon->lock); in filemon_close()
518 DEV_MODULE(filemon, filemon_modevent, NULL);
519 MODULE_VERSION(filemon, 1);