vma = find_vma(current->mm, (unsigned long) data);
if (!vma || (unsigned long) data < vma->vm_start)
return -EFAULT;
if (!(vma->vm_flags & VM_READ))
return -EFAULT;
i = vma->vm_end - (unsigned long) data;
if (PAGE_SIZE <= (unsigned long) i)
i = PAGE_SIZE-1;
if (!(page = __get_free_page(GFP_KERNEL))) {
return -ENOMEM;
}
if (copy_from_user((void *) page,data,i)) {
free_page(page);
return -EFAULT;
}
shouldnt this be enough:
if (!(page = __get_free_page(GFP_KERNEL)))
return -ENOMEM;
if (copy_from_user((void *) page,data,i)) {
free_page(page);
return -EFAULT;
}
? Or is this some early-boot-maybe-bolixed situation?
-- mingo