Пример #1
0
int
mfs_ramdir_remove(
    VNODE_T *dvp,
    char *nm,
    VNODE_T **vpp,
    CALL_DATA_T *cd
)
{
    register mfs_mnode_t *mnp;
    register int vnum;
    int error;

    ASSERT(MFS_ISVIEWDIR(VTOM(dvp)));

    mnp =  VTOM(dvp);
    MLOCK(mnp);

    error = ENOENT;
    for (vnum=0; vnum < mnp->mn_ramdir.hwm; vnum++) {
        if (mnp->mn_ramdir.ents[vnum].nm == NULL) continue;
        if (STRCMP(mnp->mn_ramdir.ents[vnum].nm, nm) == 0) {
            if (MVFS_ISVTYPE(mnp->mn_ramdir.ents[vnum].vp, VDIR))
                mnp->mn_ramdir.lnk_cnt--;
            *vpp = mnp->mn_ramdir.ents[vnum].vp;  /* return vnode */
            mnp->mn_ramdir.ents[vnum].vp = NULL;
            STRFREE(mnp->mn_ramdir.ents[vnum].nm);

            mnp->mn_ramdir.mtime.tv_sec = MDKI_CTIME();	

            /* Update high water mark if required */
        
            if (vnum == mnp->mn_ramdir.hwm-1) {
                while (mnp->mn_ramdir.ents[--vnum].nm == NULL) {}
                mnp->mn_ramdir.hwm = vnum+1;
            }

            error = 0;
            MVFS_WRAP_UPDATE_ATTRS(dvp, cd);
            break;
        }
    }
    MUNLOCK(mnp);
    if (error)
        *vpp = NULL;
    else
        MVFS_RM_DCACHE(*vpp);
    return(error);
}
Пример #2
0
void
mfs_ramdir_purge(
    VNODE_T *dvp,
    int release,
    CALL_DATA_T *cd
)
{
    register mfs_mnode_t *mnp;
    register int vnum;

    mnp =  VTOM(dvp);
    ASSERT(MFS_ISVIEWDIR(mnp));

    /* No need to lock.  This is only called from cleanup code. */

    if (mnp->mn_ramdir.ents == NULL) return; 

    for (vnum=0; vnum < mnp->mn_ramdir.max; vnum++) {
	if (mnp->mn_ramdir.ents[vnum].vp != NULL) {
	    ASSERT(mnp->mn_ramdir.ents[vnum].nm);
	    STRFREE(mnp->mn_ramdir.ents[vnum].nm);
            MVFS_DECREMENT_LINK(mnp->mn_ramdir.ents[vnum].vp);
            if (MVFS_ISVTYPE(mnp->mn_ramdir.ents[vnum].vp, VDIR))
                mnp->mn_ramdir.lnk_cnt--;
            if (release)
                ATRIA_VN_RELE(mnp->mn_ramdir.ents[vnum].vp, cd);
            mnp->mn_ramdir.ents[vnum].vp = NULL;
        }
    }
}
Пример #3
0
void
mfs_ramdir_purgevp(
    VNODE_T *dvp,
    VNODE_T *vp,
    CALL_DATA_T *cd
)
{
    register mfs_mnode_t *mnp;
    register int vnum;
    int hwm;

    ASSERT(MFS_ISVIEWDIR(VTOM(dvp)));

    mnp =  VTOM(dvp);
    MLOCK(mnp);

    /* Must continue scan to remove multiple links to same object. */

    for (vnum=0; vnum < mnp->mn_ramdir.hwm; vnum++) {
        if (mnp->mn_ramdir.ents[vnum].vp == vp) {
            if (MVFS_ISVTYPE(vp, VDIR))
                mnp->mn_ramdir.lnk_cnt--;
            ATRIA_VN_RELE(vp, cd);
            mnp->mn_ramdir.ents[vnum].vp = NULL;
            ASSERT(mnp->mn_ramdir.ents[vnum].nm);
            STRFREE(mnp->mn_ramdir.ents[vnum].nm);

            mnp->mn_ramdir.mtime.tv_sec = MDKI_CTIME();	

            /* Update high water mark if releasing the highest slot */

	    if (vnum == mnp->mn_ramdir.hwm-1) {
	        hwm = vnum;
		while (mnp->mn_ramdir.ents[--hwm].nm == NULL) {}
		mnp->mn_ramdir.hwm = hwm+1;
	    }
	}
    }
    MUNLOCK(mnp);
}
Пример #4
0
int
start_all_aps(void)
{
	int x,apic_id, cpu;
	struct pcpu *pc;
	
	mtx_init(&ap_boot_mtx, "ap boot", NULL, MTX_SPIN);

	/* set up temporary P==V mapping for AP boot */
	/* XXX this is a hack, we should boot the AP on its own stack/PTD */

	/* start each AP */
	for (cpu = 1; cpu < mp_ncpus; cpu++) {
		apic_id = cpu_apic_ids[cpu];


		bootAP = cpu;
		bootAPgdt = gdt + (512*cpu);

		/* Get per-cpu data */
		pc = &__pcpu[bootAP];
		pcpu_init(pc, bootAP, sizeof(struct pcpu));
		dpcpu_init((void *)kmem_alloc(kernel_map, DPCPU_SIZE), bootAP);
		pc->pc_apic_id = cpu_apic_ids[bootAP];
		pc->pc_prvspace = pc;
		pc->pc_curthread = 0;

		gdt_segs[GPRIV_SEL].ssd_base = (int) pc;
		gdt_segs[GPROC0_SEL].ssd_base = (int) &pc->pc_common_tss;
		
		PT_SET_MA(bootAPgdt, VTOM(bootAPgdt) | PG_V | PG_RW);
		bzero(bootAPgdt, PAGE_SIZE);
		for (x = 0; x < NGDT; x++)
			ssdtosd(&gdt_segs[x], &bootAPgdt[x].sd);
		PT_SET_MA(bootAPgdt, vtomach(bootAPgdt) | PG_V);
#ifdef notyet
		
                if (HYPERVISOR_vcpu_op(VCPUOP_get_physid, cpu, &cpu_id) == 0) { 
                        apicid = xen_vcpu_physid_to_x86_apicid(cpu_id.phys_id); 
                        acpiid = xen_vcpu_physid_to_x86_acpiid(cpu_id.phys_id); 
#ifdef CONFIG_ACPI 
                        if (acpiid != 0xff) 
                                x86_acpiid_to_apicid[acpiid] = apicid; 
#endif 
                } 
#endif
		
		/* attempt to start the Application Processor */
		if (!start_ap(cpu)) {
			printf("AP #%d (PHY# %d) failed!\n", cpu, apic_id);
			/* better panic as the AP may be running loose */
			printf("panic y/n? [y] ");
			if (cngetc() != 'n')
				panic("bye-bye");
		}

		CPU_SET(cpu, &all_cpus);	/* record AP in CPU map */
	}
	

	pmap_invalidate_range(kernel_pmap, 0, NKPT * NBPDR - 1);
	
	/* number of APs actually started */
	return mp_naps;
}
Пример #5
0
int
mfs_ramdir_add(
    VNODE_T *dvp,
    char *nm,
    VNODE_T *vp,
    int *num,		/* returned slot used */
    CALL_DATA_T *cd
)
{
    register mfs_mnode_t *mnp;
    register int vnum;
    int freevnum;
    int error;

    ASSERT(MFS_ISVIEWDIR(VTOM(dvp)));

    mnp =  VTOM(dvp);
    MLOCK(mnp);

    *num = 0;

    /* Must scan for duplicates and first hole to put
       element into */

    freevnum = -1;
    for (vnum=0; vnum < mnp->mn_ramdir.hwm; vnum++) {
	if (mnp->mn_ramdir.ents[vnum].nm == NULL) {
	    if (freevnum == -1) freevnum = vnum;
	    continue;
	}
	if (STRCMP(mnp->mn_ramdir.ents[vnum].nm, nm) == 0) {
	    MUNLOCK(mnp);
	    return(EEXIST);
	}
    }

    /* If no free slot found, try pushing the highwater mark */

    if (freevnum == -1 && (mnp->mn_ramdir.hwm < mnp->mn_ramdir.max))
	freevnum = mnp->mn_ramdir.hwm++;

    /* If have a slot, fill it in.  Otherwise return an error */

    if (freevnum != -1) {
        mnp->mn_ramdir.ents[freevnum].nm = STRDUP(nm);
        if (mnp->mn_ramdir.ents[freevnum].nm == NULL) error = ENOMEM;
        else {
            mnp->mn_ramdir.ents[freevnum].vp = vp;
            mnp->mn_ramdir.mtime.tv_sec = MDKI_CTIME();	
            if (MVFS_ISVTYPE(vp, VDIR))
                mnp->mn_ramdir.lnk_cnt++;
            *num = freevnum;	/* Return slot number used */
            error = 0;
            MVFS_WRAP_UPDATE_ATTRS(dvp, cd);
        }
    } else {
        error = ENOSPC;
    }

    MUNLOCK(mnp);
    return(error);
}