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