Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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.

v2: override a_ops at open() time rather than mmap() time to minimise
races per AKPM's concerns.

Signed-off-by: Ian Campbell <ijc@hellion.org.uk>
Cc: Jaya Kumar <jayakumar.lkml@gmail.com>
Cc: Nick Piggin <npiggin@suse.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
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: Krzysztof Helt <krzysztof.h1@poczta.fm>
Cc: <stable@kernel.org> [14fcc23fd is in 2.6.25.14 and 2.6.26.1]
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Ian Campbell and committed by
Linus Torvalds
d847471d b42f9317

+26
+19
drivers/video/fb_defio.c
··· 114 114 .page_mkwrite = fb_deferred_io_mkwrite, 115 115 }; 116 116 117 + static int fb_deferred_io_set_page_dirty(struct page *page) 118 + { 119 + if (!PageDirty(page)) 120 + SetPageDirty(page); 121 + return 0; 122 + } 123 + 124 + static const struct address_space_operations fb_deferred_io_aops = { 125 + .set_page_dirty = fb_deferred_io_set_page_dirty, 126 + }; 127 + 117 128 static int fb_deferred_io_mmap(struct fb_info *info, struct vm_area_struct *vma) 118 129 { 119 130 vma->vm_ops = &fb_deferred_io_vm_ops; ··· 173 162 fbdefio->delay = HZ; 174 163 } 175 164 EXPORT_SYMBOL_GPL(fb_deferred_io_init); 165 + 166 + void fb_deferred_io_open(struct fb_info *info, 167 + struct inode *inode, 168 + struct file *file) 169 + { 170 + file->f_mapping->a_ops = &fb_deferred_io_aops; 171 + } 172 + EXPORT_SYMBOL_GPL(fb_deferred_io_open); 176 173 177 174 void fb_deferred_io_cleanup(struct fb_info *info) 178 175 {
+4
drivers/video/fbmem.c
··· 1344 1344 if (res) 1345 1345 module_put(info->fbops->owner); 1346 1346 } 1347 + #ifdef CONFIG_FB_DEFERRED_IO 1348 + if (info->fbdefio) 1349 + fb_deferred_io_open(info, inode, file); 1350 + #endif 1347 1351 out: 1348 1352 unlock_kernel(); 1349 1353 return res;
+3
include/linux/fb.h
··· 976 976 977 977 /* drivers/video/fb_defio.c */ 978 978 extern void fb_deferred_io_init(struct fb_info *info); 979 + extern void fb_deferred_io_open(struct fb_info *info, 980 + struct inode *inode, 981 + struct file *file); 979 982 extern void fb_deferred_io_cleanup(struct fb_info *info); 980 983 extern int fb_deferred_io_fsync(struct file *file, struct dentry *dentry, 981 984 int datasync);