aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorMatthew Wilcox <matthew.r.wilcox@intel.com>2015-02-16 18:58:53 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2015-02-16 20:56:03 -0500
commitfbbbad4bc2101e452b24e6e65d3d5e11314a0b5f (patch)
tree7d12515701e867b88856b0c7f78c9abd7a61785b /mm
parent2e4cdab0584fa884e0a81c4f45b93ce875c9fcaa (diff)
vfs,ext2: introduce IS_DAX(inode)
Use an inode flag to tag inodes which should avoid using the page cache. Convert ext2 to use it instead of mapping_is_xip(). Prevent I/Os to files tagged with the DAX flag from falling back to buffered I/O. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com> Reviewed-by: Jan Kara <jack@suse.cz> Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: Andreas Dilger <andreas.dilger@intel.com> Cc: Boaz Harrosh <boaz@plexistor.com> Cc: Christoph Hellwig <hch@lst.de> Cc: Dave Chinner <david@fromorbit.com> Cc: Jens Axboe <axboe@kernel.dk> Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Cc: Randy Dunlap <rdunlap@infradead.org> Cc: Ross Zwisler <ross.zwisler@linux.intel.com> Cc: Theodore Ts'o <tytso@mit.edu> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r--mm/filemap.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/mm/filemap.c b/mm/filemap.c
index d9f5336552d7..1578c224285e 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -1723,9 +1723,11 @@ generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
1723 * we've already read everything we wanted to, or if 1723 * we've already read everything we wanted to, or if
1724 * there was a short read because we hit EOF, go ahead 1724 * there was a short read because we hit EOF, go ahead
1725 * and return. Otherwise fallthrough to buffered io for 1725 * and return. Otherwise fallthrough to buffered io for
1726 * the rest of the read. 1726 * the rest of the read. Buffered reads will not work for
1727 * DAX files, so don't bother trying.
1727 */ 1728 */
1728 if (retval < 0 || !iov_iter_count(iter) || *ppos >= size) { 1729 if (retval < 0 || !iov_iter_count(iter) || *ppos >= size ||
1730 IS_DAX(inode)) {
1729 file_accessed(file); 1731 file_accessed(file);
1730 goto out; 1732 goto out;
1731 } 1733 }
@@ -2587,13 +2589,16 @@ ssize_t __generic_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
2587 loff_t endbyte; 2589 loff_t endbyte;
2588 2590
2589 written = generic_file_direct_write(iocb, from, pos); 2591 written = generic_file_direct_write(iocb, from, pos);
2590 if (written < 0 || written == count)
2591 goto out;
2592
2593 /* 2592 /*
2594 * direct-io write to a hole: fall through to buffered I/O 2593 * If the write stopped short of completing, fall back to
2595 * for completing the rest of the request. 2594 * buffered writes. Some filesystems do this for writes to
2595 * holes, for example. For DAX files, a buffered write will
2596 * not succeed (even if it did, DAX does not handle dirty
2597 * page-cache pages correctly).
2596 */ 2598 */
2599 if (written < 0 || written == count || IS_DAX(inode))
2600 goto out;
2601
2597 pos += written; 2602 pos += written;
2598 count -= written; 2603 count -= written;
2599 2604