]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - mm/filemap.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/livep...
[mirror_ubuntu-artful-kernel.git] / mm / filemap.c
index 673e4581a2e541b44b02cd8ef201772dad5311a1..ad7242043bdb8b74872e536b61d01ca05a1de6b3 100644 (file)
@@ -211,7 +211,7 @@ void __delete_from_page_cache(struct page *page, void *shadow)
         */
        if (PageDirty(page) && mapping_cap_account_dirty(mapping)) {
                dec_zone_page_state(page, NR_FILE_DIRTY);
-               dec_bdi_stat(mapping->backing_dev_info, BDI_RECLAIMABLE);
+               dec_bdi_stat(inode_to_bdi(mapping->host), BDI_RECLAIMABLE);
        }
 }
 
@@ -1695,8 +1695,7 @@ generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
        loff_t *ppos = &iocb->ki_pos;
        loff_t pos = *ppos;
 
-       /* coalesce the iovecs and go direct-to-BIO for O_DIRECT */
-       if (file->f_flags & O_DIRECT) {
+       if (io_is_direct(file)) {
                struct address_space *mapping = file->f_mapping;
                struct inode *inode = mapping->host;
                size_t count = iov_iter_count(iter);
@@ -1723,9 +1722,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;
                }
@@ -2087,7 +2088,6 @@ const struct vm_operations_struct generic_file_vm_ops = {
        .fault          = filemap_fault,
        .map_pages      = filemap_map_pages,
        .page_mkwrite   = filemap_page_mkwrite,
-       .remap_pages    = generic_file_remap_pages,
 };
 
 /* This is used for a general mmap of a disk file */
@@ -2565,7 +2565,7 @@ ssize_t __generic_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
        size_t          count = iov_iter_count(from);
 
        /* We can write back this queue in page reclaim */
-       current->backing_dev_info = mapping->backing_dev_info;
+       current->backing_dev_info = inode_to_bdi(inode);
        err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode));
        if (err)
                goto out;
@@ -2583,18 +2583,20 @@ ssize_t __generic_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
        if (err)
                goto out;
 
-       /* coalesce the iovecs and go direct-to-BIO for O_DIRECT */
-       if (unlikely(file->f_flags & O_DIRECT)) {
+       if (io_is_direct(file)) {
                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;