diff options
Diffstat (limited to 'mm/filemap.c')
| -rw-r--r-- | mm/filemap.c | 159 |
1 files changed, 70 insertions, 89 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index 65d9d9e2b755..7675b91f4f63 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, |
| @@ -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 | * |
