fs: ext4: fix writing zero-length files
ext4fs_allocate_blocks() always allocates at least one block for a file. If the file size is zero, this causes total_remaining_blocks to underflow, which then causes an apparent hang while 2^32 blocks are allocated. To solve this, check that total_remaining_blocks is non-zero as part of the loop condition (i.e. before each loop) rather than at the end of the loop. Signed-off-by: Stephen Warren <swarren@nvidia.com>
This commit is contained in:
parent
50babaf852
commit
d018028055
@ -1380,7 +1380,7 @@ void ext4fs_allocate_blocks(struct ext2_inode *file_inode,
|
||||
unsigned int no_blks_reqd = 0;
|
||||
|
||||
/* allocation of direct blocks */
|
||||
for (i = 0; i < INDIRECT_BLOCKS; i++) {
|
||||
for (i = 0; total_remaining_blocks && i < INDIRECT_BLOCKS; i++) {
|
||||
direct_blockno = ext4fs_get_new_blk_no();
|
||||
if (direct_blockno == -1) {
|
||||
printf("no block left to assign\n");
|
||||
@ -1390,8 +1390,6 @@ void ext4fs_allocate_blocks(struct ext2_inode *file_inode,
|
||||
debug("DB %ld: %u\n", direct_blockno, total_remaining_blocks);
|
||||
|
||||
total_remaining_blocks--;
|
||||
if (total_remaining_blocks == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
alloc_single_indirect_block(file_inode, &total_remaining_blocks,
|
||||
|
Loading…
Reference in New Issue
Block a user