Lines Matching refs:ks
119 static int ksem_access(struct ksem *ks, struct ucred *ucred);
125 static void ksem_drop(struct ksem *ks);
128 static struct ksem *ksem_hold(struct ksem *ks);
129 static void ksem_insert(char *path, Fnv32_t fnv, struct ksem *ks);
165 struct ksem *ks; in ksem_stat() local
170 ks = fp->f_data; in ksem_stat()
173 error = mac_posixsem_check_stat(active_cred, fp->f_cred, ks); in ksem_stat()
185 sb->st_atim = ks->ks_atime; in ksem_stat()
186 sb->st_ctim = ks->ks_ctime; in ksem_stat()
187 sb->st_mtim = ks->ks_mtime; in ksem_stat()
188 sb->st_birthtim = ks->ks_birthtime; in ksem_stat()
189 sb->st_uid = ks->ks_uid; in ksem_stat()
190 sb->st_gid = ks->ks_gid; in ksem_stat()
191 sb->st_mode = S_IFREG | ks->ks_mode; /* XXX */ in ksem_stat()
201 struct ksem *ks; in ksem_chmod() local
205 ks = fp->f_data; in ksem_chmod()
208 error = mac_posixsem_check_setmode(active_cred, ks, mode); in ksem_chmod()
212 error = vaccess(VREG, ks->ks_mode, ks->ks_uid, ks->ks_gid, VADMIN, in ksem_chmod()
216 ks->ks_mode = mode & ACCESSPERMS; in ksem_chmod()
226 struct ksem *ks; in ksem_chown() local
230 ks = fp->f_data; in ksem_chown()
233 error = mac_posixsem_check_setowner(active_cred, ks, uid, gid); in ksem_chown()
238 uid = ks->ks_uid; in ksem_chown()
240 gid = ks->ks_gid; in ksem_chown()
241 if (((uid != ks->ks_uid && uid != active_cred->cr_uid) || in ksem_chown()
242 (gid != ks->ks_gid && !groupmember(gid, active_cred))) && in ksem_chown()
245 ks->ks_uid = uid; in ksem_chown()
246 ks->ks_gid = gid; in ksem_chown()
255 struct ksem *ks; in ksem_closef() local
257 ks = fp->f_data; in ksem_closef()
259 ksem_drop(ks); in ksem_closef()
268 struct ksem *ks; in ksem_fill_kinfo() local
272 ks = fp->f_data; in ksem_fill_kinfo()
274 kif->kf_un.kf_sem.kf_sem_value = ks->ks_value; in ksem_fill_kinfo()
275 kif->kf_un.kf_sem.kf_sem_mode = S_IFREG | ks->ks_mode; /* XXX */ in ksem_fill_kinfo()
277 if (ks->ks_path != NULL) { in ksem_fill_kinfo()
279 if (ks->ks_path != NULL) { in ksem_fill_kinfo()
280 path = ks->ks_path; in ksem_fill_kinfo()
303 struct ksem *ks; in ksem_alloc() local
312 ks = malloc(sizeof(*ks), M_KSEM, M_WAITOK | M_ZERO); in ksem_alloc()
313 ks->ks_uid = ucred->cr_uid; in ksem_alloc()
314 ks->ks_gid = ucred->cr_gid; in ksem_alloc()
315 ks->ks_mode = mode; in ksem_alloc()
316 ks->ks_value = value; in ksem_alloc()
317 cv_init(&ks->ks_cv, "ksem"); in ksem_alloc()
318 vfs_timestamp(&ks->ks_birthtime); in ksem_alloc()
319 ks->ks_atime = ks->ks_mtime = ks->ks_ctime = ks->ks_birthtime; in ksem_alloc()
320 refcount_init(&ks->ks_ref, 1); in ksem_alloc()
322 mac_posixsem_init(ks); in ksem_alloc()
323 mac_posixsem_create(ucred, ks); in ksem_alloc()
326 return (ks); in ksem_alloc()
330 ksem_hold(struct ksem *ks) in ksem_hold() argument
333 refcount_acquire(&ks->ks_ref); in ksem_hold()
334 return (ks); in ksem_hold()
338 ksem_drop(struct ksem *ks) in ksem_drop() argument
341 if (refcount_release(&ks->ks_ref)) { in ksem_drop()
343 mac_posixsem_destroy(ks); in ksem_drop()
345 cv_destroy(&ks->ks_cv); in ksem_drop()
346 free(ks, M_KSEM); in ksem_drop()
358 ksem_access(struct ksem *ks, struct ucred *ucred) in ksem_access() argument
362 error = vaccess(VREG, ks->ks_mode, ks->ks_uid, ks->ks_gid, in ksem_access()
390 ksem_insert(char *path, Fnv32_t fnv, struct ksem *ks) in ksem_insert() argument
397 map->km_ksem = ksem_hold(ks); in ksem_insert()
398 ks->ks_path = path; in ksem_insert()
467 struct ksem *ks; in ksem_create() local
505 ks = ksem_alloc(td->td_ucred, mode, value); in ksem_create()
506 if (ks == NULL) in ksem_create()
509 ks->ks_flags |= KS_ANONYMOUS; in ksem_create()
533 ks = ksem_lookup(path, fnv); in ksem_create()
534 if (ks == NULL) { in ksem_create()
537 ks = ksem_alloc(td->td_ucred, mode, value); in ksem_create()
538 if (ks == NULL) in ksem_create()
541 ksem_insert(path, fnv, ks); in ksem_create()
557 ks); in ksem_create()
560 error = ksem_access(ks, td->td_ucred); in ksem_create()
563 ksem_hold(ks); in ksem_create()
566 ks = NULL; in ksem_create()
575 KASSERT(ks == NULL, ("ksem_create error with a ksem")); in ksem_create()
580 KASSERT(ks != NULL, ("ksem_create w/o a ksem")); in ksem_create()
582 finit(fp, FREAD | FWRITE, DTYPE_SEM, ks, &ksem_ops); in ksem_create()
593 struct ksem *ks; in ksem_get() local
604 ks = fp->f_data; in ksem_get()
605 if (ks->ks_flags & KS_DEAD) { in ksem_get()
692 struct ksem *ks; in sys_ksem_close() local
701 ks = fp->f_data; in sys_ksem_close()
702 if (ks->ks_flags & KS_ANONYMOUS) { in sys_ksem_close()
721 struct ksem *ks; in sys_ksem_post() local
729 ks = fp->f_data; in sys_ksem_post()
733 error = mac_posixsem_check_post(td->td_ucred, fp->f_cred, ks); in sys_ksem_post()
737 if (ks->ks_value == SEM_VALUE_MAX) { in sys_ksem_post()
741 ++ks->ks_value; in sys_ksem_post()
742 if (ks->ks_waiters > 0) in sys_ksem_post()
743 cv_signal(&ks->ks_cv); in sys_ksem_post()
745 vfs_timestamp(&ks->ks_ctime); in sys_ksem_post()
813 struct ksem *ks; in kern_sem_wait() local
822 ks = fp->f_data; in kern_sem_wait()
827 error = mac_posixsem_check_wait(td->td_ucred, fp->f_cred, ks); in kern_sem_wait()
833 DP(("kern_sem_wait value = %d, tryflag %d\n", ks->ks_value, tryflag)); in kern_sem_wait()
834 vfs_timestamp(&ks->ks_atime); in kern_sem_wait()
835 while (ks->ks_value == 0) { in kern_sem_wait()
836 ks->ks_waiters++; in kern_sem_wait()
840 error = cv_wait_sig(&ks->ks_cv, &sem_lock); in kern_sem_wait()
851 error = cv_timedwait_sig(&ks->ks_cv, in kern_sem_wait()
857 ks->ks_waiters--; in kern_sem_wait()
861 ks->ks_value--; in kern_sem_wait()
862 DP(("kern_sem_wait value post-decrement = %d\n", ks->ks_value)); in kern_sem_wait()
883 struct ksem *ks; in sys_ksem_getvalue() local
891 ks = fp->f_data; in sys_ksem_getvalue()
895 error = mac_posixsem_check_getvalue(td->td_ucred, fp->f_cred, ks); in sys_ksem_getvalue()
902 val = ks->ks_value; in sys_ksem_getvalue()
903 vfs_timestamp(&ks->ks_atime); in sys_ksem_getvalue()
919 struct ksem *ks; in sys_ksem_destroy() local
927 ks = fp->f_data; in sys_ksem_destroy()
928 if (!(ks->ks_flags & KS_ANONYMOUS)) { in sys_ksem_destroy()
933 if (ks->ks_waiters != 0) { in sys_ksem_destroy()
938 ks->ks_flags |= KS_DEAD; in sys_ksem_destroy()