diff options
Diffstat (limited to 'kernel/dev.c')
-rw-r--r-- | kernel/dev.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/kernel/dev.c b/kernel/dev.c index 0231caa..62c41a7 100644 --- a/kernel/dev.c +++ b/kernel/dev.c @@ -521,6 +521,9 @@ static int fuse_copy_fill(struct fuse_copy_state *cs) { unsigned long offset; int err; +#ifdef DCACHE_BUG + struct vm_area_struct *vma; +#endif unlock_request(cs->fc, cs->req); fuse_copy_finish(cs); @@ -532,14 +535,22 @@ static int fuse_copy_fill(struct fuse_copy_state *cs) cs->nr_segs --; } down_read(¤t->mm->mmap_sem); +#ifndef DCACHE_BUG err = get_user_pages(current, current->mm, cs->addr, 1, cs->write, 0, &cs->pg, NULL); +#else + err = get_user_pages(current, current->mm, cs->addr, 1, cs->write, 0, + &cs->pg, &vma); +#endif up_read(¤t->mm->mmap_sem); if (err < 0) return err; BUG_ON(err != 1); offset = cs->addr % PAGE_SIZE; cs->mapaddr = kmap_atomic(cs->pg, KM_USER0); +#ifdef DCACHE_BUG + flush_cache_page(vma, cs->addr, page_to_pfn(cs->pg)); +#endif cs->buf = cs->mapaddr + offset; cs->len = min(PAGE_SIZE - offset, cs->seglen); cs->seglen -= cs->len; |