diff options
Diffstat (limited to 'fs/ext4')
| -rw-r--r-- | fs/ext4/extents.c | 6 | ||||
| -rw-r--r-- | fs/ext4/ialloc.c | 4 | ||||
| -rw-r--r-- | fs/ext4/mballoc.c | 13 |
3 files changed, 16 insertions, 7 deletions
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index e2eab196875f..e0aa4fe4f596 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
| @@ -1122,7 +1122,8 @@ ext4_ext_search_right(struct inode *inode, struct ext4_ext_path *path, | |||
| 1122 | struct ext4_extent_idx *ix; | 1122 | struct ext4_extent_idx *ix; |
| 1123 | struct ext4_extent *ex; | 1123 | struct ext4_extent *ex; |
| 1124 | ext4_fsblk_t block; | 1124 | ext4_fsblk_t block; |
| 1125 | int depth, ee_len; | 1125 | int depth; /* Note, NOT eh_depth; depth from top of tree */ |
| 1126 | int ee_len; | ||
| 1126 | 1127 | ||
| 1127 | BUG_ON(path == NULL); | 1128 | BUG_ON(path == NULL); |
| 1128 | depth = path->p_depth; | 1129 | depth = path->p_depth; |
| @@ -1179,7 +1180,8 @@ got_index: | |||
| 1179 | if (bh == NULL) | 1180 | if (bh == NULL) |
| 1180 | return -EIO; | 1181 | return -EIO; |
| 1181 | eh = ext_block_hdr(bh); | 1182 | eh = ext_block_hdr(bh); |
| 1182 | if (ext4_ext_check_header(inode, eh, depth)) { | 1183 | /* subtract from p_depth to get proper eh_depth */ |
| 1184 | if (ext4_ext_check_header(inode, eh, path->p_depth - depth)) { | ||
| 1183 | put_bh(bh); | 1185 | put_bh(bh); |
| 1184 | return -EIO; | 1186 | return -EIO; |
| 1185 | } | 1187 | } |
diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index 627f8c3337a3..2d2b3585ee91 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c | |||
| @@ -698,6 +698,7 @@ struct inode *ext4_new_inode(handle_t *handle, struct inode *dir, int mode) | |||
| 698 | struct inode *ret; | 698 | struct inode *ret; |
| 699 | ext4_group_t i; | 699 | ext4_group_t i; |
| 700 | int free = 0; | 700 | int free = 0; |
| 701 | static int once = 1; | ||
| 701 | ext4_group_t flex_group; | 702 | ext4_group_t flex_group; |
| 702 | 703 | ||
| 703 | /* Cannot create files in a deleted directory */ | 704 | /* Cannot create files in a deleted directory */ |
| @@ -719,7 +720,8 @@ struct inode *ext4_new_inode(handle_t *handle, struct inode *dir, int mode) | |||
| 719 | ret2 = find_group_flex(sb, dir, &group); | 720 | ret2 = find_group_flex(sb, dir, &group); |
| 720 | if (ret2 == -1) { | 721 | if (ret2 == -1) { |
| 721 | ret2 = find_group_other(sb, dir, &group); | 722 | ret2 = find_group_other(sb, dir, &group); |
| 722 | if (ret2 == 0 && printk_ratelimit()) | 723 | if (ret2 == 0 && once) |
| 724 | once = 0; | ||
| 723 | printk(KERN_NOTICE "ext4: find_group_flex " | 725 | printk(KERN_NOTICE "ext4: find_group_flex " |
| 724 | "failed, fallback succeeded dir %lu\n", | 726 | "failed, fallback succeeded dir %lu\n", |
| 725 | dir->i_ino); | 727 | dir->i_ino); |
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 4415beeb0b62..9f61e62f435f 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c | |||
| @@ -1447,7 +1447,7 @@ static void ext4_mb_measure_extent(struct ext4_allocation_context *ac, | |||
| 1447 | struct ext4_free_extent *gex = &ac->ac_g_ex; | 1447 | struct ext4_free_extent *gex = &ac->ac_g_ex; |
| 1448 | 1448 | ||
| 1449 | BUG_ON(ex->fe_len <= 0); | 1449 | BUG_ON(ex->fe_len <= 0); |
| 1450 | BUG_ON(ex->fe_len >= EXT4_BLOCKS_PER_GROUP(ac->ac_sb)); | 1450 | BUG_ON(ex->fe_len > EXT4_BLOCKS_PER_GROUP(ac->ac_sb)); |
| 1451 | BUG_ON(ex->fe_start >= EXT4_BLOCKS_PER_GROUP(ac->ac_sb)); | 1451 | BUG_ON(ex->fe_start >= EXT4_BLOCKS_PER_GROUP(ac->ac_sb)); |
| 1452 | BUG_ON(ac->ac_status != AC_STATUS_CONTINUE); | 1452 | BUG_ON(ac->ac_status != AC_STATUS_CONTINUE); |
| 1453 | 1453 | ||
| @@ -3292,7 +3292,7 @@ ext4_mb_normalize_request(struct ext4_allocation_context *ac, | |||
| 3292 | } | 3292 | } |
| 3293 | BUG_ON(start + size <= ac->ac_o_ex.fe_logical && | 3293 | BUG_ON(start + size <= ac->ac_o_ex.fe_logical && |
| 3294 | start > ac->ac_o_ex.fe_logical); | 3294 | start > ac->ac_o_ex.fe_logical); |
| 3295 | BUG_ON(size <= 0 || size >= EXT4_BLOCKS_PER_GROUP(ac->ac_sb)); | 3295 | BUG_ON(size <= 0 || size > EXT4_BLOCKS_PER_GROUP(ac->ac_sb)); |
| 3296 | 3296 | ||
| 3297 | /* now prepare goal request */ | 3297 | /* now prepare goal request */ |
| 3298 | 3298 | ||
| @@ -3589,6 +3589,7 @@ static void ext4_mb_put_pa(struct ext4_allocation_context *ac, | |||
| 3589 | struct super_block *sb, struct ext4_prealloc_space *pa) | 3589 | struct super_block *sb, struct ext4_prealloc_space *pa) |
| 3590 | { | 3590 | { |
| 3591 | ext4_group_t grp; | 3591 | ext4_group_t grp; |
| 3592 | ext4_fsblk_t grp_blk; | ||
| 3592 | 3593 | ||
| 3593 | if (!atomic_dec_and_test(&pa->pa_count) || pa->pa_free != 0) | 3594 | if (!atomic_dec_and_test(&pa->pa_count) || pa->pa_free != 0) |
| 3594 | return; | 3595 | return; |
| @@ -3603,8 +3604,12 @@ static void ext4_mb_put_pa(struct ext4_allocation_context *ac, | |||
| 3603 | pa->pa_deleted = 1; | 3604 | pa->pa_deleted = 1; |
| 3604 | spin_unlock(&pa->pa_lock); | 3605 | spin_unlock(&pa->pa_lock); |
| 3605 | 3606 | ||
| 3606 | /* -1 is to protect from crossing allocation group */ | 3607 | grp_blk = pa->pa_pstart; |
| 3607 | ext4_get_group_no_and_offset(sb, pa->pa_pstart - 1, &grp, NULL); | 3608 | /* If linear, pa_pstart may be in the next group when pa is used up */ |
| 3609 | if (pa->pa_linear) | ||
| 3610 | grp_blk--; | ||
| 3611 | |||
| 3612 | ext4_get_group_no_and_offset(sb, grp_blk, &grp, NULL); | ||
| 3608 | 3613 | ||
| 3609 | /* | 3614 | /* |
| 3610 | * possible race: | 3615 | * possible race: |
