From 59bc0cb62a4fcb82defec41046567ddb08167928 Mon Sep 17 00:00:00 2001 From: Albert Herranz Date: Fri, 4 Jun 2010 14:14:57 -0700 Subject: [PATCH] --- yaml --- r: 199817 b: refs/heads/master c: d6d03f9158516b50d0d343158e3f33bcff1e4ca5 h: refs/heads/master i: 199815: 2e14b00246338e27cd9933b6d7092350666dde92 v: v3 --- [refs] | 2 +- trunk/drivers/video/fb_defio.c | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 376ca0e893f7..ca66cbf70b42 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 3f505ca45735c35576dab4ceb3e3736d528b6672 +refs/heads/master: d6d03f9158516b50d0d343158e3f33bcff1e4ca5 diff --git a/trunk/drivers/video/fb_defio.c b/trunk/drivers/video/fb_defio.c index 137100ea8ad7..6b93ef93cb12 100644 --- a/trunk/drivers/video/fb_defio.c +++ b/trunk/drivers/video/fb_defio.c @@ -100,6 +100,16 @@ static int fb_deferred_io_mkwrite(struct vm_area_struct *vma, /* protect against the workqueue changing the page list */ mutex_lock(&fbdefio->lock); + /* + * We want the page to remain locked from ->page_mkwrite until + * the PTE is marked dirty to avoid page_mkclean() being called + * before the PTE is updated, which would leave the page ignored + * by defio. + * Do this by locking the page here and informing the caller + * about it with VM_FAULT_LOCKED. + */ + lock_page(page); + /* we loop through the pagelist before adding in order to keep the pagelist sorted */ list_for_each_entry(cur, &fbdefio->pagelist, lru) { @@ -121,7 +131,7 @@ static int fb_deferred_io_mkwrite(struct vm_area_struct *vma, /* come back after delay to process the deferred IO */ schedule_delayed_work(&info->deferred_work, fbdefio->delay); - return 0; + return VM_FAULT_LOCKED; } static const struct vm_operations_struct fb_deferred_io_vm_ops = {