|
@@ -114,6 +114,17 @@ static struct vm_operations_struct fb_deferred_io_vm_ops = {
|
|
.page_mkwrite = fb_deferred_io_mkwrite,
|
|
.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)
|
|
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_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);
|
|
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 fb_deferred_io_cleanup(struct fb_info *info)
|
|
{
|
|
{
|
|
void *screen_base = (void __force *) info->screen_base;
|
|
void *screen_base = (void __force *) info->screen_base;
|