Merge branch 'work.xattr' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[cascardo/linux.git] / fs / ext4 / file.c
index 93072db..2a822d3 100644 (file)
@@ -91,9 +91,7 @@ ext4_unaligned_aio(struct inode *inode, struct iov_iter *from, loff_t pos)
 static ssize_t
 ext4_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
 {
-       struct file *file = iocb->ki_filp;
        struct inode *inode = file_inode(iocb->ki_filp);
-       struct blk_plug plug;
        int o_direct = iocb->ki_flags & IOCB_DIRECT;
        int unaligned_aio = 0;
        int overwrite = 0;
@@ -134,18 +132,16 @@ ext4_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
        if (o_direct) {
                size_t length = iov_iter_count(from);
                loff_t pos = iocb->ki_pos;
-               blk_start_plug(&plug);
 
                /* check whether we do a DIO overwrite or not */
                if (ext4_should_dioread_nolock(inode) && !unaligned_aio &&
-                   !file->f_mapping->nrpages && pos + length <= i_size_read(inode)) {
+                   pos + length <= i_size_read(inode)) {
                        struct ext4_map_blocks map;
                        unsigned int blkbits = inode->i_blkbits;
                        int err, len;
 
                        map.m_lblk = pos >> blkbits;
-                       map.m_len = (EXT4_BLOCK_ALIGN(pos + length, blkbits) >> blkbits)
-                               - map.m_lblk;
+                       map.m_len = EXT4_MAX_BLOCKS(length, pos, blkbits);
                        len = map.m_len;
 
                        err = ext4_map_blocks(NULL, inode, &map, 0);
@@ -171,8 +167,6 @@ ext4_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
 
        if (ret > 0)
                ret = generic_write_sync(iocb, ret);
-       if (o_direct)
-               blk_finish_plug(&plug);
 
        return ret;
 
@@ -703,6 +697,7 @@ const struct file_operations ext4_file_operations = {
        .open           = ext4_file_open,
        .release        = ext4_release_file,
        .fsync          = ext4_sync_file,
+       .get_unmapped_area = thp_get_unmapped_area,
        .splice_read    = generic_file_splice_read,
        .splice_write   = iter_file_splice_write,
        .fallocate      = ext4_fallocate,