From 6839629e99fbbd0c4666f412f78ac49b58862aac Mon Sep 17 00:00:00 2001 From: Ian Campbell Date: Wed, 20 Aug 2008 14:09:23 -0700 Subject: [PATCH] --- yaml --- r: 108952 b: refs/heads/master c: d847471d063663b9f36927d265c66a270c0cfaab h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/video/fb_defio.c | 19 +++++++++++++++++++ trunk/drivers/video/fbmem.c | 4 ++++ trunk/include/linux/fb.h | 3 +++ 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 930faadb77ec..643ebe050f25 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b42f931737bea8ca3982449d63ec46410d13e891 +refs/heads/master: d847471d063663b9f36927d265c66a270c0cfaab diff --git a/trunk/drivers/video/fb_defio.c b/trunk/drivers/video/fb_defio.c index 59df132cc375..4835bdc4e9f1 100644 --- a/trunk/drivers/video/fb_defio.c +++ b/trunk/drivers/video/fb_defio.c @@ -114,6 +114,17 @@ 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; @@ -163,6 +174,14 @@ void fb_deferred_io_init(struct fb_info *info) } EXPORT_SYMBOL_GPL(fb_deferred_io_init); +void fb_deferred_io_open(struct fb_info *info, + struct inode *inode, + struct file *file) +{ + file->f_mapping->a_ops = &fb_deferred_io_aops; +} +EXPORT_SYMBOL_GPL(fb_deferred_io_open); + void fb_deferred_io_cleanup(struct fb_info *info) { void *screen_base = (void __force *) info->screen_base; diff --git a/trunk/drivers/video/fbmem.c b/trunk/drivers/video/fbmem.c index 6b487801eeae..98843c2ecf73 100644 --- a/trunk/drivers/video/fbmem.c +++ b/trunk/drivers/video/fbmem.c @@ -1344,6 +1344,10 @@ fb_open(struct inode *inode, struct file *file) if (res) module_put(info->fbops->owner); } +#ifdef CONFIG_FB_DEFERRED_IO + if (info->fbdefio) + fb_deferred_io_open(info, inode, file); +#endif out: unlock_kernel(); return res; diff --git a/trunk/include/linux/fb.h b/trunk/include/linux/fb.h index 3b8870e32afd..531ccd5f5960 100644 --- a/trunk/include/linux/fb.h +++ b/trunk/include/linux/fb.h @@ -976,6 +976,9 @@ static inline void __fb_pad_aligned_buffer(u8 *dst, u32 d_pitch, /* drivers/video/fb_defio.c */ extern void fb_deferred_io_init(struct fb_info *info); +extern void fb_deferred_io_open(struct fb_info *info, + struct inode *inode, + struct file *file); extern void fb_deferred_io_cleanup(struct fb_info *info); extern int fb_deferred_io_fsync(struct file *file, struct dentry *dentry, int datasync);