From: Miklos Szeredi Date: Fri, 22 Sep 2006 19:29:42 +0000 (+0000) Subject: arm caching bug workaround X-Git-Tag: fuse_2_6_0_rc2~13 X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=026e0f46a9ce978b91d0ebcdd0838a3e6687d60f;p=qemu-gpiodev%2Flibfuse.git arm caching bug workaround --- 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; diff --git a/kernel/fuse_i.h b/kernel/fuse_i.h index 5f718a2..e95f2ee 100644 --- a/kernel/fuse_i.h +++ b/kernel/fuse_i.h @@ -51,6 +51,10 @@ # endif #endif +#ifdef __arm__ +#define DCACHE_BUG +#endif + #include "config.h" #ifndef KERNEL_2_6 # include