diff options
| author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-09-17 03:13:47 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-09-17 03:13:47 -0400 |
| commit | ad3273d5f1b99d7319a986ab568dcbde2f9e53dd (patch) | |
| tree | 157e5b5b5c8a32500f98991f216b2082183e62c3 | |
| parent | c0747ad363fff90c2edf490fc089e3ae0920b410 (diff) | |
| parent | cce6c9f7e6029caee45c459db5b3e78fec6973cb (diff) | |
Merge tag 'ext4_for_linus_stable' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4
Ted writes:
Various ext4 bug fixes; primarily making ext4 more robust against
maliciously crafted file systems, and some DAX fixes.
* tag 'ext4_for_linus_stable' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4:
ext4, dax: set ext4_dax_aops for dax files
ext4, dax: add ext4_bmap to ext4_dax_aops
ext4: don't mark mmp buffer head dirty
ext4: show test_dummy_encryption mount option in /proc/mounts
ext4: close race between direct IO and ext4_break_layouts()
ext4: fix online resizing for bigalloc file systems with a 1k block size
ext4: fix online resize's handling of a too-small final block group
ext4: recalucate superblock checksum after updating free blocks/inodes
ext4: avoid arithemetic overflow that can trigger a BUG
ext4: avoid divide by zero fault when deleting corrupted inline directories
ext4: check to make sure the rename(2)'s destination is not freed
ext4: add nonstring annotations to ext4.h
| -rw-r--r-- | fs/ext4/dir.c | 20 | ||||
| -rw-r--r-- | fs/ext4/ext4.h | 20 | ||||
| -rw-r--r-- | fs/ext4/inline.c | 4 | ||||
| -rw-r--r-- | fs/ext4/inode.c | 20 | ||||
| -rw-r--r-- | fs/ext4/mmp.c | 1 | ||||
| -rw-r--r-- | fs/ext4/namei.c | 6 | ||||
| -rw-r--r-- | fs/ext4/resize.c | 23 | ||||
| -rw-r--r-- | fs/ext4/super.c | 4 |
8 files changed, 72 insertions, 26 deletions
diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c index e2902d394f1b..f93f9881ec18 100644 --- a/fs/ext4/dir.c +++ b/fs/ext4/dir.c | |||
| @@ -76,7 +76,7 @@ int __ext4_check_dir_entry(const char *function, unsigned int line, | |||
| 76 | else if (unlikely(rlen < EXT4_DIR_REC_LEN(de->name_len))) | 76 | else if (unlikely(rlen < EXT4_DIR_REC_LEN(de->name_len))) |
| 77 | error_msg = "rec_len is too small for name_len"; | 77 | error_msg = "rec_len is too small for name_len"; |
| 78 | else if (unlikely(((char *) de - buf) + rlen > size)) | 78 | else if (unlikely(((char *) de - buf) + rlen > size)) |
| 79 | error_msg = "directory entry across range"; | 79 | error_msg = "directory entry overrun"; |
| 80 | else if (unlikely(le32_to_cpu(de->inode) > | 80 | else if (unlikely(le32_to_cpu(de->inode) > |
| 81 | le32_to_cpu(EXT4_SB(dir->i_sb)->s_es->s_inodes_count))) | 81 | le32_to_cpu(EXT4_SB(dir->i_sb)->s_es->s_inodes_count))) |
| 82 | error_msg = "inode out of bounds"; | 82 | error_msg = "inode out of bounds"; |
| @@ -85,18 +85,16 @@ int __ext4_check_dir_entry(const char *function, unsigned int line, | |||
| 85 | 85 | ||
| 86 | if (filp) | 86 | if (filp) |
| 87 | ext4_error_file(filp, function, line, bh->b_blocknr, | 87 | ext4_error_file(filp, function, line, bh->b_blocknr, |
| 88 | "bad entry in directory: %s - offset=%u(%u), " | 88 | "bad entry in directory: %s - offset=%u, " |
| 89 | "inode=%u, rec_len=%d, name_len=%d", | 89 | "inode=%u, rec_len=%d, name_len=%d, size=%d", |
| 90 | error_msg, (unsigned) (offset % size), | 90 | error_msg, offset, le32_to_cpu(de->inode), |
| 91 | offset, le32_to_cpu(de->inode), | 91 | rlen, de->name_len, size); |
| 92 | rlen, de->name_len); | ||
| 93 | else | 92 | else |
| 94 | ext4_error_inode(dir, function, line, bh->b_blocknr, | 93 | ext4_error_inode(dir, function, line, bh->b_blocknr, |
| 95 | "bad entry in directory: %s - offset=%u(%u), " | 94 | "bad entry in directory: %s - offset=%u, " |
| 96 | "inode=%u, rec_len=%d, name_len=%d", | 95 | "inode=%u, rec_len=%d, name_len=%d, size=%d", |
| 97 | error_msg, (unsigned) (offset % size), | 96 | error_msg, offset, le32_to_cpu(de->inode), |
| 98 | offset, le32_to_cpu(de->inode), | 97 | rlen, de->name_len, size); |
| 99 | rlen, de->name_len); | ||
| 100 | 98 | ||
| 101 | return 1; | 99 | return 1; |
| 102 | } | 100 | } |
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 0f0edd1cd0cd..caff935fbeb8 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
| @@ -43,6 +43,17 @@ | |||
| 43 | #define __FS_HAS_ENCRYPTION IS_ENABLED(CONFIG_EXT4_FS_ENCRYPTION) | 43 | #define __FS_HAS_ENCRYPTION IS_ENABLED(CONFIG_EXT4_FS_ENCRYPTION) |
| 44 | #include <linux/fscrypt.h> | 44 | #include <linux/fscrypt.h> |
| 45 | 45 | ||
| 46 | #include <linux/compiler.h> | ||
| 47 | |||
| 48 | /* Until this gets included into linux/compiler-gcc.h */ | ||
| 49 | #ifndef __nonstring | ||
| 50 | #if defined(GCC_VERSION) && (GCC_VERSION >= 80000) | ||
| 51 | #define __nonstring __attribute__((nonstring)) | ||
| 52 | #else | ||
| 53 | #define __nonstring | ||
| 54 | #endif | ||
| 55 | #endif | ||
| 56 | |||
| 46 | /* | 57 | /* |
| 47 | * The fourth extended filesystem constants/structures | 58 | * The fourth extended filesystem constants/structures |
| 48 | */ | 59 | */ |
| @@ -675,6 +686,9 @@ enum { | |||
| 675 | /* Max physical block we can address w/o extents */ | 686 | /* Max physical block we can address w/o extents */ |
| 676 | #define EXT4_MAX_BLOCK_FILE_PHYS 0xFFFFFFFF | 687 | #define EXT4_MAX_BLOCK_FILE_PHYS 0xFFFFFFFF |
| 677 | 688 | ||
| 689 | /* Max logical block we can support */ | ||
| 690 | #define EXT4_MAX_LOGICAL_BLOCK 0xFFFFFFFF | ||
| 691 | |||
| 678 | /* | 692 | /* |
| 679 | * Structure of an inode on the disk | 693 | * Structure of an inode on the disk |
| 680 | */ | 694 | */ |
| @@ -1226,7 +1240,7 @@ struct ext4_super_block { | |||
| 1226 | __le32 s_feature_ro_compat; /* readonly-compatible feature set */ | 1240 | __le32 s_feature_ro_compat; /* readonly-compatible feature set */ |
| 1227 | /*68*/ __u8 s_uuid[16]; /* 128-bit uuid for volume */ | 1241 | /*68*/ __u8 s_uuid[16]; /* 128-bit uuid for volume */ |
| 1228 | /*78*/ char s_volume_name[16]; /* volume name */ | 1242 | /*78*/ char s_volume_name[16]; /* volume name */ |
| 1229 | /*88*/ char s_last_mounted[64]; /* directory where last mounted */ | 1243 | /*88*/ char s_last_mounted[64] __nonstring; /* directory where last mounted */ |
| 1230 | /*C8*/ __le32 s_algorithm_usage_bitmap; /* For compression */ | 1244 | /*C8*/ __le32 s_algorithm_usage_bitmap; /* For compression */ |
| 1231 | /* | 1245 | /* |
| 1232 | * Performance hints. Directory preallocation should only | 1246 | * Performance hints. Directory preallocation should only |
| @@ -1277,13 +1291,13 @@ struct ext4_super_block { | |||
| 1277 | __le32 s_first_error_time; /* first time an error happened */ | 1291 | __le32 s_first_error_time; /* first time an error happened */ |
| 1278 | __le32 s_first_error_ino; /* inode involved in first error */ | 1292 | __le32 s_first_error_ino; /* inode involved in first error */ |
| 1279 | __le64 s_first_error_block; /* block involved of first error */ | 1293 | __le64 s_first_error_block; /* block involved of first error */ |
| 1280 | __u8 s_first_error_func[32]; /* function where the error happened */ | 1294 | __u8 s_first_error_func[32] __nonstring; /* function where the error happened */ |
| 1281 | __le32 s_first_error_line; /* line number where error happened */ | 1295 | __le32 s_first_error_line; /* line number where error happened */ |
| 1282 | __le32 s_last_error_time; /* most recent time of an error */ | 1296 | __le32 s_last_error_time; /* most recent time of an error */ |
| 1283 | __le32 s_last_error_ino; /* inode involved in last error */ | 1297 | __le32 s_last_error_ino; /* inode involved in last error */ |
| 1284 | __le32 s_last_error_line; /* line number where error happened */ | 1298 | __le32 s_last_error_line; /* line number where error happened */ |
| 1285 | __le64 s_last_error_block; /* block involved of last error */ | 1299 | __le64 s_last_error_block; /* block involved of last error */ |
| 1286 | __u8 s_last_error_func[32]; /* function where the error happened */ | 1300 | __u8 s_last_error_func[32] __nonstring; /* function where the error happened */ |
| 1287 | #define EXT4_S_ERR_END offsetof(struct ext4_super_block, s_mount_opts) | 1301 | #define EXT4_S_ERR_END offsetof(struct ext4_super_block, s_mount_opts) |
| 1288 | __u8 s_mount_opts[64]; | 1302 | __u8 s_mount_opts[64]; |
| 1289 | __le32 s_usr_quota_inum; /* inode for tracking user quota */ | 1303 | __le32 s_usr_quota_inum; /* inode for tracking user quota */ |
diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c index 3543fe80a3c4..7b4736022761 100644 --- a/fs/ext4/inline.c +++ b/fs/ext4/inline.c | |||
| @@ -1753,6 +1753,7 @@ bool empty_inline_dir(struct inode *dir, int *has_inline_data) | |||
| 1753 | { | 1753 | { |
| 1754 | int err, inline_size; | 1754 | int err, inline_size; |
| 1755 | struct ext4_iloc iloc; | 1755 | struct ext4_iloc iloc; |
| 1756 | size_t inline_len; | ||
| 1756 | void *inline_pos; | 1757 | void *inline_pos; |
| 1757 | unsigned int offset; | 1758 | unsigned int offset; |
| 1758 | struct ext4_dir_entry_2 *de; | 1759 | struct ext4_dir_entry_2 *de; |
| @@ -1780,8 +1781,9 @@ bool empty_inline_dir(struct inode *dir, int *has_inline_data) | |||
| 1780 | goto out; | 1781 | goto out; |
| 1781 | } | 1782 | } |
| 1782 | 1783 | ||
| 1784 | inline_len = ext4_get_inline_size(dir); | ||
| 1783 | offset = EXT4_INLINE_DOTDOT_SIZE; | 1785 | offset = EXT4_INLINE_DOTDOT_SIZE; |
| 1784 | while (offset < dir->i_size) { | 1786 | while (offset < inline_len) { |
| 1785 | de = ext4_get_inline_entry(dir, &iloc, offset, | 1787 | de = ext4_get_inline_entry(dir, &iloc, offset, |
| 1786 | &inline_pos, &inline_size); | 1788 | &inline_pos, &inline_size); |
| 1787 | if (ext4_check_dir_entry(dir, NULL, de, | 1789 | if (ext4_check_dir_entry(dir, NULL, de, |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index d0dd585add6a..d767e993591d 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
| @@ -3413,12 +3413,16 @@ static int ext4_iomap_begin(struct inode *inode, loff_t offset, loff_t length, | |||
| 3413 | { | 3413 | { |
| 3414 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); | 3414 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); |
| 3415 | unsigned int blkbits = inode->i_blkbits; | 3415 | unsigned int blkbits = inode->i_blkbits; |
| 3416 | unsigned long first_block = offset >> blkbits; | 3416 | unsigned long first_block, last_block; |
| 3417 | unsigned long last_block = (offset + length - 1) >> blkbits; | ||
| 3418 | struct ext4_map_blocks map; | 3417 | struct ext4_map_blocks map; |
| 3419 | bool delalloc = false; | 3418 | bool delalloc = false; |
| 3420 | int ret; | 3419 | int ret; |
| 3421 | 3420 | ||
| 3421 | if ((offset >> blkbits) > EXT4_MAX_LOGICAL_BLOCK) | ||
| 3422 | return -EINVAL; | ||
| 3423 | first_block = offset >> blkbits; | ||
| 3424 | last_block = min_t(loff_t, (offset + length - 1) >> blkbits, | ||
| 3425 | EXT4_MAX_LOGICAL_BLOCK); | ||
| 3422 | 3426 | ||
| 3423 | if (flags & IOMAP_REPORT) { | 3427 | if (flags & IOMAP_REPORT) { |
| 3424 | if (ext4_has_inline_data(inode)) { | 3428 | if (ext4_has_inline_data(inode)) { |
| @@ -3948,6 +3952,7 @@ static const struct address_space_operations ext4_dax_aops = { | |||
| 3948 | .writepages = ext4_dax_writepages, | 3952 | .writepages = ext4_dax_writepages, |
| 3949 | .direct_IO = noop_direct_IO, | 3953 | .direct_IO = noop_direct_IO, |
| 3950 | .set_page_dirty = noop_set_page_dirty, | 3954 | .set_page_dirty = noop_set_page_dirty, |
| 3955 | .bmap = ext4_bmap, | ||
| 3951 | .invalidatepage = noop_invalidatepage, | 3956 | .invalidatepage = noop_invalidatepage, |
| 3952 | }; | 3957 | }; |
| 3953 | 3958 | ||
| @@ -4192,9 +4197,8 @@ int ext4_update_disksize_before_punch(struct inode *inode, loff_t offset, | |||
| 4192 | return 0; | 4197 | return 0; |
| 4193 | } | 4198 | } |
| 4194 | 4199 | ||
| 4195 | static void ext4_wait_dax_page(struct ext4_inode_info *ei, bool *did_unlock) | 4200 | static void ext4_wait_dax_page(struct ext4_inode_info *ei) |
| 4196 | { | 4201 | { |
| 4197 | *did_unlock = true; | ||
| 4198 | up_write(&ei->i_mmap_sem); | 4202 | up_write(&ei->i_mmap_sem); |
| 4199 | schedule(); | 4203 | schedule(); |
| 4200 | down_write(&ei->i_mmap_sem); | 4204 | down_write(&ei->i_mmap_sem); |
| @@ -4204,14 +4208,12 @@ int ext4_break_layouts(struct inode *inode) | |||
| 4204 | { | 4208 | { |
| 4205 | struct ext4_inode_info *ei = EXT4_I(inode); | 4209 | struct ext4_inode_info *ei = EXT4_I(inode); |
| 4206 | struct page *page; | 4210 | struct page *page; |
| 4207 | bool retry; | ||
| 4208 | int error; | 4211 | int error; |
| 4209 | 4212 | ||
| 4210 | if (WARN_ON_ONCE(!rwsem_is_locked(&ei->i_mmap_sem))) | 4213 | if (WARN_ON_ONCE(!rwsem_is_locked(&ei->i_mmap_sem))) |
| 4211 | return -EINVAL; | 4214 | return -EINVAL; |
| 4212 | 4215 | ||
| 4213 | do { | 4216 | do { |
| 4214 | retry = false; | ||
| 4215 | page = dax_layout_busy_page(inode->i_mapping); | 4217 | page = dax_layout_busy_page(inode->i_mapping); |
| 4216 | if (!page) | 4218 | if (!page) |
| 4217 | return 0; | 4219 | return 0; |
| @@ -4219,8 +4221,8 @@ int ext4_break_layouts(struct inode *inode) | |||
| 4219 | error = ___wait_var_event(&page->_refcount, | 4221 | error = ___wait_var_event(&page->_refcount, |
| 4220 | atomic_read(&page->_refcount) == 1, | 4222 | atomic_read(&page->_refcount) == 1, |
| 4221 | TASK_INTERRUPTIBLE, 0, 0, | 4223 | TASK_INTERRUPTIBLE, 0, 0, |
| 4222 | ext4_wait_dax_page(ei, &retry)); | 4224 | ext4_wait_dax_page(ei)); |
| 4223 | } while (error == 0 && retry); | 4225 | } while (error == 0); |
| 4224 | 4226 | ||
| 4225 | return error; | 4227 | return error; |
| 4226 | } | 4228 | } |
| @@ -4895,6 +4897,7 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) | |||
| 4895 | * not initialized on a new filesystem. */ | 4897 | * not initialized on a new filesystem. */ |
| 4896 | } | 4898 | } |
| 4897 | ei->i_flags = le32_to_cpu(raw_inode->i_flags); | 4899 | ei->i_flags = le32_to_cpu(raw_inode->i_flags); |
| 4900 | ext4_set_inode_flags(inode); | ||
| 4898 | inode->i_blocks = ext4_inode_blocks(raw_inode, ei); | 4901 | inode->i_blocks = ext4_inode_blocks(raw_inode, ei); |
| 4899 | ei->i_file_acl = le32_to_cpu(raw_inode->i_file_acl_lo); | 4902 | ei->i_file_acl = le32_to_cpu(raw_inode->i_file_acl_lo); |
| 4900 | if (ext4_has_feature_64bit(sb)) | 4903 | if (ext4_has_feature_64bit(sb)) |
| @@ -5041,7 +5044,6 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) | |||
| 5041 | goto bad_inode; | 5044 | goto bad_inode; |
| 5042 | } | 5045 | } |
| 5043 | brelse(iloc.bh); | 5046 | brelse(iloc.bh); |
| 5044 | ext4_set_inode_flags(inode); | ||
| 5045 | 5047 | ||
| 5046 | unlock_new_inode(inode); | 5048 | unlock_new_inode(inode); |
| 5047 | return inode; | 5049 | return inode; |
diff --git a/fs/ext4/mmp.c b/fs/ext4/mmp.c index 39b07c2d3384..2305b4374fd3 100644 --- a/fs/ext4/mmp.c +++ b/fs/ext4/mmp.c | |||
| @@ -49,7 +49,6 @@ static int write_mmp_block(struct super_block *sb, struct buffer_head *bh) | |||
| 49 | */ | 49 | */ |
| 50 | sb_start_write(sb); | 50 | sb_start_write(sb); |
| 51 | ext4_mmp_csum_set(sb, mmp); | 51 | ext4_mmp_csum_set(sb, mmp); |
| 52 | mark_buffer_dirty(bh); | ||
| 53 | lock_buffer(bh); | 52 | lock_buffer(bh); |
| 54 | bh->b_end_io = end_buffer_write_sync; | 53 | bh->b_end_io = end_buffer_write_sync; |
| 55 | get_bh(bh); | 54 | get_bh(bh); |
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 116ff68c5bd4..377d516c475f 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c | |||
| @@ -3478,6 +3478,12 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 3478 | int credits; | 3478 | int credits; |
| 3479 | u8 old_file_type; | 3479 | u8 old_file_type; |
| 3480 | 3480 | ||
| 3481 | if (new.inode && new.inode->i_nlink == 0) { | ||
| 3482 | EXT4_ERROR_INODE(new.inode, | ||
| 3483 | "target of rename is already freed"); | ||
| 3484 | return -EFSCORRUPTED; | ||
| 3485 | } | ||
| 3486 | |||
| 3481 | if ((ext4_test_inode_flag(new_dir, EXT4_INODE_PROJINHERIT)) && | 3487 | if ((ext4_test_inode_flag(new_dir, EXT4_INODE_PROJINHERIT)) && |
| 3482 | (!projid_eq(EXT4_I(new_dir)->i_projid, | 3488 | (!projid_eq(EXT4_I(new_dir)->i_projid, |
| 3483 | EXT4_I(old_dentry->d_inode)->i_projid))) | 3489 | EXT4_I(old_dentry->d_inode)->i_projid))) |
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c index e5fb38451a73..ebbc663d0798 100644 --- a/fs/ext4/resize.c +++ b/fs/ext4/resize.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | 19 | ||
| 20 | int ext4_resize_begin(struct super_block *sb) | 20 | int ext4_resize_begin(struct super_block *sb) |
| 21 | { | 21 | { |
| 22 | struct ext4_sb_info *sbi = EXT4_SB(sb); | ||
| 22 | int ret = 0; | 23 | int ret = 0; |
| 23 | 24 | ||
| 24 | if (!capable(CAP_SYS_RESOURCE)) | 25 | if (!capable(CAP_SYS_RESOURCE)) |
| @@ -29,7 +30,7 @@ int ext4_resize_begin(struct super_block *sb) | |||
| 29 | * because the user tools have no way of handling this. Probably a | 30 | * because the user tools have no way of handling this. Probably a |
| 30 | * bad time to do it anyways. | 31 | * bad time to do it anyways. |
| 31 | */ | 32 | */ |
| 32 | if (EXT4_SB(sb)->s_sbh->b_blocknr != | 33 | if (EXT4_B2C(sbi, sbi->s_sbh->b_blocknr) != |
| 33 | le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block)) { | 34 | le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block)) { |
| 34 | ext4_warning(sb, "won't resize using backup superblock at %llu", | 35 | ext4_warning(sb, "won't resize using backup superblock at %llu", |
| 35 | (unsigned long long)EXT4_SB(sb)->s_sbh->b_blocknr); | 36 | (unsigned long long)EXT4_SB(sb)->s_sbh->b_blocknr); |
| @@ -1986,6 +1987,26 @@ retry: | |||
| 1986 | } | 1987 | } |
| 1987 | } | 1988 | } |
| 1988 | 1989 | ||
| 1990 | /* | ||
| 1991 | * Make sure the last group has enough space so that it's | ||
| 1992 | * guaranteed to have enough space for all metadata blocks | ||
| 1993 | * that it might need to hold. (We might not need to store | ||
| 1994 | * the inode table blocks in the last block group, but there | ||
| 1995 | * will be cases where this might be needed.) | ||
| 1996 | */ | ||
| 1997 | if ((ext4_group_first_block_no(sb, n_group) + | ||
| 1998 | ext4_group_overhead_blocks(sb, n_group) + 2 + | ||
| 1999 | sbi->s_itb_per_group + sbi->s_cluster_ratio) >= n_blocks_count) { | ||
| 2000 | n_blocks_count = ext4_group_first_block_no(sb, n_group); | ||
| 2001 | n_group--; | ||
| 2002 | n_blocks_count_retry = 0; | ||
| 2003 | if (resize_inode) { | ||
| 2004 | iput(resize_inode); | ||
| 2005 | resize_inode = NULL; | ||
| 2006 | } | ||
| 2007 | goto retry; | ||
| 2008 | } | ||
| 2009 | |||
| 1989 | /* extend the last group */ | 2010 | /* extend the last group */ |
| 1990 | if (n_group == o_group) | 2011 | if (n_group == o_group) |
| 1991 | add = n_blocks_count - o_blocks_count; | 2012 | add = n_blocks_count - o_blocks_count; |
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 5863fd22e90b..1145109968ef 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
| @@ -2145,6 +2145,8 @@ static int _ext4_show_options(struct seq_file *seq, struct super_block *sb, | |||
| 2145 | SEQ_OPTS_PRINT("max_dir_size_kb=%u", sbi->s_max_dir_size_kb); | 2145 | SEQ_OPTS_PRINT("max_dir_size_kb=%u", sbi->s_max_dir_size_kb); |
| 2146 | if (test_opt(sb, DATA_ERR_ABORT)) | 2146 | if (test_opt(sb, DATA_ERR_ABORT)) |
| 2147 | SEQ_OPTS_PUTS("data_err=abort"); | 2147 | SEQ_OPTS_PUTS("data_err=abort"); |
| 2148 | if (DUMMY_ENCRYPTION_ENABLED(sbi)) | ||
| 2149 | SEQ_OPTS_PUTS("test_dummy_encryption"); | ||
| 2148 | 2150 | ||
| 2149 | ext4_show_quota_options(seq, sb); | 2151 | ext4_show_quota_options(seq, sb); |
| 2150 | return 0; | 2152 | return 0; |
| @@ -4378,11 +4380,13 @@ no_journal: | |||
| 4378 | block = ext4_count_free_clusters(sb); | 4380 | block = ext4_count_free_clusters(sb); |
| 4379 | ext4_free_blocks_count_set(sbi->s_es, | 4381 | ext4_free_blocks_count_set(sbi->s_es, |
| 4380 | EXT4_C2B(sbi, block)); | 4382 | EXT4_C2B(sbi, block)); |
| 4383 | ext4_superblock_csum_set(sb); | ||
| 4381 | err = percpu_counter_init(&sbi->s_freeclusters_counter, block, | 4384 | err = percpu_counter_init(&sbi->s_freeclusters_counter, block, |
| 4382 | GFP_KERNEL); | 4385 | GFP_KERNEL); |
| 4383 | if (!err) { | 4386 | if (!err) { |
| 4384 | unsigned long freei = ext4_count_free_inodes(sb); | 4387 | unsigned long freei = ext4_count_free_inodes(sb); |
| 4385 | sbi->s_es->s_free_inodes_count = cpu_to_le32(freei); | 4388 | sbi->s_es->s_free_inodes_count = cpu_to_le32(freei); |
| 4389 | ext4_superblock_csum_set(sb); | ||
| 4386 | err = percpu_counter_init(&sbi->s_freeinodes_counter, freei, | 4390 | err = percpu_counter_init(&sbi->s_freeinodes_counter, freei, |
| 4387 | GFP_KERNEL); | 4391 | GFP_KERNEL); |
| 4388 | } | 4392 | } |
