|
@@ -547,6 +547,7 @@ static int ext4_alloc_blocks(handle_t *handle, struct inode *inode,
|
|
|
int indirect_blks, int blks,
|
|
|
ext4_fsblk_t new_blocks[4], int *err)
|
|
|
{
|
|
|
+ struct ext4_allocation_request ar;
|
|
|
int target, i;
|
|
|
unsigned long count = 0, blk_allocated = 0;
|
|
|
int index = 0;
|
|
@@ -595,10 +596,17 @@ static int ext4_alloc_blocks(handle_t *handle, struct inode *inode,
|
|
|
if (!target)
|
|
|
goto allocated;
|
|
|
/* Now allocate data blocks */
|
|
|
- count = target;
|
|
|
- /* allocating blocks for data blocks */
|
|
|
- current_block = ext4_new_blocks(handle, inode, iblock,
|
|
|
- goal, &count, err);
|
|
|
+ memset(&ar, 0, sizeof(ar));
|
|
|
+ ar.inode = inode;
|
|
|
+ ar.goal = goal;
|
|
|
+ ar.len = target;
|
|
|
+ ar.logical = iblock;
|
|
|
+ if (S_ISREG(inode->i_mode))
|
|
|
+ /* enable in-core preallocation only for regular files */
|
|
|
+ ar.flags = EXT4_MB_HINT_DATA;
|
|
|
+
|
|
|
+ current_block = ext4_mb_new_blocks(handle, &ar, err);
|
|
|
+
|
|
|
if (*err && (target == blks)) {
|
|
|
/*
|
|
|
* if the allocation failed and we didn't allocate
|
|
@@ -614,7 +622,7 @@ static int ext4_alloc_blocks(handle_t *handle, struct inode *inode,
|
|
|
*/
|
|
|
new_blocks[index] = current_block;
|
|
|
}
|
|
|
- blk_allocated += count;
|
|
|
+ blk_allocated += ar.len;
|
|
|
}
|
|
|
allocated:
|
|
|
/* total number of blocks allocated for direct blocks */
|