diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 3b9740c1c16d..7a0dadf6c5fe 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c @@ -83,6 +83,25 @@ static struct buffer_head *ext4_append(handle_t *handle, bh = ext4_bread(handle, inode, *block, EXT4_GET_BLOCKS_CREATE); if (IS_ERR(bh)) return bh; + + for (map.m_lblk = 0; map.m_lblk < *block; map.m_lblk += map.m_len) { + map.m_len = *block - map.m_lblk; + err = ext4_map_blocks(NULL, inode, &map, 0); + if (err < 0) { + brelse(bh); + return ERR_PTR(err); + } + if (err > 0 && bh->b_blocknr - map.m_pblk < map.m_len) { + EXT4_ERROR_INODE(inode, + "new block %llu already mapped", + (unsigned long long)bh->b_blocknr); + brelse(bh); + return ERR_PTR(-EFSCORRUPTED); + } + if (map.m_len < 1) + map.m_len = 1; + } + inode->i_size += inode->i_sb->s_blocksize; EXT4_I(inode)->i_disksize = inode->i_size; err = ext4_mark_inode_dirty(handle, inode);