| .. | .. |
|---|
| 148 | 148 | struct super_block *sb = inode->i_sb; |
|---|
| 149 | 149 | Indirect *p = chain; |
|---|
| 150 | 150 | struct buffer_head *bh; |
|---|
| 151 | + unsigned int key; |
|---|
| 151 | 152 | int ret = -EIO; |
|---|
| 152 | 153 | |
|---|
| 153 | 154 | *err = 0; |
|---|
| .. | .. |
|---|
| 156 | 157 | if (!p->key) |
|---|
| 157 | 158 | goto no_block; |
|---|
| 158 | 159 | while (--depth) { |
|---|
| 159 | | - bh = sb_getblk(sb, le32_to_cpu(p->key)); |
|---|
| 160 | + key = le32_to_cpu(p->key); |
|---|
| 161 | + if (key > ext4_blocks_count(EXT4_SB(sb)->s_es)) { |
|---|
| 162 | + /* the block was out of range */ |
|---|
| 163 | + ret = -EFSCORRUPTED; |
|---|
| 164 | + goto failure; |
|---|
| 165 | + } |
|---|
| 166 | + bh = sb_getblk(sb, key); |
|---|
| 160 | 167 | if (unlikely(!bh)) { |
|---|
| 161 | 168 | ret = -ENOMEM; |
|---|
| 162 | 169 | goto failure; |
|---|
| .. | .. |
|---|
| 642 | 649 | |
|---|
| 643 | 650 | ext4_update_inode_fsync_trans(handle, inode, 1); |
|---|
| 644 | 651 | count = ar.len; |
|---|
| 652 | + |
|---|
| 653 | + /* |
|---|
| 654 | + * Update reserved blocks/metadata blocks after successful block |
|---|
| 655 | + * allocation which had been deferred till now. |
|---|
| 656 | + */ |
|---|
| 657 | + if (flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE) |
|---|
| 658 | + ext4_da_update_reserve_space(inode, count, 1); |
|---|
| 659 | + |
|---|
| 645 | 660 | got_it: |
|---|
| 646 | 661 | map->m_flags |= EXT4_MAP_MAPPED; |
|---|
| 647 | 662 | map->m_pblk = le32_to_cpu(chain[depth-1].key); |
|---|
| .. | .. |
|---|
| 705 | 720 | |
|---|
| 706 | 721 | /* |
|---|
| 707 | 722 | * Truncate transactions can be complex and absolutely huge. So we need to |
|---|
| 708 | | - * be able to restart the transaction at a conventient checkpoint to make |
|---|
| 723 | + * be able to restart the transaction at a convenient checkpoint to make |
|---|
| 709 | 724 | * sure we don't overflow the journal. |
|---|
| 710 | 725 | * |
|---|
| 711 | 726 | * Try to extend this transaction for the purposes of truncation. If |
|---|