diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index 57cf568..9819216 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -3761,6 +3761,7 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
 	int ret2 = 0;
 	int retries = 0;
 	struct ext4_map_blocks map;
+	int map_blocks_flags;
 	unsigned int credits, blkbits = inode->i_blkbits;
 
 	/*
@@ -3805,9 +3806,15 @@ retry:
 			ret = PTR_ERR(handle);
 			break;
 		}
-		ret = ext4_map_blocks(handle, inode, &map,
-				      EXT4_GET_BLOCKS_CREATE_UNINIT_EXT |
-				      EXT4_GET_BLOCKS_NO_NORMALIZE);
+		map_blocks_flags = EXT4_GET_BLOCKS_CREATE_UNINIT_EXT;
+		/*
+		 * Don't normalize the request if it can fit in one extent so
+		 * that it doesn't get unnecessarily split into multiple
+		 * extents.
+		 */
+		if (len <= EXT_UNINIT_MAX_LEN << blkbits)
+			map_blocks_flags |= EXT4_GET_BLOCKS_NO_NORMALIZE;
+		ret = ext4_map_blocks(handle, inode, &map, map_blocks_flags);
 		if (ret <= 0) {
 #ifdef EXT4FS_DEBUG
 			WARN_ON(ret <= 0);
