示例#1
0
/*
 * Called once to initialize data structures...
 */
static int
nfssvc_modevent(module_t mod, int type, void *data)
{
	int error = 0;

	switch (type) {
	case MOD_LOAD:
		error = syscall_helper_register(nfssvc_syscalls,
		    SY_THR_STATIC_KLD);
		break;

	case MOD_UNLOAD:
		if (nfsd_call_nfsserver != NULL || nfsd_call_nfscommon != NULL
		    || nfsd_call_nfscl != NULL || nfsd_call_nfsd != NULL) {
			error = EBUSY;
			break;
		}
		syscall_helper_unregister(nfssvc_syscalls);
		break;
	default:
		error = EOPNOTSUPP;
		break;
	}
	return error;
}
示例#2
0
static void
ksem_module_destroy(void)
{

#ifdef COMPAT_FREEBSD32
	syscall32_helper_unregister(ksem32_syscalls);
#endif
	syscall_helper_unregister(ksem_syscalls);

	hashdestroy(ksem_dictionary, M_KSEM, ksem_hash);
	sx_destroy(&ksem_dict_lock);
	mtx_destroy(&ksem_count_lock);
	mtx_destroy(&sem_lock);
	p31b_unsetcfg(CTL_P1003_1B_SEM_VALUE_MAX);
	p31b_unsetcfg(CTL_P1003_1B_SEM_NSEMS_MAX);
}
示例#3
0
int
syscall_helper_register(struct syscall_helper_data *sd, int flags)
{
	struct syscall_helper_data *sd1;
	int error;

	for (sd1 = sd; sd1->syscall_no != NO_SYSCALL; sd1++) {
		error = syscall_register(&sd1->syscall_no, &sd1->new_sysent,
		    &sd1->old_sysent, flags);
		if (error != 0) {
			syscall_helper_unregister(sd);
			return (error);
		}
		sd1->registered = 1;
	}
	return (0);
}
示例#4
0
static int
msgunload()
{
    struct msqid_kernel *msqkptr;
    int msqid;
#ifdef MAC
    int i;
#endif

    syscall_helper_unregister(msg_syscalls);
#ifdef COMPAT_FREEBSD32
    syscall32_helper_unregister(msg32_syscalls);
#endif

    for (msqid = 0; msqid < msginfo.msgmni; msqid++) {
        /*
         * Look for an unallocated and unlocked msqid_ds.
         * msqid_ds's can be locked by msgsnd or msgrcv while
         * they are copying the message in/out.  We can't
         * re-use the entry until they release it.
         */
        msqkptr = &msqids[msqid];
        if (msqkptr->u.msg_qbytes != 0 ||
                (msqkptr->u.msg_perm.mode & MSG_LOCKED) != 0)
            break;
    }
    if (msqid != msginfo.msgmni)
        return (EBUSY);

#ifdef MAC
    for (i = 0; i < msginfo.msgtql; i++)
        mac_sysvmsg_destroy(&msghdrs[i]);
    for (msqid = 0; msqid < msginfo.msgmni; msqid++)
        mac_sysvmsq_destroy(&msqids[msqid]);
#endif
    free(msgpool, M_MSG);
    free(msgmaps, M_MSG);
    free(msghdrs, M_MSG);
    free(msqids, M_MSG);
    mtx_destroy(&msq_mtx);
    return (0);
}