vfs,ext2: introduce IS_DAX(inode)
[deliverable/linux.git] / mm / filemap.c
index d9f5336552d7b12cad62315a2c512a9ca922bf55..1578c224285e636ed4e088bb591e958813bd4a74 100644 (file)
@@ -1723,9 +1723,11 @@ generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
                 * we've already read everything we wanted to, or if
                 * there was a short read because we hit EOF, go ahead
                 * and return.  Otherwise fallthrough to buffered io for
-                * the rest of the read.
+                * the rest of the read.  Buffered reads will not work for
+                * DAX files, so don't bother trying.
                 */
-               if (retval < 0 || !iov_iter_count(iter) || *ppos >= size) {
+               if (retval < 0 || !iov_iter_count(iter) || *ppos >= size ||
+                   IS_DAX(inode)) {
                        file_accessed(file);
                        goto out;
                }
@@ -2587,13 +2589,16 @@ ssize_t __generic_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
                loff_t endbyte;
 
                written = generic_file_direct_write(iocb, from, pos);
-               if (written < 0 || written == count)
-                       goto out;
-
                /*
-                * direct-io write to a hole: fall through to buffered I/O
-                * for completing the rest of the request.
+                * If the write stopped short of completing, fall back to
+                * buffered writes.  Some filesystems do this for writes to
+                * holes, for example.  For DAX files, a buffered write will
+                * not succeed (even if it did, DAX does not handle dirty
+                * page-cache pages correctly).
                 */
+               if (written < 0 || written == count || IS_DAX(inode))
+                       goto out;
+
                pos += written;
                count -= written;
 
This page took 0.038844 seconds and 5 git commands to generate.