summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_event.c
diff options
context:
space:
mode:
authormjg <mjg@FreeBSD.org>2015-09-23 12:45:08 +0000
committermjg <mjg@FreeBSD.org>2015-09-23 12:45:08 +0000
commit93991d46188631a3516189ae5bfbe3252dea53fc (patch)
treeddf5da955bff7a2555e20f31ac6ed0c34f94735a /sys/kern/kern_event.c
parent9a362d63decaafa23a1b83c6d43ead68b9a7df70 (diff)
downloadFreeBSD-src-93991d46188631a3516189ae5bfbe3252dea53fc.zip
FreeBSD-src-93991d46188631a3516189ae5bfbe3252dea53fc.tar.gz
kqueue: simplify kern_kqueue by not refing/unrefing creds too early
No functional changes.
Diffstat (limited to 'sys/kern/kern_event.c')
-rw-r--r--sys/kern/kern_event.c24
1 files changed, 8 insertions, 16 deletions
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c
index 0e26a78..d41ac96 100644
--- a/sys/kern/kern_event.c
+++ b/sys/kern/kern_event.c
@@ -759,28 +759,25 @@ kern_kqueue(struct thread *td, int flags, struct filecaps *fcaps)
struct filedesc *fdp;
struct kqueue *kq;
struct file *fp;
- struct proc *p;
struct ucred *cred;
int fd, error;
- p = td->td_proc;
+ fdp = td->td_proc->p_fd;
cred = td->td_ucred;
- crhold(cred);
- if (!chgkqcnt(cred->cr_ruidinfo, 1, lim_cur(td, RLIMIT_KQUEUES))) {
- crfree(cred);
+ if (!chgkqcnt(cred->cr_ruidinfo, 1, lim_cur(td, RLIMIT_KQUEUES)))
return (ENOMEM);
- }
- fdp = p->p_fd;
error = falloc_caps(td, &fp, &fd, flags, fcaps);
- if (error)
- goto done2;
+ if (error != 0) {
+ chgkqcnt(cred->cr_ruidinfo, -1, 0);
+ return (error);
+ }
/* An extra reference on `fp' has been held for us by falloc(). */
kq = malloc(sizeof *kq, M_KQUEUE, M_WAITOK | M_ZERO);
kqueue_init(kq);
kq->kq_fdp = fdp;
- kq->kq_cred = cred;
+ kq->kq_cred = crhold(cred);
FILEDESC_XLOCK(fdp);
TAILQ_INSERT_HEAD(&fdp->fd_kqlist, kq, kq_list);
@@ -790,12 +787,7 @@ kern_kqueue(struct thread *td, int flags, struct filecaps *fcaps)
fdrop(fp, td);
td->td_retval[0] = fd;
-done2:
- if (error != 0) {
- chgkqcnt(cred->cr_ruidinfo, -1, 0);
- crfree(cred);
- }
- return (error);
+ return (0);
}
#ifndef _SYS_SYSPROTO_H_
OpenPOWER on IntegriCloud