ext4: wait for existing dio workers in ext4_alloc_file_blocks()
[firefly-linux-kernel-4.4.55.git] / fs / ext4 / extents.c
index fc76bda13852546fabfe3c1ddac96850e0b119b4..1ba8b4ab03a8955baffb2a1bbd97e103d063d629 100644 (file)
@@ -4678,6 +4678,10 @@ static int ext4_alloc_file_blocks(struct file *file, ext4_lblk_t offset,
        if (len <= EXT_UNWRITTEN_MAX_LEN)
                flags |= EXT4_GET_BLOCKS_NO_NORMALIZE;
 
+       /* Wait all existing dio workers, newcomers will block on i_mutex */
+       ext4_inode_block_unlocked_dio(inode);
+       inode_dio_wait(inode);
+
        /*
         * credits to insert 1 extent into extent tree
         */
@@ -4741,6 +4745,8 @@ retry:
                goto retry;
        }
 
+       ext4_inode_resume_unlocked_dio(inode);
+
        return ret > 0 ? ret2 : ret;
 }