arm caching bug workaround
authorMiklos Szeredi <miklos@szeredi.hu>
Fri, 22 Sep 2006 19:29:42 +0000 (19:29 +0000)
committerMiklos Szeredi <miklos@szeredi.hu>
Fri, 22 Sep 2006 19:29:42 +0000 (19:29 +0000)
kernel/dev.c
kernel/fuse_i.h

index 0231caa1e1b0a0ec3c9bbb84dc8f61aa2a525f89..62c41a7ab52ada4594a9b7e51b9fceb55dabd7fc 100644 (file)
@@ -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(&current->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(&current->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;
index 5f718a2e148963a282fbe0afbb2308e865a25fd6..e95f2ee748406f48fddabf4710e358a919a05064 100644 (file)
 #  endif
 #endif
 
+#ifdef __arm__
+#define DCACHE_BUG
+#endif
+
 #include "config.h"
 #ifndef KERNEL_2_6
 #  include <linux/config.h>