diff options
Diffstat (limited to 'mm/filemap.c')
| -rw-r--r-- | mm/filemap.c | 11 | 
1 files changed, 9 insertions, 2 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index 54e968650855..876bc595d0f8 100644 --- a/mm/filemap.c +++ b/mm/filemap.c  | |||
| @@ -2129,13 +2129,20 @@ generic_file_direct_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 2129 | * After a write we want buffered reads to be sure to go to disk to get | 2129 | * After a write we want buffered reads to be sure to go to disk to get | 
| 2130 | * the new data. We invalidate clean cached page from the region we're | 2130 | * the new data. We invalidate clean cached page from the region we're | 
| 2131 | * about to write. We do this *before* the write so that we can return | 2131 | * about to write. We do this *before* the write so that we can return | 
| 2132 | * -EIO without clobbering -EIOCBQUEUED from ->direct_IO(). | 2132 | * without clobbering -EIOCBQUEUED from ->direct_IO(). | 
| 2133 | */ | 2133 | */ | 
| 2134 | if (mapping->nrpages) { | 2134 | if (mapping->nrpages) { | 
| 2135 | written = invalidate_inode_pages2_range(mapping, | 2135 | written = invalidate_inode_pages2_range(mapping, | 
| 2136 | pos >> PAGE_CACHE_SHIFT, end); | 2136 | pos >> PAGE_CACHE_SHIFT, end); | 
| 2137 | if (written) | 2137 | /* | 
| 2138 | * If a page can not be invalidated, return 0 to fall back | ||
| 2139 | * to buffered write. | ||
| 2140 | */ | ||
| 2141 | if (written) { | ||
| 2142 | if (written == -EBUSY) | ||
| 2143 | return 0; | ||
| 2138 | goto out; | 2144 | goto out; | 
| 2145 | } | ||
| 2139 | } | 2146 | } | 
| 2140 | 2147 | ||
| 2141 | written = mapping->a_ops->direct_IO(WRITE, iocb, iov, pos, *nr_segs); | 2148 | written = mapping->a_ops->direct_IO(WRITE, iocb, iov, pos, *nr_segs); | 
