diff options
Diffstat (limited to 'fs/ext4')
-rw-r--r-- | fs/ext4/balloc.c | 8 | ||||
-rw-r--r-- | fs/ext4/bitmap.c | 6 | ||||
-rw-r--r-- | fs/ext4/ext4.h | 7 | ||||
-rw-r--r-- | fs/ext4/ext4_jbd2.c | 8 | ||||
-rw-r--r-- | fs/ext4/extents.c | 60 | ||||
-rw-r--r-- | fs/ext4/ialloc.c | 23 | ||||
-rw-r--r-- | fs/ext4/mballoc.c | 14 | ||||
-rw-r--r-- | fs/ext4/resize.c | 3 | ||||
-rw-r--r-- | fs/ext4/super.c | 9 |
9 files changed, 83 insertions, 55 deletions
diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c index 1b5089067d01..cf1821784a16 100644 --- a/fs/ext4/balloc.c +++ b/fs/ext4/balloc.c | |||
@@ -174,8 +174,7 @@ void ext4_init_block_bitmap(struct super_block *sb, struct buffer_head *bh, | |||
174 | ext4_free_inodes_set(sb, gdp, 0); | 174 | ext4_free_inodes_set(sb, gdp, 0); |
175 | ext4_itable_unused_set(sb, gdp, 0); | 175 | ext4_itable_unused_set(sb, gdp, 0); |
176 | memset(bh->b_data, 0xff, sb->s_blocksize); | 176 | memset(bh->b_data, 0xff, sb->s_blocksize); |
177 | ext4_block_bitmap_csum_set(sb, block_group, gdp, bh, | 177 | ext4_block_bitmap_csum_set(sb, block_group, gdp, bh); |
178 | EXT4_BLOCKS_PER_GROUP(sb) / 8); | ||
179 | return; | 178 | return; |
180 | } | 179 | } |
181 | memset(bh->b_data, 0, sb->s_blocksize); | 180 | memset(bh->b_data, 0, sb->s_blocksize); |
@@ -212,8 +211,7 @@ void ext4_init_block_bitmap(struct super_block *sb, struct buffer_head *bh, | |||
212 | */ | 211 | */ |
213 | ext4_mark_bitmap_end(num_clusters_in_group(sb, block_group), | 212 | ext4_mark_bitmap_end(num_clusters_in_group(sb, block_group), |
214 | sb->s_blocksize * 8, bh->b_data); | 213 | sb->s_blocksize * 8, bh->b_data); |
215 | ext4_block_bitmap_csum_set(sb, block_group, gdp, bh, | 214 | ext4_block_bitmap_csum_set(sb, block_group, gdp, bh); |
216 | EXT4_BLOCKS_PER_GROUP(sb) / 8); | ||
217 | ext4_group_desc_csum_set(sb, block_group, gdp); | 215 | ext4_group_desc_csum_set(sb, block_group, gdp); |
218 | } | 216 | } |
219 | 217 | ||
@@ -350,7 +348,7 @@ void ext4_validate_block_bitmap(struct super_block *sb, | |||
350 | return; | 348 | return; |
351 | } | 349 | } |
352 | if (unlikely(!ext4_block_bitmap_csum_verify(sb, block_group, | 350 | if (unlikely(!ext4_block_bitmap_csum_verify(sb, block_group, |
353 | desc, bh, EXT4_BLOCKS_PER_GROUP(sb) / 8))) { | 351 | desc, bh))) { |
354 | ext4_unlock_group(sb, block_group); | 352 | ext4_unlock_group(sb, block_group); |
355 | ext4_error(sb, "bg %u: bad block bitmap checksum", block_group); | 353 | ext4_error(sb, "bg %u: bad block bitmap checksum", block_group); |
356 | return; | 354 | return; |
diff --git a/fs/ext4/bitmap.c b/fs/ext4/bitmap.c index 5c2d1813ebe9..3285aa5a706a 100644 --- a/fs/ext4/bitmap.c +++ b/fs/ext4/bitmap.c | |||
@@ -58,11 +58,12 @@ void ext4_inode_bitmap_csum_set(struct super_block *sb, ext4_group_t group, | |||
58 | 58 | ||
59 | int ext4_block_bitmap_csum_verify(struct super_block *sb, ext4_group_t group, | 59 | int ext4_block_bitmap_csum_verify(struct super_block *sb, ext4_group_t group, |
60 | struct ext4_group_desc *gdp, | 60 | struct ext4_group_desc *gdp, |
61 | struct buffer_head *bh, int sz) | 61 | struct buffer_head *bh) |
62 | { | 62 | { |
63 | __u32 hi; | 63 | __u32 hi; |
64 | __u32 provided, calculated; | 64 | __u32 provided, calculated; |
65 | struct ext4_sb_info *sbi = EXT4_SB(sb); | 65 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
66 | int sz = EXT4_CLUSTERS_PER_GROUP(sb) / 8; | ||
66 | 67 | ||
67 | if (!EXT4_HAS_RO_COMPAT_FEATURE(sb, | 68 | if (!EXT4_HAS_RO_COMPAT_FEATURE(sb, |
68 | EXT4_FEATURE_RO_COMPAT_METADATA_CSUM)) | 69 | EXT4_FEATURE_RO_COMPAT_METADATA_CSUM)) |
@@ -84,8 +85,9 @@ int ext4_block_bitmap_csum_verify(struct super_block *sb, ext4_group_t group, | |||
84 | 85 | ||
85 | void ext4_block_bitmap_csum_set(struct super_block *sb, ext4_group_t group, | 86 | void ext4_block_bitmap_csum_set(struct super_block *sb, ext4_group_t group, |
86 | struct ext4_group_desc *gdp, | 87 | struct ext4_group_desc *gdp, |
87 | struct buffer_head *bh, int sz) | 88 | struct buffer_head *bh) |
88 | { | 89 | { |
90 | int sz = EXT4_CLUSTERS_PER_GROUP(sb) / 8; | ||
89 | __u32 csum; | 91 | __u32 csum; |
90 | struct ext4_sb_info *sbi = EXT4_SB(sb); | 92 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
91 | 93 | ||
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 3ab2539b7b2e..3c20de1d59d0 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
@@ -1882,10 +1882,10 @@ int ext4_inode_bitmap_csum_verify(struct super_block *sb, ext4_group_t group, | |||
1882 | struct buffer_head *bh, int sz); | 1882 | struct buffer_head *bh, int sz); |
1883 | void ext4_block_bitmap_csum_set(struct super_block *sb, ext4_group_t group, | 1883 | void ext4_block_bitmap_csum_set(struct super_block *sb, ext4_group_t group, |
1884 | struct ext4_group_desc *gdp, | 1884 | struct ext4_group_desc *gdp, |
1885 | struct buffer_head *bh, int sz); | 1885 | struct buffer_head *bh); |
1886 | int ext4_block_bitmap_csum_verify(struct super_block *sb, ext4_group_t group, | 1886 | int ext4_block_bitmap_csum_verify(struct super_block *sb, ext4_group_t group, |
1887 | struct ext4_group_desc *gdp, | 1887 | struct ext4_group_desc *gdp, |
1888 | struct buffer_head *bh, int sz); | 1888 | struct buffer_head *bh); |
1889 | 1889 | ||
1890 | /* balloc.c */ | 1890 | /* balloc.c */ |
1891 | extern void ext4_validate_block_bitmap(struct super_block *sb, | 1891 | extern void ext4_validate_block_bitmap(struct super_block *sb, |
@@ -2063,8 +2063,7 @@ extern int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count); | |||
2063 | extern int ext4_calculate_overhead(struct super_block *sb); | 2063 | extern int ext4_calculate_overhead(struct super_block *sb); |
2064 | extern int ext4_superblock_csum_verify(struct super_block *sb, | 2064 | extern int ext4_superblock_csum_verify(struct super_block *sb, |
2065 | struct ext4_super_block *es); | 2065 | struct ext4_super_block *es); |
2066 | extern void ext4_superblock_csum_set(struct super_block *sb, | 2066 | extern void ext4_superblock_csum_set(struct super_block *sb); |
2067 | struct ext4_super_block *es); | ||
2068 | extern void *ext4_kvmalloc(size_t size, gfp_t flags); | 2067 | extern void *ext4_kvmalloc(size_t size, gfp_t flags); |
2069 | extern void *ext4_kvzalloc(size_t size, gfp_t flags); | 2068 | extern void *ext4_kvzalloc(size_t size, gfp_t flags); |
2070 | extern void ext4_kvfree(void *ptr); | 2069 | extern void ext4_kvfree(void *ptr); |
diff --git a/fs/ext4/ext4_jbd2.c b/fs/ext4/ext4_jbd2.c index bfa65b49d424..b4323ba846b5 100644 --- a/fs/ext4/ext4_jbd2.c +++ b/fs/ext4/ext4_jbd2.c | |||
@@ -143,17 +143,13 @@ int __ext4_handle_dirty_super(const char *where, unsigned int line, | |||
143 | struct buffer_head *bh = EXT4_SB(sb)->s_sbh; | 143 | struct buffer_head *bh = EXT4_SB(sb)->s_sbh; |
144 | int err = 0; | 144 | int err = 0; |
145 | 145 | ||
146 | ext4_superblock_csum_set(sb); | ||
146 | if (ext4_handle_valid(handle)) { | 147 | if (ext4_handle_valid(handle)) { |
147 | ext4_superblock_csum_set(sb, | ||
148 | (struct ext4_super_block *)bh->b_data); | ||
149 | err = jbd2_journal_dirty_metadata(handle, bh); | 148 | err = jbd2_journal_dirty_metadata(handle, bh); |
150 | if (err) | 149 | if (err) |
151 | ext4_journal_abort_handle(where, line, __func__, | 150 | ext4_journal_abort_handle(where, line, __func__, |
152 | bh, handle, err); | 151 | bh, handle, err); |
153 | } else { | 152 | } else |
154 | ext4_superblock_csum_set(sb, | ||
155 | (struct ext4_super_block *)bh->b_data); | ||
156 | mark_buffer_dirty(bh); | 153 | mark_buffer_dirty(bh); |
157 | } | ||
158 | return err; | 154 | return err; |
159 | } | 155 | } |
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 1c94cca35ed1..7011ac967208 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
@@ -52,6 +52,9 @@ | |||
52 | #define EXT4_EXT_MARK_UNINIT1 0x2 /* mark first half uninitialized */ | 52 | #define EXT4_EXT_MARK_UNINIT1 0x2 /* mark first half uninitialized */ |
53 | #define EXT4_EXT_MARK_UNINIT2 0x4 /* mark second half uninitialized */ | 53 | #define EXT4_EXT_MARK_UNINIT2 0x4 /* mark second half uninitialized */ |
54 | 54 | ||
55 | #define EXT4_EXT_DATA_VALID1 0x8 /* first half contains valid data */ | ||
56 | #define EXT4_EXT_DATA_VALID2 0x10 /* second half contains valid data */ | ||
57 | |||
55 | static __le32 ext4_extent_block_csum(struct inode *inode, | 58 | static __le32 ext4_extent_block_csum(struct inode *inode, |
56 | struct ext4_extent_header *eh) | 59 | struct ext4_extent_header *eh) |
57 | { | 60 | { |
@@ -2914,6 +2917,9 @@ static int ext4_split_extent_at(handle_t *handle, | |||
2914 | unsigned int ee_len, depth; | 2917 | unsigned int ee_len, depth; |
2915 | int err = 0; | 2918 | int err = 0; |
2916 | 2919 | ||
2920 | BUG_ON((split_flag & (EXT4_EXT_DATA_VALID1 | EXT4_EXT_DATA_VALID2)) == | ||
2921 | (EXT4_EXT_DATA_VALID1 | EXT4_EXT_DATA_VALID2)); | ||
2922 | |||
2917 | ext_debug("ext4_split_extents_at: inode %lu, logical" | 2923 | ext_debug("ext4_split_extents_at: inode %lu, logical" |
2918 | "block %llu\n", inode->i_ino, (unsigned long long)split); | 2924 | "block %llu\n", inode->i_ino, (unsigned long long)split); |
2919 | 2925 | ||
@@ -2972,7 +2978,14 @@ static int ext4_split_extent_at(handle_t *handle, | |||
2972 | 2978 | ||
2973 | err = ext4_ext_insert_extent(handle, inode, path, &newex, flags); | 2979 | err = ext4_ext_insert_extent(handle, inode, path, &newex, flags); |
2974 | if (err == -ENOSPC && (EXT4_EXT_MAY_ZEROOUT & split_flag)) { | 2980 | if (err == -ENOSPC && (EXT4_EXT_MAY_ZEROOUT & split_flag)) { |
2975 | err = ext4_ext_zeroout(inode, &orig_ex); | 2981 | if (split_flag & (EXT4_EXT_DATA_VALID1|EXT4_EXT_DATA_VALID2)) { |
2982 | if (split_flag & EXT4_EXT_DATA_VALID1) | ||
2983 | err = ext4_ext_zeroout(inode, ex2); | ||
2984 | else | ||
2985 | err = ext4_ext_zeroout(inode, ex); | ||
2986 | } else | ||
2987 | err = ext4_ext_zeroout(inode, &orig_ex); | ||
2988 | |||
2976 | if (err) | 2989 | if (err) |
2977 | goto fix_extent_len; | 2990 | goto fix_extent_len; |
2978 | /* update the extent length and mark as initialized */ | 2991 | /* update the extent length and mark as initialized */ |
@@ -3025,12 +3038,13 @@ static int ext4_split_extent(handle_t *handle, | |||
3025 | uninitialized = ext4_ext_is_uninitialized(ex); | 3038 | uninitialized = ext4_ext_is_uninitialized(ex); |
3026 | 3039 | ||
3027 | if (map->m_lblk + map->m_len < ee_block + ee_len) { | 3040 | if (map->m_lblk + map->m_len < ee_block + ee_len) { |
3028 | split_flag1 = split_flag & EXT4_EXT_MAY_ZEROOUT ? | 3041 | split_flag1 = split_flag & EXT4_EXT_MAY_ZEROOUT; |
3029 | EXT4_EXT_MAY_ZEROOUT : 0; | ||
3030 | flags1 = flags | EXT4_GET_BLOCKS_PRE_IO; | 3042 | flags1 = flags | EXT4_GET_BLOCKS_PRE_IO; |
3031 | if (uninitialized) | 3043 | if (uninitialized) |
3032 | split_flag1 |= EXT4_EXT_MARK_UNINIT1 | | 3044 | split_flag1 |= EXT4_EXT_MARK_UNINIT1 | |
3033 | EXT4_EXT_MARK_UNINIT2; | 3045 | EXT4_EXT_MARK_UNINIT2; |
3046 | if (split_flag & EXT4_EXT_DATA_VALID2) | ||
3047 | split_flag1 |= EXT4_EXT_DATA_VALID1; | ||
3034 | err = ext4_split_extent_at(handle, inode, path, | 3048 | err = ext4_split_extent_at(handle, inode, path, |
3035 | map->m_lblk + map->m_len, split_flag1, flags1); | 3049 | map->m_lblk + map->m_len, split_flag1, flags1); |
3036 | if (err) | 3050 | if (err) |
@@ -3043,8 +3057,8 @@ static int ext4_split_extent(handle_t *handle, | |||
3043 | return PTR_ERR(path); | 3057 | return PTR_ERR(path); |
3044 | 3058 | ||
3045 | if (map->m_lblk >= ee_block) { | 3059 | if (map->m_lblk >= ee_block) { |
3046 | split_flag1 = split_flag & EXT4_EXT_MAY_ZEROOUT ? | 3060 | split_flag1 = split_flag & (EXT4_EXT_MAY_ZEROOUT | |
3047 | EXT4_EXT_MAY_ZEROOUT : 0; | 3061 | EXT4_EXT_DATA_VALID2); |
3048 | if (uninitialized) | 3062 | if (uninitialized) |
3049 | split_flag1 |= EXT4_EXT_MARK_UNINIT1; | 3063 | split_flag1 |= EXT4_EXT_MARK_UNINIT1; |
3050 | if (split_flag & EXT4_EXT_MARK_UNINIT2) | 3064 | if (split_flag & EXT4_EXT_MARK_UNINIT2) |
@@ -3323,26 +3337,47 @@ static int ext4_split_unwritten_extents(handle_t *handle, | |||
3323 | 3337 | ||
3324 | split_flag |= ee_block + ee_len <= eof_block ? EXT4_EXT_MAY_ZEROOUT : 0; | 3338 | split_flag |= ee_block + ee_len <= eof_block ? EXT4_EXT_MAY_ZEROOUT : 0; |
3325 | split_flag |= EXT4_EXT_MARK_UNINIT2; | 3339 | split_flag |= EXT4_EXT_MARK_UNINIT2; |
3326 | 3340 | if (flags & EXT4_GET_BLOCKS_CONVERT) | |
3341 | split_flag |= EXT4_EXT_DATA_VALID2; | ||
3327 | flags |= EXT4_GET_BLOCKS_PRE_IO; | 3342 | flags |= EXT4_GET_BLOCKS_PRE_IO; |
3328 | return ext4_split_extent(handle, inode, path, map, split_flag, flags); | 3343 | return ext4_split_extent(handle, inode, path, map, split_flag, flags); |
3329 | } | 3344 | } |
3330 | 3345 | ||
3331 | static int ext4_convert_unwritten_extents_endio(handle_t *handle, | 3346 | static int ext4_convert_unwritten_extents_endio(handle_t *handle, |
3332 | struct inode *inode, | 3347 | struct inode *inode, |
3333 | struct ext4_ext_path *path) | 3348 | struct ext4_map_blocks *map, |
3349 | struct ext4_ext_path *path) | ||
3334 | { | 3350 | { |
3335 | struct ext4_extent *ex; | 3351 | struct ext4_extent *ex; |
3352 | ext4_lblk_t ee_block; | ||
3353 | unsigned int ee_len; | ||
3336 | int depth; | 3354 | int depth; |
3337 | int err = 0; | 3355 | int err = 0; |
3338 | 3356 | ||
3339 | depth = ext_depth(inode); | 3357 | depth = ext_depth(inode); |
3340 | ex = path[depth].p_ext; | 3358 | ex = path[depth].p_ext; |
3359 | ee_block = le32_to_cpu(ex->ee_block); | ||
3360 | ee_len = ext4_ext_get_actual_len(ex); | ||
3341 | 3361 | ||
3342 | ext_debug("ext4_convert_unwritten_extents_endio: inode %lu, logical" | 3362 | ext_debug("ext4_convert_unwritten_extents_endio: inode %lu, logical" |
3343 | "block %llu, max_blocks %u\n", inode->i_ino, | 3363 | "block %llu, max_blocks %u\n", inode->i_ino, |
3344 | (unsigned long long)le32_to_cpu(ex->ee_block), | 3364 | (unsigned long long)ee_block, ee_len); |
3345 | ext4_ext_get_actual_len(ex)); | 3365 | |
3366 | /* If extent is larger than requested then split is required */ | ||
3367 | if (ee_block != map->m_lblk || ee_len > map->m_len) { | ||
3368 | err = ext4_split_unwritten_extents(handle, inode, map, path, | ||
3369 | EXT4_GET_BLOCKS_CONVERT); | ||
3370 | if (err < 0) | ||
3371 | goto out; | ||
3372 | ext4_ext_drop_refs(path); | ||
3373 | path = ext4_ext_find_extent(inode, map->m_lblk, path); | ||
3374 | if (IS_ERR(path)) { | ||
3375 | err = PTR_ERR(path); | ||
3376 | goto out; | ||
3377 | } | ||
3378 | depth = ext_depth(inode); | ||
3379 | ex = path[depth].p_ext; | ||
3380 | } | ||
3346 | 3381 | ||
3347 | err = ext4_ext_get_access(handle, inode, path + depth); | 3382 | err = ext4_ext_get_access(handle, inode, path + depth); |
3348 | if (err) | 3383 | if (err) |
@@ -3652,7 +3687,7 @@ ext4_ext_handle_uninitialized_extents(handle_t *handle, struct inode *inode, | |||
3652 | } | 3687 | } |
3653 | /* IO end_io complete, convert the filled extent to written */ | 3688 | /* IO end_io complete, convert the filled extent to written */ |
3654 | if ((flags & EXT4_GET_BLOCKS_CONVERT)) { | 3689 | if ((flags & EXT4_GET_BLOCKS_CONVERT)) { |
3655 | ret = ext4_convert_unwritten_extents_endio(handle, inode, | 3690 | ret = ext4_convert_unwritten_extents_endio(handle, inode, map, |
3656 | path); | 3691 | path); |
3657 | if (ret >= 0) { | 3692 | if (ret >= 0) { |
3658 | ext4_update_inode_fsync_trans(handle, inode, 1); | 3693 | ext4_update_inode_fsync_trans(handle, inode, 1); |
@@ -4428,6 +4463,9 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len) | |||
4428 | */ | 4463 | */ |
4429 | if (len <= EXT_UNINIT_MAX_LEN << blkbits) | 4464 | if (len <= EXT_UNINIT_MAX_LEN << blkbits) |
4430 | flags |= EXT4_GET_BLOCKS_NO_NORMALIZE; | 4465 | flags |= EXT4_GET_BLOCKS_NO_NORMALIZE; |
4466 | |||
4467 | /* Prevent race condition between unwritten */ | ||
4468 | ext4_flush_unwritten_io(inode); | ||
4431 | retry: | 4469 | retry: |
4432 | while (ret >= 0 && ret < max_blocks) { | 4470 | while (ret >= 0 && ret < max_blocks) { |
4433 | map.m_lblk = map.m_lblk + ret; | 4471 | map.m_lblk = map.m_lblk + ret; |
diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index fa36372f3fdf..3a100e7a62a8 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c | |||
@@ -725,6 +725,10 @@ repeat_in_this_group: | |||
725 | "inode=%lu", ino + 1); | 725 | "inode=%lu", ino + 1); |
726 | continue; | 726 | continue; |
727 | } | 727 | } |
728 | BUFFER_TRACE(inode_bitmap_bh, "get_write_access"); | ||
729 | err = ext4_journal_get_write_access(handle, inode_bitmap_bh); | ||
730 | if (err) | ||
731 | goto fail; | ||
728 | ext4_lock_group(sb, group); | 732 | ext4_lock_group(sb, group); |
729 | ret2 = ext4_test_and_set_bit(ino, inode_bitmap_bh->b_data); | 733 | ret2 = ext4_test_and_set_bit(ino, inode_bitmap_bh->b_data); |
730 | ext4_unlock_group(sb, group); | 734 | ext4_unlock_group(sb, group); |
@@ -738,6 +742,11 @@ repeat_in_this_group: | |||
738 | goto out; | 742 | goto out; |
739 | 743 | ||
740 | got: | 744 | got: |
745 | BUFFER_TRACE(inode_bitmap_bh, "call ext4_handle_dirty_metadata"); | ||
746 | err = ext4_handle_dirty_metadata(handle, NULL, inode_bitmap_bh); | ||
747 | if (err) | ||
748 | goto fail; | ||
749 | |||
741 | /* We may have to initialize the block bitmap if it isn't already */ | 750 | /* We may have to initialize the block bitmap if it isn't already */ |
742 | if (ext4_has_group_desc_csum(sb) && | 751 | if (ext4_has_group_desc_csum(sb) && |
743 | gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)) { | 752 | gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)) { |
@@ -762,9 +771,7 @@ got: | |||
762 | ext4_free_group_clusters_set(sb, gdp, | 771 | ext4_free_group_clusters_set(sb, gdp, |
763 | ext4_free_clusters_after_init(sb, group, gdp)); | 772 | ext4_free_clusters_after_init(sb, group, gdp)); |
764 | ext4_block_bitmap_csum_set(sb, group, gdp, | 773 | ext4_block_bitmap_csum_set(sb, group, gdp, |
765 | block_bitmap_bh, | 774 | block_bitmap_bh); |
766 | EXT4_BLOCKS_PER_GROUP(sb) / | ||
767 | 8); | ||
768 | ext4_group_desc_csum_set(sb, group, gdp); | 775 | ext4_group_desc_csum_set(sb, group, gdp); |
769 | } | 776 | } |
770 | ext4_unlock_group(sb, group); | 777 | ext4_unlock_group(sb, group); |
@@ -773,11 +780,6 @@ got: | |||
773 | goto fail; | 780 | goto fail; |
774 | } | 781 | } |
775 | 782 | ||
776 | BUFFER_TRACE(inode_bitmap_bh, "get_write_access"); | ||
777 | err = ext4_journal_get_write_access(handle, inode_bitmap_bh); | ||
778 | if (err) | ||
779 | goto fail; | ||
780 | |||
781 | BUFFER_TRACE(group_desc_bh, "get_write_access"); | 783 | BUFFER_TRACE(group_desc_bh, "get_write_access"); |
782 | err = ext4_journal_get_write_access(handle, group_desc_bh); | 784 | err = ext4_journal_get_write_access(handle, group_desc_bh); |
783 | if (err) | 785 | if (err) |
@@ -825,11 +827,6 @@ got: | |||
825 | } | 827 | } |
826 | ext4_unlock_group(sb, group); | 828 | ext4_unlock_group(sb, group); |
827 | 829 | ||
828 | BUFFER_TRACE(inode_bitmap_bh, "call ext4_handle_dirty_metadata"); | ||
829 | err = ext4_handle_dirty_metadata(handle, NULL, inode_bitmap_bh); | ||
830 | if (err) | ||
831 | goto fail; | ||
832 | |||
833 | BUFFER_TRACE(group_desc_bh, "call ext4_handle_dirty_metadata"); | 830 | BUFFER_TRACE(group_desc_bh, "call ext4_handle_dirty_metadata"); |
834 | err = ext4_handle_dirty_metadata(handle, NULL, group_desc_bh); | 831 | err = ext4_handle_dirty_metadata(handle, NULL, group_desc_bh); |
835 | if (err) | 832 | if (err) |
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index f8b27bf80aca..526e55358606 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c | |||
@@ -2805,8 +2805,7 @@ ext4_mb_mark_diskspace_used(struct ext4_allocation_context *ac, | |||
2805 | } | 2805 | } |
2806 | len = ext4_free_group_clusters(sb, gdp) - ac->ac_b_ex.fe_len; | 2806 | len = ext4_free_group_clusters(sb, gdp) - ac->ac_b_ex.fe_len; |
2807 | ext4_free_group_clusters_set(sb, gdp, len); | 2807 | ext4_free_group_clusters_set(sb, gdp, len); |
2808 | ext4_block_bitmap_csum_set(sb, ac->ac_b_ex.fe_group, gdp, bitmap_bh, | 2808 | ext4_block_bitmap_csum_set(sb, ac->ac_b_ex.fe_group, gdp, bitmap_bh); |
2809 | EXT4_BLOCKS_PER_GROUP(sb) / 8); | ||
2810 | ext4_group_desc_csum_set(sb, ac->ac_b_ex.fe_group, gdp); | 2809 | ext4_group_desc_csum_set(sb, ac->ac_b_ex.fe_group, gdp); |
2811 | 2810 | ||
2812 | ext4_unlock_group(sb, ac->ac_b_ex.fe_group); | 2811 | ext4_unlock_group(sb, ac->ac_b_ex.fe_group); |
@@ -4666,8 +4665,7 @@ do_more: | |||
4666 | 4665 | ||
4667 | ret = ext4_free_group_clusters(sb, gdp) + count_clusters; | 4666 | ret = ext4_free_group_clusters(sb, gdp) + count_clusters; |
4668 | ext4_free_group_clusters_set(sb, gdp, ret); | 4667 | ext4_free_group_clusters_set(sb, gdp, ret); |
4669 | ext4_block_bitmap_csum_set(sb, block_group, gdp, bitmap_bh, | 4668 | ext4_block_bitmap_csum_set(sb, block_group, gdp, bitmap_bh); |
4670 | EXT4_BLOCKS_PER_GROUP(sb) / 8); | ||
4671 | ext4_group_desc_csum_set(sb, block_group, gdp); | 4669 | ext4_group_desc_csum_set(sb, block_group, gdp); |
4672 | ext4_unlock_group(sb, block_group); | 4670 | ext4_unlock_group(sb, block_group); |
4673 | percpu_counter_add(&sbi->s_freeclusters_counter, count_clusters); | 4671 | percpu_counter_add(&sbi->s_freeclusters_counter, count_clusters); |
@@ -4811,8 +4809,7 @@ int ext4_group_add_blocks(handle_t *handle, struct super_block *sb, | |||
4811 | mb_free_blocks(NULL, &e4b, bit, count); | 4809 | mb_free_blocks(NULL, &e4b, bit, count); |
4812 | blk_free_count = blocks_freed + ext4_free_group_clusters(sb, desc); | 4810 | blk_free_count = blocks_freed + ext4_free_group_clusters(sb, desc); |
4813 | ext4_free_group_clusters_set(sb, desc, blk_free_count); | 4811 | ext4_free_group_clusters_set(sb, desc, blk_free_count); |
4814 | ext4_block_bitmap_csum_set(sb, block_group, desc, bitmap_bh, | 4812 | ext4_block_bitmap_csum_set(sb, block_group, desc, bitmap_bh); |
4815 | EXT4_BLOCKS_PER_GROUP(sb) / 8); | ||
4816 | ext4_group_desc_csum_set(sb, block_group, desc); | 4813 | ext4_group_desc_csum_set(sb, block_group, desc); |
4817 | ext4_unlock_group(sb, block_group); | 4814 | ext4_unlock_group(sb, block_group); |
4818 | percpu_counter_add(&sbi->s_freeclusters_counter, | 4815 | percpu_counter_add(&sbi->s_freeclusters_counter, |
@@ -4993,8 +4990,9 @@ int ext4_trim_fs(struct super_block *sb, struct fstrim_range *range) | |||
4993 | minlen = EXT4_NUM_B2C(EXT4_SB(sb), | 4990 | minlen = EXT4_NUM_B2C(EXT4_SB(sb), |
4994 | range->minlen >> sb->s_blocksize_bits); | 4991 | range->minlen >> sb->s_blocksize_bits); |
4995 | 4992 | ||
4996 | if (unlikely(minlen > EXT4_CLUSTERS_PER_GROUP(sb)) || | 4993 | if (minlen > EXT4_CLUSTERS_PER_GROUP(sb) || |
4997 | unlikely(start >= max_blks)) | 4994 | start >= max_blks || |
4995 | range->len < sb->s_blocksize) | ||
4998 | return -EINVAL; | 4996 | return -EINVAL; |
4999 | if (end >= max_blks) | 4997 | if (end >= max_blks) |
5000 | end = max_blks - 1; | 4998 | end = max_blks - 1; |
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c index 7a75e1086961..47bf06a2765d 100644 --- a/fs/ext4/resize.c +++ b/fs/ext4/resize.c | |||
@@ -1212,8 +1212,7 @@ static int ext4_set_bitmap_checksums(struct super_block *sb, | |||
1212 | bh = ext4_get_bitmap(sb, group_data->block_bitmap); | 1212 | bh = ext4_get_bitmap(sb, group_data->block_bitmap); |
1213 | if (!bh) | 1213 | if (!bh) |
1214 | return -EIO; | 1214 | return -EIO; |
1215 | ext4_block_bitmap_csum_set(sb, group, gdp, bh, | 1215 | ext4_block_bitmap_csum_set(sb, group, gdp, bh); |
1216 | EXT4_BLOCKS_PER_GROUP(sb) / 8); | ||
1217 | brelse(bh); | 1216 | brelse(bh); |
1218 | 1217 | ||
1219 | return 0; | 1218 | return 0; |
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 7265a0367476..80928f716850 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -143,9 +143,10 @@ int ext4_superblock_csum_verify(struct super_block *sb, | |||
143 | return es->s_checksum == ext4_superblock_csum(sb, es); | 143 | return es->s_checksum == ext4_superblock_csum(sb, es); |
144 | } | 144 | } |
145 | 145 | ||
146 | void ext4_superblock_csum_set(struct super_block *sb, | 146 | void ext4_superblock_csum_set(struct super_block *sb) |
147 | struct ext4_super_block *es) | ||
148 | { | 147 | { |
148 | struct ext4_super_block *es = EXT4_SB(sb)->s_es; | ||
149 | |||
149 | if (!EXT4_HAS_RO_COMPAT_FEATURE(sb, | 150 | if (!EXT4_HAS_RO_COMPAT_FEATURE(sb, |
150 | EXT4_FEATURE_RO_COMPAT_METADATA_CSUM)) | 151 | EXT4_FEATURE_RO_COMPAT_METADATA_CSUM)) |
151 | return; | 152 | return; |
@@ -1963,7 +1964,7 @@ static int ext4_fill_flex_info(struct super_block *sb) | |||
1963 | sbi->s_log_groups_per_flex = 0; | 1964 | sbi->s_log_groups_per_flex = 0; |
1964 | return 1; | 1965 | return 1; |
1965 | } | 1966 | } |
1966 | groups_per_flex = 1 << sbi->s_log_groups_per_flex; | 1967 | groups_per_flex = 1U << sbi->s_log_groups_per_flex; |
1967 | 1968 | ||
1968 | err = ext4_alloc_flex_bg_array(sb, sbi->s_groups_count); | 1969 | err = ext4_alloc_flex_bg_array(sb, sbi->s_groups_count); |
1969 | if (err) | 1970 | if (err) |
@@ -4381,7 +4382,7 @@ static int ext4_commit_super(struct super_block *sb, int sync) | |||
4381 | cpu_to_le32(percpu_counter_sum_positive( | 4382 | cpu_to_le32(percpu_counter_sum_positive( |
4382 | &EXT4_SB(sb)->s_freeinodes_counter)); | 4383 | &EXT4_SB(sb)->s_freeinodes_counter)); |
4383 | BUFFER_TRACE(sbh, "marking dirty"); | 4384 | BUFFER_TRACE(sbh, "marking dirty"); |
4384 | ext4_superblock_csum_set(sb, es); | 4385 | ext4_superblock_csum_set(sb); |
4385 | mark_buffer_dirty(sbh); | 4386 | mark_buffer_dirty(sbh); |
4386 | if (sync) { | 4387 | if (sync) { |
4387 | error = sync_dirty_buffer(sbh); | 4388 | error = sync_dirty_buffer(sbh); |