struct mm_struct *mm;
struct vm_area_struct *vma;
void *old_buf = buf;
+ int atomic;
if (len <= 0) {
return -1;
if (!mm)
return 0;
+ /* FIXME: danger: write memory in atomic context */
+ atomic = in_atomic();
+
/* ignore errors, just check how much was successfully transferred */
while (len) {
int bytes, ret, offset;
if (bytes > PAGE_SIZE-offset)
bytes = PAGE_SIZE-offset;
- maddr = dbi_kmap_atomic(page);
+ maddr = atomic ? dbi_kmap_atomic(page) : kmap(page);
if (write) {
copy_to_user_page(vma, page, addr,
buf, maddr + offset, bytes);
}
- dbi_kunmap_atomic(maddr);
+ atomic ? dbi_kunmap_atomic(maddr) : kunmap(page);
page_cache_release(page);
}
len -= bytes;