Lines Matching defs:semakptr
89 struct semid_kernel *semakptr);
543 semvalid(int semid, struct prison *rpr, struct semid_kernel *semakptr)
546 return ((semakptr->u.sem_perm.mode & SEM_ALLOC) == 0 ||
547 semakptr->u.sem_perm.seq != IPCID_TO_SEQ(semid) ||
548 sem_prison_cansee(rpr, semakptr) ? EINVAL : 0);
554 struct semid_kernel *semakptr;
560 semakptr = &sema[semidx];
561 KASSERT(semakptr->u.__sem_base - sem + semakptr->u.sem_nsems <= semtot,
563 semidx, semakptr->u.__sem_base, sem, semakptr->u.sem_nsems,
566 semakptr->u.sem_perm.cuid = cred ? cred->cr_uid : 0;
567 semakptr->u.sem_perm.uid = cred ? cred->cr_uid : 0;
568 semakptr->u.sem_perm.mode = 0;
569 racct_sub_cred(semakptr->cred, RACCT_NSEM, semakptr->u.sem_nsems);
570 crfree(semakptr->cred);
571 semakptr->cred = NULL;
576 mac_sysvsem_cleanup(semakptr);
578 wakeup(semakptr);
581 sema[i].u.__sem_base > semakptr->u.__sem_base)
584 for (i = semakptr->u.__sem_base - sem + semakptr->u.sem_nsems;
586 sem[i - semakptr->u.sem_nsems] = sem[i];
589 sema[i].u.__sem_base > semakptr->u.__sem_base) {
590 sema[i].u.__sem_base -= semakptr->u.sem_nsems;
594 semtot -= semakptr->u.sem_nsems;
610 sem_prison_cansee(struct prison *rpr, struct semid_kernel *semakptr)
613 if (semakptr->cred == NULL ||
614 !(rpr == semakptr->cred->cr_prison ||
615 prison_ischild(rpr, semakptr->cred->cr_prison)))
698 struct semid_kernel *semakptr;
723 semakptr = &sema[semid];
726 if ((semakptr->u.sem_perm.mode & SEM_ALLOC) == 0) {
730 if ((error = sem_prison_cansee(rpr, semakptr)))
732 if ((error = ipcperm(td, &semakptr->u.sem_perm, IPC_R)))
735 error = mac_sysvsem_check_semctl(cred, semakptr, cmd);
739 bcopy(&semakptr->u, arg->buf, sizeof(struct semid_ds));
740 if (cred->cr_prison != semakptr->cred->cr_prison)
742 *rval = IXSEQ_TO_IPCID(semid, semakptr->u.sem_perm);
751 semakptr = &sema[semidx];
758 error = mac_sysvsem_check_semctl(cred, semakptr, cmd);
768 if ((error = semvalid(semid, rpr, semakptr)) != 0)
770 if ((error = ipcperm(td, &semakptr->u.sem_perm, IPC_M)))
777 if ((error = semvalid(semid, rpr, semakptr)) != 0)
779 if ((error = ipcperm(td, &semakptr->u.sem_perm, IPC_M)))
782 semakptr->u.sem_perm.uid = sbuf->sem_perm.uid;
783 semakptr->u.sem_perm.gid = sbuf->sem_perm.gid;
784 semakptr->u.sem_perm.mode = (semakptr->u.sem_perm.mode &
786 semakptr->u.sem_ctime = time_second;
790 if ((error = semvalid(semid, rpr, semakptr)) != 0)
792 if ((error = ipcperm(td, &semakptr->u.sem_perm, IPC_R)))
794 bcopy(&semakptr->u, arg->buf, sizeof(struct semid_ds));
795 if (cred->cr_prison != semakptr->cred->cr_prison)
807 if ((error = semvalid(semid, rpr, semakptr)) != 0)
809 if ((error = ipcperm(td, &semakptr->u.sem_perm, IPC_R)))
811 if (semnum < 0 || semnum >= semakptr->u.sem_nsems) {
815 *rval = semakptr->u.__sem_base[semnum].semncnt;
819 if ((error = semvalid(semid, rpr, semakptr)) != 0)
821 if ((error = ipcperm(td, &semakptr->u.sem_perm, IPC_R)))
823 if (semnum < 0 || semnum >= semakptr->u.sem_nsems) {
827 *rval = semakptr->u.__sem_base[semnum].sempid;
831 if ((error = semvalid(semid, rpr, semakptr)) != 0)
833 if ((error = ipcperm(td, &semakptr->u.sem_perm, IPC_R)))
835 if (semnum < 0 || semnum >= semakptr->u.sem_nsems) {
839 *rval = semakptr->u.__sem_base[semnum].semval;
863 count = semakptr->u.sem_nsems;
867 if ((error = semvalid(semid, rpr, semakptr)) != 0)
869 KASSERT(count == semakptr->u.sem_nsems, ("nsems changed"));
870 if ((error = ipcperm(td, &semakptr->u.sem_perm, IPC_R)))
872 for (i = 0; i < semakptr->u.sem_nsems; i++)
873 array[i] = semakptr->u.__sem_base[i].semval;
880 if ((error = semvalid(semid, rpr, semakptr)) != 0)
882 if ((error = ipcperm(td, &semakptr->u.sem_perm, IPC_R)))
884 if (semnum < 0 || semnum >= semakptr->u.sem_nsems) {
888 *rval = semakptr->u.__sem_base[semnum].semzcnt;
892 if ((error = semvalid(semid, rpr, semakptr)) != 0)
894 if ((error = ipcperm(td, &semakptr->u.sem_perm, IPC_W)))
896 if (semnum < 0 || semnum >= semakptr->u.sem_nsems) {
904 semakptr->u.__sem_base[semnum].semval = arg->val;
908 wakeup(semakptr);
916 count = semakptr->u.sem_nsems;
923 if ((error = semvalid(semid, rpr, semakptr)) != 0)
925 KASSERT(count == semakptr->u.sem_nsems, ("nsems changed"));
926 if ((error = ipcperm(td, &semakptr->u.sem_perm, IPC_W)))
928 for (i = 0; i < semakptr->u.sem_nsems; i++) {
934 semakptr->u.__sem_base[i].semval = usval;
939 wakeup(semakptr);
1111 struct semid_kernel *semakptr;
1185 semakptr = &sema[semid];
1188 if ((semakptr->u.sem_perm.mode & SEM_ALLOC) == 0) {
1192 seq = semakptr->u.sem_perm.seq;
1197 if ((error = sem_prison_cansee(rpr, semakptr)) != 0)
1208 if (sopptr->sem_num >= semakptr->u.sem_nsems) {
1217 if ((error = ipcperm(td, &semakptr->u.sem_perm, j))) {
1222 error = mac_sysvsem_check_semop(td->td_ucred, semakptr, j);
1242 semptr = &semakptr->u.__sem_base[sopptr->sem_num];
1245 "semop: semakptr=%p, __sem_base=%p, "
1247 semakptr, semakptr->u.__sem_base, semptr,
1289 semakptr->u.__sem_base[sops[j].sem_num].semval -=
1311 error = msleep_sbt(semakptr, sema_mtxp, (PZERO - 4) | PCATCH,
1319 seq = semakptr->u.sem_perm.seq;
1320 if ((semakptr->u.sem_perm.mode & SEM_ALLOC) == 0 ||
1331 semptr = &semakptr->u.__sem_base[sopptr->sem_num];
1401 semakptr->u.__sem_base[sops[j].sem_num].semval -=
1414 semptr = &semakptr->u.__sem_base[sopptr->sem_num];
1417 semakptr->u.sem_otime = time_second;
1425 wakeup(semakptr);
1445 struct semid_kernel *semakptr;
1480 semakptr = &sema[semid];
1484 if ((semakptr->u.sem_perm.mode & SEM_ALLOC) == 0 ||
1485 (semakptr->u.sem_perm.seq != seq)) {
1489 if (semnum >= semakptr->u.sem_nsems)
1497 semakptr->u.__sem_base[semnum].semval));
1499 if (adjval < 0 && semakptr->u.__sem_base[semnum].semval <
1501 semakptr->u.__sem_base[semnum].semval = 0;
1503 semakptr->u.__sem_base[semnum].semval += adjval;
1505 wakeup(semakptr);