Messages in this thread Patch in this message | | | From | Ian Campbell <> | Date | Mon, 18 Aug 2008 08:54:39 +0100 | Subject | Re: kernel BUG at lib/radix-tree.c:473! |
| |
On Mon, 2008-08-18 at 11:32 +1000, Nick Piggin wrote: > On Monday 18 August 2008 02:19, Ian Campbell wrote: > > FWIW the patch below apparently makes it work for me, but I'm not going > > to pretend I follow what's going on, why or what else it breaks ;-) > > I think Iwould prefer fs_defio to use its own set_page_dirty > function. __set_page_dirty_no_writeback is supposed to be used > on pagecache, by filesystems.
fbdefio: add set_page_dirty handler to deferred IO FB
Fixes kernel BUG at lib/radix-tree.c:473.
Previously the handler was incidentally provided by tmpfs but this was removed with:
commit 14fcc23fdc78e9d32372553ccf21758a9bd56fa1 Author: Hugh Dickins <hugh@veritas.com> Date: Mon Jul 28 15:46:19 2008 -0700
tmpfs: fix kernel BUG in shmem_delete_inode
relying on this behaviour was incorrect in any case and the BUG also appeared when the device node was on an ext3 filesystem.
Signed-off-by: Ian Campbell <ijc@hellion.org.uk> Cc: Jaya Kumar <jayakumar.lkml@gmail.com> Cc: Nick Piggin <nickpiggin@yahoo.com.au> Cc: Hugh Dickins <hugh@veritas.com> Cc: Johannes Weiner <hannes@saeurebad.de> Cc: Jeremy Fitzhardinge <jeremy@goop.org> Cc: Kel Modderman <kel@otaku42.de> Cc: Markus Armbruster <armbru@redhat.com> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> --- drivers/video/fb_defio.c | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-)
diff --git a/drivers/video/fb_defio.c b/drivers/video/fb_defio.c index 59df132..214bb7c 100644 --- a/drivers/video/fb_defio.c +++ b/drivers/video/fb_defio.c @@ -114,11 +114,23 @@ static struct vm_operations_struct fb_deferred_io_vm_ops = { .page_mkwrite = fb_deferred_io_mkwrite, }; +static int fb_deferred_io_set_page_dirty(struct page *page) +{ + if (!PageDirty(page)) + SetPageDirty(page); + return 0; +} + +static const struct address_space_operations fb_deferred_io_aops = { + .set_page_dirty = fb_deferred_io_set_page_dirty, +}; + static int fb_deferred_io_mmap(struct fb_info *info, struct vm_area_struct *vma) { vma->vm_ops = &fb_deferred_io_vm_ops; vma->vm_flags |= ( VM_IO | VM_RESERVED | VM_DONTEXPAND ); vma->vm_private_data = info; + vma->vm_file->f_mapping->a_ops = &fb_deferred_io_aops; return 0; } -- 1.5.6.3 -- Ian Campbell
How many Unix hacks does it take to change a light bulb? Let's see, can you use a shell script for that or does it need a C program? [unhandled content-type:application/pgp-signature] | |