From 026e0f46a9ce978b91d0ebcdd0838a3e6687d60f Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Fri, 22 Sep 2006 19:29:42 +0000 Subject: [PATCH] arm caching bug workaround --- kernel/dev.c | 11 +++++++++++ kernel/fuse_i.h | 4 ++++ 2 files changed, 15 insertions(+) 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 -- 2.30.2