1 diff -ru linux-2.6.28.10.orig/fs/fuse/dev.c linux-2.6.28.10/fs/fuse/dev.c
2 --- linux-2.6.28.10.orig/fs/fuse/dev.c 2009-05-02 20:54:43.000000000 +0200
3 +++ linux-2.6.28.10/fs/fuse/dev.c 2009-06-07 20:29:50.229816000 +0200
9 +extern void (*fuse_flush_cache_all)(void);
10 +extern void (*fuse_flush_cache_page)(struct vm_area_struct *vma, unsigned long page, unsigned long pfn);
14 * Get another pagefull of userspace buffer, and map it to kernel
15 * address space, and lock request
21 + struct vm_area_struct *vma;
24 unlock_request(cs->fc, cs->req);
29 down_read(¤t->mm->mmap_sem);
31 err = get_user_pages(current, current->mm, cs->addr, 1, cs->write, 0,
34 + err = get_user_pages(current, current->mm, cs->addr, 1, cs->write, 0,
37 up_read(¤t->mm->mmap_sem);
41 offset = cs->addr % PAGE_SIZE;
42 cs->mapaddr = kmap_atomic(cs->pg, KM_USER0);
44 + fuse_flush_cache_page(vma, cs->addr, page_to_pfn(cs->pg));
46 cs->buf = cs->mapaddr + offset;
47 cs->len = min(PAGE_SIZE - offset, cs->seglen);
48 cs->seglen -= cs->len;
51 unsigned ncpy = min(*size, cs->len);
54 + // patch from mailing list, it is very important, otherwise,
55 + // can't mount, or ls mount point will hang
56 + fuse_flush_cache_all();
59 memcpy(cs->buf, *val, ncpy);
61 diff -ru linux-2.6.28.10.orig/fs/fuse/fuse_i.h linux-2.6.28.10/fs/fuse/fuse_i.h
62 --- linux-2.6.28.10.orig/fs/fuse/fuse_i.h 2009-05-02 20:54:43.000000000 +0200
63 +++ linux-2.6.28.10/fs/fuse/fuse_i.h 2009-06-06 16:34:54.814468000 +0200
70 #include <linux/fuse.h>
72 diff -ru linux-2.6.28.10.orig/fs/fuse/inode.c linux-2.6.28.10/fs/fuse/inode.c
73 --- linux-2.6.28.10.orig/fs/fuse/inode.c 2009-05-02 20:54:43.000000000 +0200
74 +++ linux-2.6.28.10/fs/fuse/inode.c 2009-06-07 20:33:34.156611000 +0200
75 @@ -1038,6 +1038,10 @@
76 printk("fuse init (API version %i.%i)\n",
77 FUSE_KERNEL_VERSION, FUSE_KERNEL_MINOR_VERSION);
80 +printk("fuse init: DCACHE_BUG enabled\n");
83 INIT_LIST_HEAD(&fuse_conn_list);