diff options
author | Matthew Wilcox <matthew.r.wilcox@intel.com> | 2015-02-16 18:58:53 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-16 20:56:03 -0500 |
commit | fbbbad4bc2101e452b24e6e65d3d5e11314a0b5f (patch) | |
tree | 7d12515701e867b88856b0c7f78c9abd7a61785b /mm | |
parent | 2e4cdab0584fa884e0a81c4f45b93ce875c9fcaa (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.c | 19 |
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 | ||