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>
This commit is contained in:
parent
fd28784adc
commit
e067ba0078
1 changed files with 11 additions and 1 deletions
|
@ -2570,8 +2570,18 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode,
|
||||||
}
|
}
|
||||||
if (create == EXT4_CREATE_UNINITIALIZED_EXT)
|
if (create == EXT4_CREATE_UNINITIALIZED_EXT)
|
||||||
goto out;
|
goto out;
|
||||||
if (!create)
|
if (!create) {
|
||||||
|
/*
|
||||||
|
* We have blocks reserved already. We
|
||||||
|
* return allocated blocks so that delalloc
|
||||||
|
* won't do block reservation for us. But
|
||||||
|
* the buffer head will be unmapped so that
|
||||||
|
* a read from the block returns 0s.
|
||||||
|
*/
|
||||||
|
if (allocated > max_blocks)
|
||||||
|
allocated = max_blocks;
|
||||||
goto out2;
|
goto out2;
|
||||||
|
}
|
||||||
|
|
||||||
ret = ext4_ext_convert_to_initialized(handle, inode,
|
ret = ext4_ext_convert_to_initialized(handle, inode,
|
||||||
path, iblock,
|
path, iblock,
|
||||||
|
|
Loading…
Reference in a new issue