diff options
Diffstat (limited to 'mm/filemap.c')
-rw-r--r-- | mm/filemap.c | 168 |
1 files changed, 74 insertions, 94 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index 65d9d9e2b755..2d3ec1ffc66e 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -42,9 +42,6 @@ | |||
42 | 42 | ||
43 | #include <asm/mman.h> | 43 | #include <asm/mman.h> |
44 | 44 | ||
45 | static ssize_t | ||
46 | generic_file_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, | ||
47 | loff_t offset, unsigned long nr_segs); | ||
48 | 45 | ||
49 | /* | 46 | /* |
50 | * Shared mappings implemented 30.11.1994. It's not fully working yet, | 47 | * Shared mappings implemented 30.11.1994. It's not fully working yet, |
@@ -118,7 +115,7 @@ void __remove_from_page_cache(struct page *page) | |||
118 | { | 115 | { |
119 | struct address_space *mapping = page->mapping; | 116 | struct address_space *mapping = page->mapping; |
120 | 117 | ||
121 | mem_cgroup_uncharge_page(page); | 118 | mem_cgroup_uncharge_cache_page(page); |
122 | radix_tree_delete(&mapping->page_tree, page->index); | 119 | radix_tree_delete(&mapping->page_tree, page->index); |
123 | page->mapping = NULL; | 120 | page->mapping = NULL; |
124 | mapping->nrpages--; | 121 | mapping->nrpages--; |
@@ -477,12 +474,12 @@ int add_to_page_cache(struct page *page, struct address_space *mapping, | |||
477 | mapping->nrpages++; | 474 | mapping->nrpages++; |
478 | __inc_zone_page_state(page, NR_FILE_PAGES); | 475 | __inc_zone_page_state(page, NR_FILE_PAGES); |
479 | } else | 476 | } else |
480 | mem_cgroup_uncharge_page(page); | 477 | mem_cgroup_uncharge_cache_page(page); |
481 | 478 | ||
482 | write_unlock_irq(&mapping->tree_lock); | 479 | write_unlock_irq(&mapping->tree_lock); |
483 | radix_tree_preload_end(); | 480 | radix_tree_preload_end(); |
484 | } else | 481 | } else |
485 | mem_cgroup_uncharge_page(page); | 482 | mem_cgroup_uncharge_cache_page(page); |
486 | out: | 483 | out: |
487 | return error; | 484 | return error; |
488 | } | 485 | } |
@@ -1200,42 +1197,41 @@ generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov, | |||
1200 | 1197 | ||
1201 | mapping = filp->f_mapping; | 1198 | mapping = filp->f_mapping; |
1202 | inode = mapping->host; | 1199 | inode = mapping->host; |
1203 | retval = 0; | ||
1204 | if (!count) | 1200 | if (!count) |
1205 | goto out; /* skip atime */ | 1201 | goto out; /* skip atime */ |
1206 | size = i_size_read(inode); | 1202 | size = i_size_read(inode); |
1207 | if (pos < size) { | 1203 | if (pos < size) { |
1208 | retval = generic_file_direct_IO(READ, iocb, | 1204 | retval = filemap_write_and_wait(mapping); |
1209 | iov, pos, nr_segs); | 1205 | if (!retval) { |
1206 | retval = mapping->a_ops->direct_IO(READ, iocb, | ||
1207 | iov, pos, nr_segs); | ||
1208 | } | ||
1210 | if (retval > 0) | 1209 | if (retval > 0) |
1211 | *ppos = pos + retval; | 1210 | *ppos = pos + retval; |
1212 | } | 1211 | if (retval) { |
1213 | if (likely(retval != 0)) { | 1212 | file_accessed(filp); |
1214 | file_accessed(filp); | 1213 | goto out; |
1215 | goto out; | 1214 | } |
1216 | } | 1215 | } |
1217 | } | 1216 | } |
1218 | 1217 | ||
1219 | retval = 0; | 1218 | for (seg = 0; seg < nr_segs; seg++) { |
1220 | if (count) { | 1219 | read_descriptor_t desc; |
1221 | for (seg = 0; seg < nr_segs; seg++) { | ||
1222 | read_descriptor_t desc; | ||
1223 | 1220 | ||
1224 | desc.written = 0; | 1221 | desc.written = 0; |
1225 | desc.arg.buf = iov[seg].iov_base; | 1222 | desc.arg.buf = iov[seg].iov_base; |
1226 | desc.count = iov[seg].iov_len; | 1223 | desc.count = iov[seg].iov_len; |
1227 | if (desc.count == 0) | 1224 | if (desc.count == 0) |
1228 | continue; | 1225 | continue; |
1229 | desc.error = 0; | 1226 | desc.error = 0; |
1230 | do_generic_file_read(filp,ppos,&desc,file_read_actor); | 1227 | do_generic_file_read(filp, ppos, &desc, file_read_actor); |
1231 | retval += desc.written; | 1228 | retval += desc.written; |
1232 | if (desc.error) { | 1229 | if (desc.error) { |
1233 | retval = retval ?: desc.error; | 1230 | retval = retval ?: desc.error; |
1234 | break; | 1231 | break; |
1235 | } | ||
1236 | if (desc.count > 0) | ||
1237 | break; | ||
1238 | } | 1232 | } |
1233 | if (desc.count > 0) | ||
1234 | break; | ||
1239 | } | 1235 | } |
1240 | out: | 1236 | out: |
1241 | return retval; | 1237 | return retval; |
@@ -2004,11 +2000,55 @@ generic_file_direct_write(struct kiocb *iocb, const struct iovec *iov, | |||
2004 | struct address_space *mapping = file->f_mapping; | 2000 | struct address_space *mapping = file->f_mapping; |
2005 | struct inode *inode = mapping->host; | 2001 | struct inode *inode = mapping->host; |
2006 | ssize_t written; | 2002 | ssize_t written; |
2003 | size_t write_len; | ||
2004 | pgoff_t end; | ||
2007 | 2005 | ||
2008 | if (count != ocount) | 2006 | if (count != ocount) |
2009 | *nr_segs = iov_shorten((struct iovec *)iov, *nr_segs, count); | 2007 | *nr_segs = iov_shorten((struct iovec *)iov, *nr_segs, count); |
2010 | 2008 | ||
2011 | written = generic_file_direct_IO(WRITE, iocb, iov, pos, *nr_segs); | 2009 | /* |
2010 | * Unmap all mmappings of the file up-front. | ||
2011 | * | ||
2012 | * This will cause any pte dirty bits to be propagated into the | ||
2013 | * pageframes for the subsequent filemap_write_and_wait(). | ||
2014 | */ | ||
2015 | write_len = iov_length(iov, *nr_segs); | ||
2016 | end = (pos + write_len - 1) >> PAGE_CACHE_SHIFT; | ||
2017 | if (mapping_mapped(mapping)) | ||
2018 | unmap_mapping_range(mapping, pos, write_len, 0); | ||
2019 | |||
2020 | written = filemap_write_and_wait(mapping); | ||
2021 | if (written) | ||
2022 | goto out; | ||
2023 | |||
2024 | /* | ||
2025 | * After a write we want buffered reads to be sure to go to disk to get | ||
2026 | * the new data. We invalidate clean cached page from the region we're | ||
2027 | * about to write. We do this *before* the write so that we can return | ||
2028 | * -EIO without clobbering -EIOCBQUEUED from ->direct_IO(). | ||
2029 | */ | ||
2030 | if (mapping->nrpages) { | ||
2031 | written = invalidate_inode_pages2_range(mapping, | ||
2032 | pos >> PAGE_CACHE_SHIFT, end); | ||
2033 | if (written) | ||
2034 | goto out; | ||
2035 | } | ||
2036 | |||
2037 | written = mapping->a_ops->direct_IO(WRITE, iocb, iov, pos, *nr_segs); | ||
2038 | |||
2039 | /* | ||
2040 | * Finally, try again to invalidate clean pages which might have been | ||
2041 | * cached by non-direct readahead, or faulted in by get_user_pages() | ||
2042 | * if the source of the write was an mmap'ed region of the file | ||
2043 | * we're writing. Either one is a pretty crazy thing to do, | ||
2044 | * so we don't support it 100%. If this invalidation | ||
2045 | * fails, tough, the write still worked... | ||
2046 | */ | ||
2047 | if (mapping->nrpages) { | ||
2048 | invalidate_inode_pages2_range(mapping, | ||
2049 | pos >> PAGE_CACHE_SHIFT, end); | ||
2050 | } | ||
2051 | |||
2012 | if (written > 0) { | 2052 | if (written > 0) { |
2013 | loff_t end = pos + written; | 2053 | loff_t end = pos + written; |
2014 | if (end > i_size_read(inode) && !S_ISBLK(inode->i_mode)) { | 2054 | if (end > i_size_read(inode) && !S_ISBLK(inode->i_mode)) { |
@@ -2024,6 +2064,7 @@ generic_file_direct_write(struct kiocb *iocb, const struct iovec *iov, | |||
2024 | * i_mutex is held, which protects generic_osync_inode() from | 2064 | * i_mutex is held, which protects generic_osync_inode() from |
2025 | * livelocking. AIO O_DIRECT ops attempt to sync metadata here. | 2065 | * livelocking. AIO O_DIRECT ops attempt to sync metadata here. |
2026 | */ | 2066 | */ |
2067 | out: | ||
2027 | if ((written >= 0 || written == -EIOCBQUEUED) && | 2068 | if ((written >= 0 || written == -EIOCBQUEUED) && |
2028 | ((file->f_flags & O_SYNC) || IS_SYNC(inode))) { | 2069 | ((file->f_flags & O_SYNC) || IS_SYNC(inode))) { |
2029 | int err = generic_osync_inode(inode, mapping, OSYNC_METADATA); | 2070 | int err = generic_osync_inode(inode, mapping, OSYNC_METADATA); |
@@ -2511,66 +2552,6 @@ ssize_t generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
2511 | } | 2552 | } |
2512 | EXPORT_SYMBOL(generic_file_aio_write); | 2553 | EXPORT_SYMBOL(generic_file_aio_write); |
2513 | 2554 | ||
2514 | /* | ||
2515 | * Called under i_mutex for writes to S_ISREG files. Returns -EIO if something | ||
2516 | * went wrong during pagecache shootdown. | ||
2517 | */ | ||
2518 | static ssize_t | ||
2519 | generic_file_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, | ||
2520 | loff_t offset, unsigned long nr_segs) | ||
2521 | { | ||
2522 | struct file *file = iocb->ki_filp; | ||
2523 | struct address_space *mapping = file->f_mapping; | ||
2524 | ssize_t retval; | ||
2525 | size_t write_len; | ||
2526 | pgoff_t end = 0; /* silence gcc */ | ||
2527 | |||
2528 | /* | ||
2529 | * If it's a write, unmap all mmappings of the file up-front. This | ||
2530 | * will cause any pte dirty bits to be propagated into the pageframes | ||
2531 | * for the subsequent filemap_write_and_wait(). | ||
2532 | */ | ||
2533 | if (rw == WRITE) { | ||
2534 | write_len = iov_length(iov, nr_segs); | ||
2535 | end = (offset + write_len - 1) >> PAGE_CACHE_SHIFT; | ||
2536 | if (mapping_mapped(mapping)) | ||
2537 | unmap_mapping_range(mapping, offset, write_len, 0); | ||
2538 | } | ||
2539 | |||
2540 | retval = filemap_write_and_wait(mapping); | ||
2541 | if (retval) | ||
2542 | goto out; | ||
2543 | |||
2544 | /* | ||
2545 | * After a write we want buffered reads to be sure to go to disk to get | ||
2546 | * the new data. We invalidate clean cached page from the region we're | ||
2547 | * about to write. We do this *before* the write so that we can return | ||
2548 | * -EIO without clobbering -EIOCBQUEUED from ->direct_IO(). | ||
2549 | */ | ||
2550 | if (rw == WRITE && mapping->nrpages) { | ||
2551 | retval = invalidate_inode_pages2_range(mapping, | ||
2552 | offset >> PAGE_CACHE_SHIFT, end); | ||
2553 | if (retval) | ||
2554 | goto out; | ||
2555 | } | ||
2556 | |||
2557 | retval = mapping->a_ops->direct_IO(rw, iocb, iov, offset, nr_segs); | ||
2558 | |||
2559 | /* | ||
2560 | * Finally, try again to invalidate clean pages which might have been | ||
2561 | * cached by non-direct readahead, or faulted in by get_user_pages() | ||
2562 | * if the source of the write was an mmap'ed region of the file | ||
2563 | * we're writing. Either one is a pretty crazy thing to do, | ||
2564 | * so we don't support it 100%. If this invalidation | ||
2565 | * fails, tough, the write still worked... | ||
2566 | */ | ||
2567 | if (rw == WRITE && mapping->nrpages) { | ||
2568 | invalidate_inode_pages2_range(mapping, offset >> PAGE_CACHE_SHIFT, end); | ||
2569 | } | ||
2570 | out: | ||
2571 | return retval; | ||
2572 | } | ||
2573 | |||
2574 | /** | 2555 | /** |
2575 | * try_to_release_page() - release old fs-specific metadata on a page | 2556 | * try_to_release_page() - release old fs-specific metadata on a page |
2576 | * | 2557 | * |
@@ -2582,9 +2563,8 @@ out: | |||
2582 | * Otherwise return zero. | 2563 | * Otherwise return zero. |
2583 | * | 2564 | * |
2584 | * The @gfp_mask argument specifies whether I/O may be performed to release | 2565 | * The @gfp_mask argument specifies whether I/O may be performed to release |
2585 | * this page (__GFP_IO), and whether the call may block (__GFP_WAIT). | 2566 | * this page (__GFP_IO), and whether the call may block (__GFP_WAIT & __GFP_FS). |
2586 | * | 2567 | * |
2587 | * NOTE: @gfp_mask may go away, and this function may become non-blocking. | ||
2588 | */ | 2568 | */ |
2589 | int try_to_release_page(struct page *page, gfp_t gfp_mask) | 2569 | int try_to_release_page(struct page *page, gfp_t gfp_mask) |
2590 | { | 2570 | { |