aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4/extents.c
diff options
context:
space:
mode:
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>2008-04-29 08:11:12 -0400
committerTheodore Ts'o <tytso@mit.edu>2008-04-29 08:11:12 -0400
commite067ba0078cd6f00eb6c4052fec630b78ebe59de (patch)
tree58c5f6d1e86ac03257cde1714fb09437d408043c /fs/ext4/extents.c
parentfd28784adc079afa905df56204b1298ddb4d0bfe (diff)
ext4: make ext4_ext_get_blocks always return <= max_blocks
ext4_ext_get_blocks() returns number of blocks allocated with buffer heads unmapped for a read from prealloc space. This is needed so that delayed allocation doesn't do block reservation for prealloc space since the blocks are already resevred on disk. Fix ext4_ext_get_blocks to not return greater than max_blocks, since some of the code paths cannot handle such a return value. Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/extents.c')
-rw-r--r--fs/ext4/extents.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index c2b004e29ad8..f4ef0b745a53 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -2570,8 +2570,18 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode,
2570 } 2570 }
2571 if (create == EXT4_CREATE_UNINITIALIZED_EXT) 2571 if (create == EXT4_CREATE_UNINITIALIZED_EXT)
2572 goto out; 2572 goto out;
2573 if (!create) 2573 if (!create) {
2574 /*
2575 * We have blocks reserved already. We
2576 * return allocated blocks so that delalloc
2577 * won't do block reservation for us. But
2578 * the buffer head will be unmapped so that
2579 * a read from the block returns 0s.
2580 */
2581 if (allocated > max_blocks)
2582 allocated = max_blocks;
2574 goto out2; 2583 goto out2;
2584 }
2575 2585
2576 ret = ext4_ext_convert_to_initialized(handle, inode, 2586 ret = ext4_ext_convert_to_initialized(handle, inode,
2577 path, iblock, 2587 path, iblock,