diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2006-09-22 19:29:42 +0000 |
---|---|---|
committer | Miklos Szeredi <miklos@szeredi.hu> | 2006-09-22 19:29:42 +0000 |
commit | 026e0f46a9ce978b91d0ebcdd0838a3e6687d60f (patch) | |
tree | 13ccf3d79697898d969547103ffcbbbb02914c61 /kernel | |
parent | c3b76815f753b8303a16f7f394748948665c75ba (diff) | |
download | libfuse-026e0f46a9ce978b91d0ebcdd0838a3e6687d60f.tar.gz |
arm caching bug workaround
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/dev.c | 11 | ||||
-rw-r--r-- | kernel/fuse_i.h | 4 |
2 files changed, 15 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; 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 <linux/config.h> |