#endif 
int handle_page_fault(unsigned long address, unsigned long ip, 		      int is_write, int is_user, int *code_out){	struct mm_struct *mm = current->mm;	struct vm_area_struct *vma;	pgd_t *pgd;	pud_t *pud;	pmd_t *pmd;	pte_t *pte;	int err = -EFAULT;	*code_out = SEGV_MAPERR;	/* If the fault was during atomic operation, don't take the fault, just	 * fail. */	if (in_atomic())		goto out_nosemaphore;	down_read(&mm->mmap_sem);	vma = find_vma(mm, address);	if(!vma) 		goto out;	else if(vma->vm_start <= address) 		goto good_area;	else if(!(vma->vm_flags & VM_GROWSDOWN)) 		goto out;	else if(is_user && !ARCH_IS_STACKGROW(address))		goto out;	else if(expand_stack(vma, address)) 		goto out;good_area:	*code_out = SEGV_ACCERR;	if(is_write && !(vma->vm_flags & VM_WRITE)) 		goto out;	/* Don't require VM_READ|VM_EXEC for write faults! */        if(!is_write && !(vma->vm_flags & (VM_READ | VM_EXEC)))                goto out;	do {survive:		switch (handle_mm_fault(mm, vma, address, is_write)){		case VM_FAULT_MINOR:			current->min_flt++;			break;		case VM_FAULT_MAJOR:			current->maj_flt++;			break;		case VM_FAULT_SIGBUS:			err = -EACCES;			goto out;		case VM_FAULT_OOM:			err = -ENOMEM;			goto out_of_memory;		default:			BUG();		}		pgd = pgd_offset(mm, address);		pud = pud_offset(pgd, address);		pmd = pmd_offset(pud, address);		pte = pte_offset_kernel(pmd, address);	} while(!pte_present(*pte));	err = 0;	WARN_ON(!pte_young(*pte) || (is_write && !pte_dirty(*pte)));	flush_tlb_page(vma, address);out:	up_read(&mm->mmap_sem);out_nosemaphore:	return(err);/* * We ran out of memory, or some other thing happened to us that made * us unable to handle the page fault gracefully. */out_of_memory:	if (current->pid == 1) {		up_read(&mm->mmap_sem);		yield();		down_read(&mm->mmap_sem);		goto survive;	}	goto out;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/cbc24afa82106b67df804cb434739e4382eecd9a/trap_kern.c/buggy/arch/um/kernel/trap_kern.c