diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-04-28 23:07:21 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-04-28 23:07:21 -0400 |
| commit | cdface5209349930ae1b51338763c8e029971b97 (patch) | |
| tree | ad6367fc4775b0aea1efda7f62a7d2d35d4d95d5 /fs | |
| parent | 19b9ad67310ed2f685062a00aec602bec33835f0 (diff) | |
| parent | 7ef79ad52136712172eb0525bf0b462516bf2f93 (diff) | |
Merge tag 'for_linus_stable' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4
Pull ext4 fixes from Ted Ts'o:
"Fix misc bugs and a regression for ext4"
* tag 'for_linus_stable' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4:
ext4: add MODULE_SOFTDEP to ensure crc32c is included in the initramfs
ext4: fix bitmap position validation
ext4: set h_journal if there is a failure starting a reserved handle
ext4: prevent right-shifting extents beyond EXT_MAX_BLOCKS
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/ext4/balloc.c | 9 | ||||
| -rw-r--r-- | fs/ext4/extents.c | 16 | ||||
| -rw-r--r-- | fs/ext4/super.c | 1 | ||||
| -rw-r--r-- | fs/jbd2/transaction.c | 1 |
4 files changed, 18 insertions, 9 deletions
diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c index a33d8fb1bf2a..508b905d744d 100644 --- a/fs/ext4/balloc.c +++ b/fs/ext4/balloc.c | |||
| @@ -321,6 +321,7 @@ static ext4_fsblk_t ext4_valid_block_bitmap(struct super_block *sb, | |||
| 321 | struct ext4_sb_info *sbi = EXT4_SB(sb); | 321 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
| 322 | ext4_grpblk_t offset; | 322 | ext4_grpblk_t offset; |
| 323 | ext4_grpblk_t next_zero_bit; | 323 | ext4_grpblk_t next_zero_bit; |
| 324 | ext4_grpblk_t max_bit = EXT4_CLUSTERS_PER_GROUP(sb); | ||
| 324 | ext4_fsblk_t blk; | 325 | ext4_fsblk_t blk; |
| 325 | ext4_fsblk_t group_first_block; | 326 | ext4_fsblk_t group_first_block; |
| 326 | 327 | ||
| @@ -338,7 +339,7 @@ static ext4_fsblk_t ext4_valid_block_bitmap(struct super_block *sb, | |||
| 338 | /* check whether block bitmap block number is set */ | 339 | /* check whether block bitmap block number is set */ |
| 339 | blk = ext4_block_bitmap(sb, desc); | 340 | blk = ext4_block_bitmap(sb, desc); |
| 340 | offset = blk - group_first_block; | 341 | offset = blk - group_first_block; |
| 341 | if (offset < 0 || EXT4_B2C(sbi, offset) >= sb->s_blocksize || | 342 | if (offset < 0 || EXT4_B2C(sbi, offset) >= max_bit || |
| 342 | !ext4_test_bit(EXT4_B2C(sbi, offset), bh->b_data)) | 343 | !ext4_test_bit(EXT4_B2C(sbi, offset), bh->b_data)) |
| 343 | /* bad block bitmap */ | 344 | /* bad block bitmap */ |
| 344 | return blk; | 345 | return blk; |
| @@ -346,7 +347,7 @@ static ext4_fsblk_t ext4_valid_block_bitmap(struct super_block *sb, | |||
| 346 | /* check whether the inode bitmap block number is set */ | 347 | /* check whether the inode bitmap block number is set */ |
| 347 | blk = ext4_inode_bitmap(sb, desc); | 348 | blk = ext4_inode_bitmap(sb, desc); |
| 348 | offset = blk - group_first_block; | 349 | offset = blk - group_first_block; |
| 349 | if (offset < 0 || EXT4_B2C(sbi, offset) >= sb->s_blocksize || | 350 | if (offset < 0 || EXT4_B2C(sbi, offset) >= max_bit || |
| 350 | !ext4_test_bit(EXT4_B2C(sbi, offset), bh->b_data)) | 351 | !ext4_test_bit(EXT4_B2C(sbi, offset), bh->b_data)) |
| 351 | /* bad block bitmap */ | 352 | /* bad block bitmap */ |
| 352 | return blk; | 353 | return blk; |
| @@ -354,8 +355,8 @@ static ext4_fsblk_t ext4_valid_block_bitmap(struct super_block *sb, | |||
| 354 | /* check whether the inode table block number is set */ | 355 | /* check whether the inode table block number is set */ |
| 355 | blk = ext4_inode_table(sb, desc); | 356 | blk = ext4_inode_table(sb, desc); |
| 356 | offset = blk - group_first_block; | 357 | offset = blk - group_first_block; |
| 357 | if (offset < 0 || EXT4_B2C(sbi, offset) >= sb->s_blocksize || | 358 | if (offset < 0 || EXT4_B2C(sbi, offset) >= max_bit || |
| 358 | EXT4_B2C(sbi, offset + sbi->s_itb_per_group) >= sb->s_blocksize) | 359 | EXT4_B2C(sbi, offset + sbi->s_itb_per_group) >= max_bit) |
| 359 | return blk; | 360 | return blk; |
| 360 | next_zero_bit = ext4_find_next_zero_bit(bh->b_data, | 361 | next_zero_bit = ext4_find_next_zero_bit(bh->b_data, |
| 361 | EXT4_B2C(sbi, offset + sbi->s_itb_per_group), | 362 | EXT4_B2C(sbi, offset + sbi->s_itb_per_group), |
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 0a7315961bac..c969275ce3ee 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
| @@ -5329,8 +5329,9 @@ ext4_ext_shift_extents(struct inode *inode, handle_t *handle, | |||
| 5329 | stop = le32_to_cpu(extent->ee_block); | 5329 | stop = le32_to_cpu(extent->ee_block); |
| 5330 | 5330 | ||
| 5331 | /* | 5331 | /* |
| 5332 | * In case of left shift, Don't start shifting extents until we make | 5332 | * For left shifts, make sure the hole on the left is big enough to |
| 5333 | * sure the hole is big enough to accommodate the shift. | 5333 | * accommodate the shift. For right shifts, make sure the last extent |
| 5334 | * won't be shifted beyond EXT_MAX_BLOCKS. | ||
| 5334 | */ | 5335 | */ |
| 5335 | if (SHIFT == SHIFT_LEFT) { | 5336 | if (SHIFT == SHIFT_LEFT) { |
| 5336 | path = ext4_find_extent(inode, start - 1, &path, | 5337 | path = ext4_find_extent(inode, start - 1, &path, |
| @@ -5350,9 +5351,14 @@ ext4_ext_shift_extents(struct inode *inode, handle_t *handle, | |||
| 5350 | 5351 | ||
| 5351 | if ((start == ex_start && shift > ex_start) || | 5352 | if ((start == ex_start && shift > ex_start) || |
| 5352 | (shift > start - ex_end)) { | 5353 | (shift > start - ex_end)) { |
| 5353 | ext4_ext_drop_refs(path); | 5354 | ret = -EINVAL; |
| 5354 | kfree(path); | 5355 | goto out; |
| 5355 | return -EINVAL; | 5356 | } |
| 5357 | } else { | ||
| 5358 | if (shift > EXT_MAX_BLOCKS - | ||
| 5359 | (stop + ext4_ext_get_actual_len(extent))) { | ||
| 5360 | ret = -EINVAL; | ||
| 5361 | goto out; | ||
| 5356 | } | 5362 | } |
| 5357 | } | 5363 | } |
| 5358 | 5364 | ||
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 185f7e61f4cf..eb104e8476f0 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
| @@ -5886,5 +5886,6 @@ static void __exit ext4_exit_fs(void) | |||
| 5886 | MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); | 5886 | MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); |
| 5887 | MODULE_DESCRIPTION("Fourth Extended Filesystem"); | 5887 | MODULE_DESCRIPTION("Fourth Extended Filesystem"); |
| 5888 | MODULE_LICENSE("GPL"); | 5888 | MODULE_LICENSE("GPL"); |
| 5889 | MODULE_SOFTDEP("pre: crc32c"); | ||
| 5889 | module_init(ext4_init_fs) | 5890 | module_init(ext4_init_fs) |
| 5890 | module_exit(ext4_exit_fs) | 5891 | module_exit(ext4_exit_fs) |
diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c index ac311037d7a5..8aa453784402 100644 --- a/fs/jbd2/transaction.c +++ b/fs/jbd2/transaction.c | |||
| @@ -532,6 +532,7 @@ int jbd2_journal_start_reserved(handle_t *handle, unsigned int type, | |||
| 532 | */ | 532 | */ |
| 533 | ret = start_this_handle(journal, handle, GFP_NOFS); | 533 | ret = start_this_handle(journal, handle, GFP_NOFS); |
| 534 | if (ret < 0) { | 534 | if (ret < 0) { |
| 535 | handle->h_journal = journal; | ||
| 535 | jbd2_journal_free_reserved(handle); | 536 | jbd2_journal_free_reserved(handle); |
| 536 | return ret; | 537 | return ret; |
| 537 | } | 538 | } |
