diff options
Diffstat (limited to 'mm/filemap.c')
| -rw-r--r-- | mm/filemap.c | 18 | 
1 files changed, 14 insertions, 4 deletions
| diff --git a/mm/filemap.c b/mm/filemap.c index d5e7c2029d16..3ebbe64a0106 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -2347,10 +2347,15 @@ page_ok:  page_not_up_to_date:  		/* Get exclusive access to the page ... */ -		if (iocb->ki_flags & IOCB_WAITQ) +		if (iocb->ki_flags & IOCB_WAITQ) { +			if (written) { +				put_page(page); +				goto out; +			}  			error = lock_page_async(page, iocb->ki_waitq); -		else +		} else {  			error = lock_page_killable(page); +		}  		if (unlikely(error))  			goto readpage_error; @@ -2393,10 +2398,15 @@ readpage:  		}  		if (!PageUptodate(page)) { -			if (iocb->ki_flags & IOCB_WAITQ) +			if (iocb->ki_flags & IOCB_WAITQ) { +				if (written) { +					put_page(page); +					goto out; +				}  				error = lock_page_async(page, iocb->ki_waitq); -			else +			} else {  				error = lock_page_killable(page); +			}  			if (unlikely(error))  				goto readpage_error; | 
