2020-03-28 21:54:52

by Josh Triplett

[permalink] [raw]
Subject: [PATCH] ext4: Fix incorrect group count in ext4_fill_super error message

ext4_fill_super doublechecks the number of groups before mounting; if
that check fails, the resulting error message prints the group count
from the ext4_sb_info sbi, which hasn't been set yet. Print the freshly
computed group count instead (which at that point has just been computed
in "blocks_count").

Signed-off-by: Josh Triplett <[email protected]>
Fixes: 4ec1102813798 ("ext4: Add sanity checks for the superblock before mounting the filesystem")
---
fs/ext4/super.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 0c7c4adb664e..7f5f37653a03 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -4288,7 +4288,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
if (blocks_count > ((uint64_t)1<<32) - EXT4_DESC_PER_BLOCK(sb)) {
ext4_msg(sb, KERN_WARNING, "groups count too large: %u "
"(block count %llu, first data block %u, "
- "blocks per group %lu)", sbi->s_groups_count,
+ "blocks per group %lu)", blocks_count,
ext4_blocks_count(es),
le32_to_cpu(es->s_first_data_block),
EXT4_BLOCKS_PER_GROUP(sb));
--
2.26.0


2020-03-28 22:45:19

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] ext4: Fix incorrect group count in ext4_fill_super error message

Hi Josh,

I love your patch! Perhaps something to improve:

[auto build test WARNING on ext4/dev]
[also build test WARNING on linus/master linux/master v5.6-rc7 next-20200327]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]

url: https://github.com/0day-ci/linux/commits/Josh-Triplett/ext4-Fix-incorrect-group-count-in-ext4_fill_super-error-message/20200329-055606
base: https://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4.git dev
config: sh-rsk7269_defconfig (attached as .config)
compiler: sh4-linux-gcc (GCC) 9.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
GCC_VERSION=9.2.0 make.cross ARCH=sh

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <[email protected]>

All warnings (new ones prefixed by >>):

In file included from fs/ext4/super.c:50:
fs/ext4/super.c: In function 'ext4_fill_super':
>> fs/ext4/super.c:4297:30: warning: format '%u' expects argument of type 'unsigned int', but argument 4 has type '__u64' {aka 'long long unsigned int'} [-Wformat=]
4297 | ext4_msg(sb, KERN_WARNING, "groups count too large: %u "
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4298 | "(block count %llu, first data block %u, "
4299 | "blocks per group %lu)", blocks_count,
| ~~~~~~~~~~~~
| |
| __u64 {aka long long unsigned int}
fs/ext4/ext4.h:2829:24: note: in definition of macro 'ext4_msg'
2829 | __ext4_msg(sb, level, fmt, ##__VA_ARGS__)
| ^~~
fs/ext4/super.c:4297:56: note: format string is defined here
4297 | ext4_msg(sb, KERN_WARNING, "groups count too large: %u "
| ~^
| |
| unsigned int
| %llu

vim +4297 fs/ext4/super.c

c83ad55eaa91c8 Gabriel Krisman Bertazi 2019-04-25 3972
56889787cfa77d Theodore Ts'o 2011-09-03 3973 if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) {
244adf6426ee31 Theodore Ts'o 2020-01-23 3974 printk_once(KERN_WARNING "EXT4-fs: Warning: mounting with data=journal disables delayed allocation, dioread_nolock, and O_DIRECT support!\n");
244adf6426ee31 Theodore Ts'o 2020-01-23 3975 clear_opt(sb, DIOREAD_NOLOCK);
56889787cfa77d Theodore Ts'o 2011-09-03 3976 if (test_opt2(sb, EXPLICIT_DELALLOC)) {
56889787cfa77d Theodore Ts'o 2011-09-03 3977 ext4_msg(sb, KERN_ERR, "can't mount with "
56889787cfa77d Theodore Ts'o 2011-09-03 3978 "both data=journal and delalloc");
56889787cfa77d Theodore Ts'o 2011-09-03 3979 goto failed_mount;
56889787cfa77d Theodore Ts'o 2011-09-03 3980 }
56889787cfa77d Theodore Ts'o 2011-09-03 3981 if (test_opt(sb, DIOREAD_NOLOCK)) {
56889787cfa77d Theodore Ts'o 2011-09-03 3982 ext4_msg(sb, KERN_ERR, "can't mount with "
6ae6514b33f941 Piotr Sarna 2013-08-08 3983 "both data=journal and dioread_nolock");
56889787cfa77d Theodore Ts'o 2011-09-03 3984 goto failed_mount;
56889787cfa77d Theodore Ts'o 2011-09-03 3985 }
923ae0ff925043 Ross Zwisler 2015-02-16 3986 if (test_opt(sb, DAX)) {
923ae0ff925043 Ross Zwisler 2015-02-16 3987 ext4_msg(sb, KERN_ERR, "can't mount with "
923ae0ff925043 Ross Zwisler 2015-02-16 3988 "both data=journal and dax");
923ae0ff925043 Ross Zwisler 2015-02-16 3989 goto failed_mount;
923ae0ff925043 Ross Zwisler 2015-02-16 3990 }
73b92a2a5e97d1 Sergey Karamov 2016-12-10 3991 if (ext4_has_feature_encrypt(sb)) {
73b92a2a5e97d1 Sergey Karamov 2016-12-10 3992 ext4_msg(sb, KERN_WARNING,
73b92a2a5e97d1 Sergey Karamov 2016-12-10 3993 "encrypted files will use data=ordered "
73b92a2a5e97d1 Sergey Karamov 2016-12-10 3994 "instead of data journaling mode");
73b92a2a5e97d1 Sergey Karamov 2016-12-10 3995 }
56889787cfa77d Theodore Ts'o 2011-09-03 3996 if (test_opt(sb, DELALLOC))
56889787cfa77d Theodore Ts'o 2011-09-03 3997 clear_opt(sb, DELALLOC);
001e4a8775f6e8 Tejun Heo 2015-07-21 3998 } else {
001e4a8775f6e8 Tejun Heo 2015-07-21 3999 sb->s_iflags |= SB_I_CGROUPWB;
56889787cfa77d Theodore Ts'o 2011-09-03 4000 }
56889787cfa77d Theodore Ts'o 2011-09-03 4001
1751e8a6cb935e Linus Torvalds 2017-11-27 4002 sb->s_flags = (sb->s_flags & ~SB_POSIXACL) |
1751e8a6cb935e Linus Torvalds 2017-11-27 4003 (test_opt(sb, POSIX_ACL) ? SB_POSIXACL : 0);
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4004
617ba13b31fbf5 Mingming Cao 2006-10-11 4005 if (le32_to_cpu(es->s_rev_level) == EXT4_GOOD_OLD_REV &&
e2b911c53584a9 Darrick J. Wong 2015-10-17 4006 (ext4_has_compat_features(sb) ||
e2b911c53584a9 Darrick J. Wong 2015-10-17 4007 ext4_has_ro_compat_features(sb) ||
e2b911c53584a9 Darrick J. Wong 2015-10-17 4008 ext4_has_incompat_features(sb)))
b31e15527a9bb7 Eric Sandeen 2009-06-04 4009 ext4_msg(sb, KERN_WARNING,
b31e15527a9bb7 Eric Sandeen 2009-06-04 4010 "feature flags set on rev 0 fs, "
b31e15527a9bb7 Eric Sandeen 2009-06-04 4011 "running e2fsck is recommended");
469108ff3dcbc0 Theodore Tso 2008-02-10 4012
ed3654eb981fd4 Theodore Ts'o 2014-03-24 4013 if (es->s_creator_os == cpu_to_le32(EXT4_OS_HURD)) {
ed3654eb981fd4 Theodore Ts'o 2014-03-24 4014 set_opt2(sb, HURD_COMPAT);
e2b911c53584a9 Darrick J. Wong 2015-10-17 4015 if (ext4_has_feature_64bit(sb)) {
ed3654eb981fd4 Theodore Ts'o 2014-03-24 4016 ext4_msg(sb, KERN_ERR,
ed3654eb981fd4 Theodore Ts'o 2014-03-24 4017 "The Hurd can't support 64-bit file systems");
ed3654eb981fd4 Theodore Ts'o 2014-03-24 4018 goto failed_mount;
ed3654eb981fd4 Theodore Ts'o 2014-03-24 4019 }
dec214d00e0d78 Tahsin Erdogan 2017-06-22 4020
dec214d00e0d78 Tahsin Erdogan 2017-06-22 4021 /*
dec214d00e0d78 Tahsin Erdogan 2017-06-22 4022 * ea_inode feature uses l_i_version field which is not
dec214d00e0d78 Tahsin Erdogan 2017-06-22 4023 * available in HURD_COMPAT mode.
dec214d00e0d78 Tahsin Erdogan 2017-06-22 4024 */
dec214d00e0d78 Tahsin Erdogan 2017-06-22 4025 if (ext4_has_feature_ea_inode(sb)) {
dec214d00e0d78 Tahsin Erdogan 2017-06-22 4026 ext4_msg(sb, KERN_ERR,
dec214d00e0d78 Tahsin Erdogan 2017-06-22 4027 "ea_inode feature is not supported for Hurd");
dec214d00e0d78 Tahsin Erdogan 2017-06-22 4028 goto failed_mount;
dec214d00e0d78 Tahsin Erdogan 2017-06-22 4029 }
ed3654eb981fd4 Theodore Ts'o 2014-03-24 4030 }
ed3654eb981fd4 Theodore Ts'o 2014-03-24 4031
2035e776050aea Theodore Ts'o 2011-04-18 4032 if (IS_EXT2_SB(sb)) {
2035e776050aea Theodore Ts'o 2011-04-18 4033 if (ext2_feature_set_ok(sb))
2035e776050aea Theodore Ts'o 2011-04-18 4034 ext4_msg(sb, KERN_INFO, "mounting ext2 file system "
2035e776050aea Theodore Ts'o 2011-04-18 4035 "using the ext4 subsystem");
2035e776050aea Theodore Ts'o 2011-04-18 4036 else {
0d9366d67bcf06 Eric Sandeen 2018-03-22 4037 /*
0d9366d67bcf06 Eric Sandeen 2018-03-22 4038 * If we're probing be silent, if this looks like
0d9366d67bcf06 Eric Sandeen 2018-03-22 4039 * it's actually an ext[34] filesystem.
0d9366d67bcf06 Eric Sandeen 2018-03-22 4040 */
0d9366d67bcf06 Eric Sandeen 2018-03-22 4041 if (silent && ext4_feature_set_ok(sb, sb_rdonly(sb)))
0d9366d67bcf06 Eric Sandeen 2018-03-22 4042 goto failed_mount;
2035e776050aea Theodore Ts'o 2011-04-18 4043 ext4_msg(sb, KERN_ERR, "couldn't mount as ext2 due "
2035e776050aea Theodore Ts'o 2011-04-18 4044 "to feature incompatibilities");
2035e776050aea Theodore Ts'o 2011-04-18 4045 goto failed_mount;
2035e776050aea Theodore Ts'o 2011-04-18 4046 }
2035e776050aea Theodore Ts'o 2011-04-18 4047 }
2035e776050aea Theodore Ts'o 2011-04-18 4048
2035e776050aea Theodore Ts'o 2011-04-18 4049 if (IS_EXT3_SB(sb)) {
2035e776050aea Theodore Ts'o 2011-04-18 4050 if (ext3_feature_set_ok(sb))
2035e776050aea Theodore Ts'o 2011-04-18 4051 ext4_msg(sb, KERN_INFO, "mounting ext3 file system "
2035e776050aea Theodore Ts'o 2011-04-18 4052 "using the ext4 subsystem");
2035e776050aea Theodore Ts'o 2011-04-18 4053 else {
0d9366d67bcf06 Eric Sandeen 2018-03-22 4054 /*
0d9366d67bcf06 Eric Sandeen 2018-03-22 4055 * If we're probing be silent, if this looks like
0d9366d67bcf06 Eric Sandeen 2018-03-22 4056 * it's actually an ext4 filesystem.
0d9366d67bcf06 Eric Sandeen 2018-03-22 4057 */
0d9366d67bcf06 Eric Sandeen 2018-03-22 4058 if (silent && ext4_feature_set_ok(sb, sb_rdonly(sb)))
0d9366d67bcf06 Eric Sandeen 2018-03-22 4059 goto failed_mount;
2035e776050aea Theodore Ts'o 2011-04-18 4060 ext4_msg(sb, KERN_ERR, "couldn't mount as ext3 due "
2035e776050aea Theodore Ts'o 2011-04-18 4061 "to feature incompatibilities");
2035e776050aea Theodore Ts'o 2011-04-18 4062 goto failed_mount;
2035e776050aea Theodore Ts'o 2011-04-18 4063 }
2035e776050aea Theodore Ts'o 2011-04-18 4064 }
2035e776050aea Theodore Ts'o 2011-04-18 4065
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4066 /*
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4067 * Check feature flags regardless of the revision level, since we
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4068 * previously didn't change the revision level when setting the flags,
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4069 * so there is a chance incompat flags are set on a rev 0 filesystem.
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4070 */
bc98a42c1f7d0f David Howells 2017-07-17 4071 if (!ext4_feature_set_ok(sb, (sb_rdonly(sb))))
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4072 goto failed_mount;
a13fb1a4533f26 Eric Sandeen 2009-08-18 4073
8cdf3372fe8368 Theodore Ts'o 2016-11-18 4074 if (le32_to_cpu(es->s_log_block_size) >
8cdf3372fe8368 Theodore Ts'o 2016-11-18 4075 (EXT4_MAX_BLOCK_LOG_SIZE - EXT4_MIN_BLOCK_LOG_SIZE)) {
8cdf3372fe8368 Theodore Ts'o 2016-11-18 4076 ext4_msg(sb, KERN_ERR,
8cdf3372fe8368 Theodore Ts'o 2016-11-18 4077 "Invalid log block size: %u",
8cdf3372fe8368 Theodore Ts'o 2016-11-18 4078 le32_to_cpu(es->s_log_block_size));
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4079 goto failed_mount;
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4080 }
bfe0a5f47ada40 Theodore Ts'o 2018-06-17 4081 if (le32_to_cpu(es->s_log_cluster_size) >
bfe0a5f47ada40 Theodore Ts'o 2018-06-17 4082 (EXT4_MAX_CLUSTER_LOG_SIZE - EXT4_MIN_BLOCK_LOG_SIZE)) {
bfe0a5f47ada40 Theodore Ts'o 2018-06-17 4083 ext4_msg(sb, KERN_ERR,
bfe0a5f47ada40 Theodore Ts'o 2018-06-17 4084 "Invalid log cluster size: %u",
bfe0a5f47ada40 Theodore Ts'o 2018-06-17 4085 le32_to_cpu(es->s_log_cluster_size));
bfe0a5f47ada40 Theodore Ts'o 2018-06-17 4086 goto failed_mount;
bfe0a5f47ada40 Theodore Ts'o 2018-06-17 4087 }
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4088
5b9554dc5bf008 Theodore Ts'o 2016-07-05 4089 if (le16_to_cpu(sbi->s_es->s_reserved_gdt_blocks) > (blocksize / 4)) {
5b9554dc5bf008 Theodore Ts'o 2016-07-05 4090 ext4_msg(sb, KERN_ERR,
5b9554dc5bf008 Theodore Ts'o 2016-07-05 4091 "Number of reserved GDT blocks insanely large: %d",
5b9554dc5bf008 Theodore Ts'o 2016-07-05 4092 le16_to_cpu(sbi->s_es->s_reserved_gdt_blocks));
5b9554dc5bf008 Theodore Ts'o 2016-07-05 4093 goto failed_mount;
5b9554dc5bf008 Theodore Ts'o 2016-07-05 4094 }
5b9554dc5bf008 Theodore Ts'o 2016-07-05 4095
923ae0ff925043 Ross Zwisler 2015-02-16 4096 if (sbi->s_mount_opt & EXT4_MOUNT_DAX) {
559db4c6d784ce Ross Zwisler 2017-10-12 4097 if (ext4_has_feature_inline_data(sb)) {
559db4c6d784ce Ross Zwisler 2017-10-12 4098 ext4_msg(sb, KERN_ERR, "Cannot use DAX on a filesystem"
559db4c6d784ce Ross Zwisler 2017-10-12 4099 " that may contain inline data");
361d24d40657d2 Eric Sandeen 2018-12-04 4100 goto failed_mount;
559db4c6d784ce Ross Zwisler 2017-10-12 4101 }
80660f20252d6f Dave Jiang 2018-05-30 4102 if (!bdev_dax_supported(sb->s_bdev, blocksize)) {
24f3478d664b1e Dan Williams 2017-12-21 4103 ext4_msg(sb, KERN_ERR,
361d24d40657d2 Eric Sandeen 2018-12-04 4104 "DAX unsupported by block device.");
361d24d40657d2 Eric Sandeen 2018-12-04 4105 goto failed_mount;
24f3478d664b1e Dan Williams 2017-12-21 4106 }
923ae0ff925043 Ross Zwisler 2015-02-16 4107 }
923ae0ff925043 Ross Zwisler 2015-02-16 4108
e2b911c53584a9 Darrick J. Wong 2015-10-17 4109 if (ext4_has_feature_encrypt(sb) && es->s_encryption_level) {
6ddb2447846a8e Theodore Ts'o 2015-04-16 4110 ext4_msg(sb, KERN_ERR, "Unsupported encryption level %d",
6ddb2447846a8e Theodore Ts'o 2015-04-16 4111 es->s_encryption_level);
6ddb2447846a8e Theodore Ts'o 2015-04-16 4112 goto failed_mount;
6ddb2447846a8e Theodore Ts'o 2015-04-16 4113 }
6ddb2447846a8e Theodore Ts'o 2015-04-16 4114
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4115 if (sb->s_blocksize != blocksize) {
ce40733ce93de4 Aneesh Kumar K.V 2008-01-28 4116 /* Validate the filesystem blocksize */
ce40733ce93de4 Aneesh Kumar K.V 2008-01-28 4117 if (!sb_set_blocksize(sb, blocksize)) {
b31e15527a9bb7 Eric Sandeen 2009-06-04 4118 ext4_msg(sb, KERN_ERR, "bad block size %d",
ce40733ce93de4 Aneesh Kumar K.V 2008-01-28 4119 blocksize);
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4120 goto failed_mount;
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4121 }
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4122
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4123 brelse(bh);
70bbb3e0a07c1f Andrew Morton 2006-10-11 4124 logical_sb_block = sb_block * EXT4_MIN_BLOCK_SIZE;
70bbb3e0a07c1f Andrew Morton 2006-10-11 4125 offset = do_div(logical_sb_block, blocksize);
a8ac900b816370 Gioh Kim 2014-09-04 4126 bh = sb_bread_unmovable(sb, logical_sb_block);
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4127 if (!bh) {
b31e15527a9bb7 Eric Sandeen 2009-06-04 4128 ext4_msg(sb, KERN_ERR,
b31e15527a9bb7 Eric Sandeen 2009-06-04 4129 "Can't read superblock on 2nd try");
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4130 goto failed_mount;
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4131 }
2716b80284c5ca Theodore Ts'o 2012-05-28 4132 es = (struct ext4_super_block *)(bh->b_data + offset);
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4133 sbi->s_es = es;
617ba13b31fbf5 Mingming Cao 2006-10-11 4134 if (es->s_magic != cpu_to_le16(EXT4_SUPER_MAGIC)) {
b31e15527a9bb7 Eric Sandeen 2009-06-04 4135 ext4_msg(sb, KERN_ERR,
b31e15527a9bb7 Eric Sandeen 2009-06-04 4136 "Magic mismatch, very weird!");
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4137 goto failed_mount;
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4138 }
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4139 }
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4140
e2b911c53584a9 Darrick J. Wong 2015-10-17 4141 has_huge_files = ext4_has_feature_huge_file(sb);
f287a1a56130be Theodore Ts'o 2008-10-16 4142 sbi->s_bitmap_maxbytes = ext4_max_bitmap_size(sb->s_blocksize_bits,
f287a1a56130be Theodore Ts'o 2008-10-16 4143 has_huge_files);
f287a1a56130be Theodore Ts'o 2008-10-16 4144 sb->s_maxbytes = ext4_max_size(sb->s_blocksize_bits, has_huge_files);
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4145
0d1ee42f27d30e Alexandre Ratchov 2006-10-11 4146 sbi->s_desc_size = le16_to_cpu(es->s_desc_size);
e2b911c53584a9 Darrick J. Wong 2015-10-17 4147 if (ext4_has_feature_64bit(sb)) {
8fadc14323684c Alexandre Ratchov 2006-10-11 4148 if (sbi->s_desc_size < EXT4_MIN_DESC_SIZE_64BIT ||
0d1ee42f27d30e Alexandre Ratchov 2006-10-11 4149 sbi->s_desc_size > EXT4_MAX_DESC_SIZE ||
d8ea6cf8999100 vignesh babu 2007-10-16 4150 !is_power_of_2(sbi->s_desc_size)) {
b31e15527a9bb7 Eric Sandeen 2009-06-04 4151 ext4_msg(sb, KERN_ERR,
b31e15527a9bb7 Eric Sandeen 2009-06-04 4152 "unsupported descriptor size %lu",
0d1ee42f27d30e Alexandre Ratchov 2006-10-11 4153 sbi->s_desc_size);
0d1ee42f27d30e Alexandre Ratchov 2006-10-11 4154 goto failed_mount;
0d1ee42f27d30e Alexandre Ratchov 2006-10-11 4155 }
0d1ee42f27d30e Alexandre Ratchov 2006-10-11 4156 } else
0d1ee42f27d30e Alexandre Ratchov 2006-10-11 4157 sbi->s_desc_size = EXT4_MIN_DESC_SIZE;
0b8e58a140cae2 Andreas Dilger 2009-06-03 4158
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4159 sbi->s_blocks_per_group = le32_to_cpu(es->s_blocks_per_group);
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4160 sbi->s_inodes_per_group = le32_to_cpu(es->s_inodes_per_group);
0b8e58a140cae2 Andreas Dilger 2009-06-03 4161
617ba13b31fbf5 Mingming Cao 2006-10-11 4162 sbi->s_inodes_per_block = blocksize / EXT4_INODE_SIZE(sb);
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4163 if (sbi->s_inodes_per_block == 0)
617ba13b31fbf5 Mingming Cao 2006-10-11 4164 goto cantfind_ext4;
cd6bb35bf7f6d7 Theodore Ts'o 2016-11-18 4165 if (sbi->s_inodes_per_group < sbi->s_inodes_per_block ||
cd6bb35bf7f6d7 Theodore Ts'o 2016-11-18 4166 sbi->s_inodes_per_group > blocksize * 8) {
cd6bb35bf7f6d7 Theodore Ts'o 2016-11-18 4167 ext4_msg(sb, KERN_ERR, "invalid inodes per group: %lu\n",
cd6bb35bf7f6d7 Theodore Ts'o 2016-11-18 4168 sbi->s_blocks_per_group);
cd6bb35bf7f6d7 Theodore Ts'o 2016-11-18 4169 goto failed_mount;
cd6bb35bf7f6d7 Theodore Ts'o 2016-11-18 4170 }
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4171 sbi->s_itb_per_group = sbi->s_inodes_per_group /
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4172 sbi->s_inodes_per_block;
0d1ee42f27d30e Alexandre Ratchov 2006-10-11 4173 sbi->s_desc_per_block = blocksize / EXT4_DESC_SIZE(sb);
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4174 sbi->s_sbh = bh;
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4175 sbi->s_mount_state = le16_to_cpu(es->s_state);
e57aa839cea138 Fengguang Wu 2007-10-16 4176 sbi->s_addr_per_block_bits = ilog2(EXT4_ADDR_PER_BLOCK(sb));
e57aa839cea138 Fengguang Wu 2007-10-16 4177 sbi->s_desc_per_block_bits = ilog2(EXT4_DESC_PER_BLOCK(sb));
0b8e58a140cae2 Andreas Dilger 2009-06-03 4178
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4179 for (i = 0; i < 4; i++)
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4180 sbi->s_hash_seed[i] = le32_to_cpu(es->s_hash_seed[i]);
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4181 sbi->s_def_hash_version = es->s_def_hash_version;
e2b911c53584a9 Darrick J. Wong 2015-10-17 4182 if (ext4_has_feature_dir_index(sb)) {
f99b25897a86fc Theodore Ts'o 2008-10-28 4183 i = le32_to_cpu(es->s_flags);
f99b25897a86fc Theodore Ts'o 2008-10-28 4184 if (i & EXT2_FLAGS_UNSIGNED_HASH)
f99b25897a86fc Theodore Ts'o 2008-10-28 4185 sbi->s_hash_unsigned = 3;
f99b25897a86fc Theodore Ts'o 2008-10-28 4186 else if ((i & EXT2_FLAGS_SIGNED_HASH) == 0) {
f99b25897a86fc Theodore Ts'o 2008-10-28 4187 #ifdef __CHAR_UNSIGNED__
bc98a42c1f7d0f David Howells 2017-07-17 4188 if (!sb_rdonly(sb))
23301410972330 Theodore Ts'o 2014-02-12 4189 es->s_flags |=
23301410972330 Theodore Ts'o 2014-02-12 4190 cpu_to_le32(EXT2_FLAGS_UNSIGNED_HASH);
f99b25897a86fc Theodore Ts'o 2008-10-28 4191 sbi->s_hash_unsigned = 3;
f99b25897a86fc Theodore Ts'o 2008-10-28 4192 #else
bc98a42c1f7d0f David Howells 2017-07-17 4193 if (!sb_rdonly(sb))
23301410972330 Theodore Ts'o 2014-02-12 4194 es->s_flags |=
23301410972330 Theodore Ts'o 2014-02-12 4195 cpu_to_le32(EXT2_FLAGS_SIGNED_HASH);
f99b25897a86fc Theodore Ts'o 2008-10-28 4196 #endif
f99b25897a86fc Theodore Ts'o 2008-10-28 4197 }
23301410972330 Theodore Ts'o 2014-02-12 4198 }
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4199
281b59959707df Theodore Ts'o 2011-09-09 4200 /* Handle clustersize */
281b59959707df Theodore Ts'o 2011-09-09 4201 clustersize = BLOCK_SIZE << le32_to_cpu(es->s_log_cluster_size);
e2b911c53584a9 Darrick J. Wong 2015-10-17 4202 has_bigalloc = ext4_has_feature_bigalloc(sb);
281b59959707df Theodore Ts'o 2011-09-09 4203 if (has_bigalloc) {
281b59959707df Theodore Ts'o 2011-09-09 4204 if (clustersize < blocksize) {
281b59959707df Theodore Ts'o 2011-09-09 4205 ext4_msg(sb, KERN_ERR,
281b59959707df Theodore Ts'o 2011-09-09 4206 "cluster size (%d) smaller than "
281b59959707df Theodore Ts'o 2011-09-09 4207 "block size (%d)", clustersize, blocksize);
281b59959707df Theodore Ts'o 2011-09-09 4208 goto failed_mount;
281b59959707df Theodore Ts'o 2011-09-09 4209 }
281b59959707df Theodore Ts'o 2011-09-09 4210 sbi->s_cluster_bits = le32_to_cpu(es->s_log_cluster_size) -
281b59959707df Theodore Ts'o 2011-09-09 4211 le32_to_cpu(es->s_log_block_size);
281b59959707df Theodore Ts'o 2011-09-09 4212 sbi->s_clusters_per_group =
281b59959707df Theodore Ts'o 2011-09-09 4213 le32_to_cpu(es->s_clusters_per_group);
281b59959707df Theodore Ts'o 2011-09-09 4214 if (sbi->s_clusters_per_group > blocksize * 8) {
281b59959707df Theodore Ts'o 2011-09-09 4215 ext4_msg(sb, KERN_ERR,
281b59959707df Theodore Ts'o 2011-09-09 4216 "#clusters per group too big: %lu",
281b59959707df Theodore Ts'o 2011-09-09 4217 sbi->s_clusters_per_group);
281b59959707df Theodore Ts'o 2011-09-09 4218 goto failed_mount;
281b59959707df Theodore Ts'o 2011-09-09 4219 }
281b59959707df Theodore Ts'o 2011-09-09 4220 if (sbi->s_blocks_per_group !=
281b59959707df Theodore Ts'o 2011-09-09 4221 (sbi->s_clusters_per_group * (clustersize / blocksize))) {
281b59959707df Theodore Ts'o 2011-09-09 4222 ext4_msg(sb, KERN_ERR, "blocks per group (%lu) and "
281b59959707df Theodore Ts'o 2011-09-09 4223 "clusters per group (%lu) inconsistent",
281b59959707df Theodore Ts'o 2011-09-09 4224 sbi->s_blocks_per_group,
281b59959707df Theodore Ts'o 2011-09-09 4225 sbi->s_clusters_per_group);
281b59959707df Theodore Ts'o 2011-09-09 4226 goto failed_mount;
281b59959707df Theodore Ts'o 2011-09-09 4227 }
281b59959707df Theodore Ts'o 2011-09-09 4228 } else {
281b59959707df Theodore Ts'o 2011-09-09 4229 if (clustersize != blocksize) {
bfe0a5f47ada40 Theodore Ts'o 2018-06-17 4230 ext4_msg(sb, KERN_ERR,
bfe0a5f47ada40 Theodore Ts'o 2018-06-17 4231 "fragment/cluster size (%d) != "
bfe0a5f47ada40 Theodore Ts'o 2018-06-17 4232 "block size (%d)", clustersize, blocksize);
bfe0a5f47ada40 Theodore Ts'o 2018-06-17 4233 goto failed_mount;
281b59959707df Theodore Ts'o 2011-09-09 4234 }
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4235 if (sbi->s_blocks_per_group > blocksize * 8) {
b31e15527a9bb7 Eric Sandeen 2009-06-04 4236 ext4_msg(sb, KERN_ERR,
b31e15527a9bb7 Eric Sandeen 2009-06-04 4237 "#blocks per group too big: %lu",
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4238 sbi->s_blocks_per_group);
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4239 goto failed_mount;
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4240 }
281b59959707df Theodore Ts'o 2011-09-09 4241 sbi->s_clusters_per_group = sbi->s_blocks_per_group;
281b59959707df Theodore Ts'o 2011-09-09 4242 sbi->s_cluster_bits = 0;
281b59959707df Theodore Ts'o 2011-09-09 4243 }
281b59959707df Theodore Ts'o 2011-09-09 4244 sbi->s_cluster_ratio = clustersize / blocksize;
281b59959707df Theodore Ts'o 2011-09-09 4245
960fd856fdc3b0 Theodore Ts'o 2013-07-05 4246 /* Do we have standard group size of clustersize * 8 blocks ? */
960fd856fdc3b0 Theodore Ts'o 2013-07-05 4247 if (sbi->s_blocks_per_group == clustersize << 3)
960fd856fdc3b0 Theodore Ts'o 2013-07-05 4248 set_opt2(sb, STD_GROUP_SIZE);
960fd856fdc3b0 Theodore Ts'o 2013-07-05 4249
bf43d84b185e2f Eric Sandeen 2009-08-17 4250 /*
bf43d84b185e2f Eric Sandeen 2009-08-17 4251 * Test whether we have more sectors than will fit in sector_t,
bf43d84b185e2f Eric Sandeen 2009-08-17 4252 * and whether the max offset is addressable by the page cache.
bf43d84b185e2f Eric Sandeen 2009-08-17 4253 */
5a9ae68a349aa0 Darrick J. Wong 2010-11-19 4254 err = generic_check_addressable(sb->s_blocksize_bits,
30ca22c70e3ef0 Patrick J. LoPresti 2010-07-22 4255 ext4_blocks_count(es));
5a9ae68a349aa0 Darrick J. Wong 2010-11-19 4256 if (err) {
b31e15527a9bb7 Eric Sandeen 2009-06-04 4257 ext4_msg(sb, KERN_ERR, "filesystem"
bf43d84b185e2f Eric Sandeen 2009-08-17 4258 " too large to mount safely on this system");
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4259 goto failed_mount;
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4260 }
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4261
617ba13b31fbf5 Mingming Cao 2006-10-11 4262 if (EXT4_BLOCKS_PER_GROUP(sb) == 0)
617ba13b31fbf5 Mingming Cao 2006-10-11 4263 goto cantfind_ext4;
e7c95593001cb9 Eric Sandeen 2008-01-28 4264
0f2ddca66d70c8 From: Thiemo Nagel 2009-04-07 4265 /* check blocks count against device size */
0f2ddca66d70c8 From: Thiemo Nagel 2009-04-07 4266 blocks_count = sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits;
0f2ddca66d70c8 From: Thiemo Nagel 2009-04-07 4267 if (blocks_count && ext4_blocks_count(es) > blocks_count) {
b31e15527a9bb7 Eric Sandeen 2009-06-04 4268 ext4_msg(sb, KERN_WARNING, "bad geometry: block count %llu "
b31e15527a9bb7 Eric Sandeen 2009-06-04 4269 "exceeds size of device (%llu blocks)",
0f2ddca66d70c8 From: Thiemo Nagel 2009-04-07 4270 ext4_blocks_count(es), blocks_count);
0f2ddca66d70c8 From: Thiemo Nagel 2009-04-07 4271 goto failed_mount;
0f2ddca66d70c8 From: Thiemo Nagel 2009-04-07 4272 }
0f2ddca66d70c8 From: Thiemo Nagel 2009-04-07 4273
4ec11028137982 Theodore Ts'o 2009-01-06 4274 /*
4ec11028137982 Theodore Ts'o 2009-01-06 4275 * It makes no sense for the first data block to be beyond the end
4ec11028137982 Theodore Ts'o 2009-01-06 4276 * of the filesystem.
4ec11028137982 Theodore Ts'o 2009-01-06 4277 */
4ec11028137982 Theodore Ts'o 2009-01-06 4278 if (le32_to_cpu(es->s_first_data_block) >= ext4_blocks_count(es)) {
b31e15527a9bb7 Eric Sandeen 2009-06-04 4279 ext4_msg(sb, KERN_WARNING, "bad geometry: first data "
b31e15527a9bb7 Eric Sandeen 2009-06-04 4280 "block %u is beyond end of filesystem (%llu)",
e7c95593001cb9 Eric Sandeen 2008-01-28 4281 le32_to_cpu(es->s_first_data_block),
4ec11028137982 Theodore Ts'o 2009-01-06 4282 ext4_blocks_count(es));
e7c95593001cb9 Eric Sandeen 2008-01-28 4283 goto failed_mount;
e7c95593001cb9 Eric Sandeen 2008-01-28 4284 }
bfe0a5f47ada40 Theodore Ts'o 2018-06-17 4285 if ((es->s_first_data_block == 0) && (es->s_log_block_size == 0) &&
bfe0a5f47ada40 Theodore Ts'o 2018-06-17 4286 (sbi->s_cluster_ratio == 1)) {
bfe0a5f47ada40 Theodore Ts'o 2018-06-17 4287 ext4_msg(sb, KERN_WARNING, "bad geometry: first data "
bfe0a5f47ada40 Theodore Ts'o 2018-06-17 4288 "block is 0 with a 1k block and cluster size");
bfe0a5f47ada40 Theodore Ts'o 2018-06-17 4289 goto failed_mount;
bfe0a5f47ada40 Theodore Ts'o 2018-06-17 4290 }
bfe0a5f47ada40 Theodore Ts'o 2018-06-17 4291
bd81d8eec04309 Laurent Vivier 2006-10-11 4292 blocks_count = (ext4_blocks_count(es) -
bd81d8eec04309 Laurent Vivier 2006-10-11 4293 le32_to_cpu(es->s_first_data_block) +
bd81d8eec04309 Laurent Vivier 2006-10-11 4294 EXT4_BLOCKS_PER_GROUP(sb) - 1);
bd81d8eec04309 Laurent Vivier 2006-10-11 4295 do_div(blocks_count, EXT4_BLOCKS_PER_GROUP(sb));
4ec11028137982 Theodore Ts'o 2009-01-06 4296 if (blocks_count > ((uint64_t)1<<32) - EXT4_DESC_PER_BLOCK(sb)) {
b31e15527a9bb7 Eric Sandeen 2009-06-04 @4297 ext4_msg(sb, KERN_WARNING, "groups count too large: %u "
4ec11028137982 Theodore Ts'o 2009-01-06 4298 "(block count %llu, first data block %u, "
871ff0cd66878b Josh Triplett 2020-03-28 4299 "blocks per group %lu)", blocks_count,
4ec11028137982 Theodore Ts'o 2009-01-06 4300 ext4_blocks_count(es),
4ec11028137982 Theodore Ts'o 2009-01-06 4301 le32_to_cpu(es->s_first_data_block),
4ec11028137982 Theodore Ts'o 2009-01-06 4302 EXT4_BLOCKS_PER_GROUP(sb));
4ec11028137982 Theodore Ts'o 2009-01-06 4303 goto failed_mount;
4ec11028137982 Theodore Ts'o 2009-01-06 4304 }
bd81d8eec04309 Laurent Vivier 2006-10-11 4305 sbi->s_groups_count = blocks_count;
fb0a387dcdcd21 Eric Sandeen 2009-09-16 4306 sbi->s_blockfile_groups = min_t(ext4_group_t, sbi->s_groups_count,
fb0a387dcdcd21 Eric Sandeen 2009-09-16 4307 (EXT4_MAX_BLOCK_FILE_PHYS / EXT4_BLOCKS_PER_GROUP(sb)));
9e463084cdb22e Theodore Ts'o 2018-11-07 4308 if (((u64)sbi->s_groups_count * sbi->s_inodes_per_group) !=
9e463084cdb22e Theodore Ts'o 2018-11-07 4309 le32_to_cpu(es->s_inodes_count)) {
9e463084cdb22e Theodore Ts'o 2018-11-07 4310 ext4_msg(sb, KERN_ERR, "inodes count not valid: %u vs %llu",
9e463084cdb22e Theodore Ts'o 2018-11-07 4311 le32_to_cpu(es->s_inodes_count),
9e463084cdb22e Theodore Ts'o 2018-11-07 4312 ((u64)sbi->s_groups_count * sbi->s_inodes_per_group));
9e463084cdb22e Theodore Ts'o 2018-11-07 4313 ret = -EINVAL;
9e463084cdb22e Theodore Ts'o 2018-11-07 4314 goto failed_mount;
9e463084cdb22e Theodore Ts'o 2018-11-07 4315 }
617ba13b31fbf5 Mingming Cao 2006-10-11 4316 db_count = (sbi->s_groups_count + EXT4_DESC_PER_BLOCK(sb) - 1) /
617ba13b31fbf5 Mingming Cao 2006-10-11 4317 EXT4_DESC_PER_BLOCK(sb);
3a4b77cd47bb83 Eryu Guan 2016-12-01 4318 if (ext4_has_feature_meta_bg(sb)) {
2ba3e6e8afc9b6 Theodore Ts'o 2017-02-15 4319 if (le32_to_cpu(es->s_first_meta_bg) > db_count) {
3a4b77cd47bb83 Eryu Guan 2016-12-01 4320 ext4_msg(sb, KERN_WARNING,
3a4b77cd47bb83 Eryu Guan 2016-12-01 4321 "first meta block group too large: %u "
3a4b77cd47bb83 Eryu Guan 2016-12-01 4322 "(group descriptor block count %u)",
3a4b77cd47bb83 Eryu Guan 2016-12-01 4323 le32_to_cpu(es->s_first_meta_bg), db_count);
3a4b77cd47bb83 Eryu Guan 2016-12-01 4324 goto failed_mount;
3a4b77cd47bb83 Eryu Guan 2016-12-01 4325 }
3a4b77cd47bb83 Eryu Guan 2016-12-01 4326 }
1d0c3924a92e69 Theodore Ts'o 2020-02-15 4327 rcu_assign_pointer(sbi->s_group_desc,
1d0c3924a92e69 Theodore Ts'o 2020-02-15 4328 kvmalloc_array(db_count,
f18a5f21c25707 Theodore Ts'o 2011-08-01 4329 sizeof(struct buffer_head *),
1d0c3924a92e69 Theodore Ts'o 2020-02-15 4330 GFP_KERNEL));
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4331 if (sbi->s_group_desc == NULL) {
b31e15527a9bb7 Eric Sandeen 2009-06-04 4332 ext4_msg(sb, KERN_ERR, "not enough memory");
2cde417de013b2 Theodore Ts'o 2012-05-28 4333 ret = -ENOMEM;
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4334 goto failed_mount;
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4335 }
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4336
705895b61133ef Pekka Enberg 2009-02-15 4337 bgl_lock_init(sbi->s_blockgroup_lock);
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4338
85c8f176a6111e Andrew Perepechko 2017-04-30 4339 /* Pre-read the descriptors into the buffer cache */
85c8f176a6111e Andrew Perepechko 2017-04-30 4340 for (i = 0; i < db_count; i++) {
85c8f176a6111e Andrew Perepechko 2017-04-30 4341 block = descriptor_loc(sb, logical_sb_block, i);
85c8f176a6111e Andrew Perepechko 2017-04-30 4342 sb_breadahead(sb, block);
85c8f176a6111e Andrew Perepechko 2017-04-30 4343 }
85c8f176a6111e Andrew Perepechko 2017-04-30 4344
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4345 for (i = 0; i < db_count; i++) {
1d0c3924a92e69 Theodore Ts'o 2020-02-15 4346 struct buffer_head *bh;
1d0c3924a92e69 Theodore Ts'o 2020-02-15 4347
70bbb3e0a07c1f Andrew Morton 2006-10-11 4348 block = descriptor_loc(sb, logical_sb_block, i);
1d0c3924a92e69 Theodore Ts'o 2020-02-15 4349 bh = sb_bread_unmovable(sb, block);
1d0c3924a92e69 Theodore Ts'o 2020-02-15 4350 if (!bh) {
b31e15527a9bb7 Eric Sandeen 2009-06-04 4351 ext4_msg(sb, KERN_ERR,
b31e15527a9bb7 Eric Sandeen 2009-06-04 4352 "can't read group descriptor %d", i);
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4353 db_count = i;
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4354 goto failed_mount2;
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4355 }
1d0c3924a92e69 Theodore Ts'o 2020-02-15 4356 rcu_read_lock();
1d0c3924a92e69 Theodore Ts'o 2020-02-15 4357 rcu_dereference(sbi->s_group_desc)[i] = bh;
1d0c3924a92e69 Theodore Ts'o 2020-02-15 4358 rcu_read_unlock();
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4359 }
44de022c438254 Theodore Ts'o 2018-07-08 4360 sbi->s_gdb_count = db_count;
829fa70dddadf9 Theodore Ts'o 2016-08-01 4361 if (!ext4_check_descriptors(sb, logical_sb_block, &first_not_zeroed)) {
b31e15527a9bb7 Eric Sandeen 2009-06-04 4362 ext4_msg(sb, KERN_ERR, "group descriptors corrupted!");
6a797d27378389 Darrick J. Wong 2015-10-17 4363 ret = -EFSCORRUPTED;
f9ae9cf5d72b39 Theodore Ts'o 2014-07-11 4364 goto failed_mount2;
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4365 }
772cb7c83ba256 Jose R. Santos 2008-07-11 4366
235699a8f457ed Kees Cook 2017-10-18 4367 timer_setup(&sbi->s_err_report, print_daily_error_info, 0);
0449641130f565 Tao Ma 2011-04-05 4368
a75ae78f087f93 Dmitry Monakhov 2013-04-03 4369 /* Register extent status tree shrinker */
eb68d0e2fc5a4e Zheng Liu 2014-09-01 4370 if (ext4_es_register_shrinker(sbi))
ce7e010aef63dc Theodore Ts'o 2010-11-03 4371 goto failed_mount3;
ce7e010aef63dc Theodore Ts'o 2010-11-03 4372
c9de560ded61fa Alex Tomas 2008-01-29 4373 sbi->s_stripe = ext4_get_stripe_size(sbi);
67a5da564f97f3 Zheng Liu 2012-08-17 4374 sbi->s_extent_max_zeroout_kb = 32;
c9de560ded61fa Alex Tomas 2008-01-29 4375
f9ae9cf5d72b39 Theodore Ts'o 2014-07-11 4376 /*
f9ae9cf5d72b39 Theodore Ts'o 2014-07-11 4377 * set up enough so that it can read an inode
f9ae9cf5d72b39 Theodore Ts'o 2014-07-11 4378 */
f9ae9cf5d72b39 Theodore Ts'o 2014-07-11 4379 sb->s_op = &ext4_sops;
617ba13b31fbf5 Mingming Cao 2006-10-11 4380 sb->s_export_op = &ext4_export_ops;
617ba13b31fbf5 Mingming Cao 2006-10-11 4381 sb->s_xattr = ext4_xattr_handlers;
643fa9612bf1a2 Chandan Rajendra 2018-12-12 4382 #ifdef CONFIG_FS_ENCRYPTION
a7550b30ab709f Jaegeuk Kim 2016-07-10 4383 sb->s_cop = &ext4_cryptops;
ffcc41829ae043 Eric Biggers 2017-10-09 4384 #endif
c93d8f88580921 Eric Biggers 2019-07-22 4385 #ifdef CONFIG_FS_VERITY
c93d8f88580921 Eric Biggers 2019-07-22 4386 sb->s_vop = &ext4_verityops;
c93d8f88580921 Eric Biggers 2019-07-22 4387 #endif
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4388 #ifdef CONFIG_QUOTA
617ba13b31fbf5 Mingming Cao 2006-10-11 4389 sb->dq_op = &ext4_quota_operations;
e2b911c53584a9 Darrick J. Wong 2015-10-17 4390 if (ext4_has_feature_quota(sb))
1fa5efe3622db5 Jan Kara 2014-10-08 4391 sb->s_qcop = &dquot_quotactl_sysfile_ops;
262b4662f42787 Jan Kara 2013-03-02 4392 else
262b4662f42787 Jan Kara 2013-03-02 4393 sb->s_qcop = &ext4_qctl_operations;
689c958cbe6be4 Li Xi 2016-01-08 4394 sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP | QTYPE_MASK_PRJ;
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4395 #endif
85787090a21eb7 Christoph Hellwig 2017-05-10 4396 memcpy(&sb->s_uuid, es->s_uuid, sizeof(es->s_uuid));
f2fa2ffc2046fd Aneesh Kumar K.V 2011-01-29 4397
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4398 INIT_LIST_HEAD(&sbi->s_orphan); /* unlinked but open files */
3b9d4ed2668077 Theodore Ts'o 2009-04-25 4399 mutex_init(&sbi->s_orphan_lock);
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4400
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4401 sb->s_root = NULL;
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4402
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4403 needs_recovery = (es->s_last_orphan != 0 ||
e2b911c53584a9 Darrick J. Wong 2015-10-17 4404 ext4_has_feature_journal_needs_recovery(sb));
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4405
bc98a42c1f7d0f David Howells 2017-07-17 4406 if (ext4_has_feature_mmp(sb) && !sb_rdonly(sb))
c5e06d101aaf72 Johann Lombardi 2011-05-24 4407 if (ext4_multi_mount_protect(sb, le64_to_cpu(es->s_mmp_block)))
50460fe8c6d1d9 Darrick J. Wong 2014-10-30 4408 goto failed_mount3a;
c5e06d101aaf72 Johann Lombardi 2011-05-24 4409
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4410 /*
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4411 * The first inode we look at is the journal inode. Don't try
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4412 * root first: it may be modified in the journal!
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4413 */
e2b911c53584a9 Darrick J. Wong 2015-10-17 4414 if (!test_opt(sb, NOLOAD) && ext4_has_feature_journal(sb)) {
4753d8a24d4588 Theodore Ts'o 2017-02-05 4415 err = ext4_load_journal(sb, es, journal_devnum);
4753d8a24d4588 Theodore Ts'o 2017-02-05 4416 if (err)
50460fe8c6d1d9 Darrick J. Wong 2014-10-30 4417 goto failed_mount3a;
bc98a42c1f7d0f David Howells 2017-07-17 4418 } else if (test_opt(sb, NOLOAD) && !sb_rdonly(sb) &&
e2b911c53584a9 Darrick J. Wong 2015-10-17 4419 ext4_has_feature_journal_needs_recovery(sb)) {
b31e15527a9bb7 Eric Sandeen 2009-06-04 4420 ext4_msg(sb, KERN_ERR, "required journal recovery "
b31e15527a9bb7 Eric Sandeen 2009-06-04 4421 "suppressed and not mounted read-only");
744692dc059845 Jiaying Zhang 2010-03-04 4422 goto failed_mount_wq;
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4423 } else {
1e381f60dad913 Dmitry Monakhov 2015-10-18 4424 /* Nojournal mode, all journal mount options are illegal */
1e381f60dad913 Dmitry Monakhov 2015-10-18 4425 if (test_opt2(sb, EXPLICIT_JOURNAL_CHECKSUM)) {
1e381f60dad913 Dmitry Monakhov 2015-10-18 4426 ext4_msg(sb, KERN_ERR, "can't mount with "
1e381f60dad913 Dmitry Monakhov 2015-10-18 4427 "journal_checksum, fs mounted w/o journal");
1e381f60dad913 Dmitry Monakhov 2015-10-18 4428 goto failed_mount_wq;
1e381f60dad913 Dmitry Monakhov 2015-10-18 4429 }
1e381f60dad913 Dmitry Monakhov 2015-10-18 4430 if (test_opt(sb, JOURNAL_ASYNC_COMMIT)) {
1e381f60dad913 Dmitry Monakhov 2015-10-18 4431 ext4_msg(sb, KERN_ERR, "can't mount with "
1e381f60dad913 Dmitry Monakhov 2015-10-18 4432 "journal_async_commit, fs mounted w/o journal");
1e381f60dad913 Dmitry Monakhov 2015-10-18 4433 goto failed_mount_wq;
1e381f60dad913 Dmitry Monakhov 2015-10-18 4434 }
1e381f60dad913 Dmitry Monakhov 2015-10-18 4435 if (sbi->s_commit_interval != JBD2_DEFAULT_MAX_COMMIT_AGE*HZ) {
1e381f60dad913 Dmitry Monakhov 2015-10-18 4436 ext4_msg(sb, KERN_ERR, "can't mount with "
1e381f60dad913 Dmitry Monakhov 2015-10-18 4437 "commit=%lu, fs mounted w/o journal",
1e381f60dad913 Dmitry Monakhov 2015-10-18 4438 sbi->s_commit_interval / HZ);
1e381f60dad913 Dmitry Monakhov 2015-10-18 4439 goto failed_mount_wq;
1e381f60dad913 Dmitry Monakhov 2015-10-18 4440 }
1e381f60dad913 Dmitry Monakhov 2015-10-18 4441 if (EXT4_MOUNT_DATA_FLAGS &
1e381f60dad913 Dmitry Monakhov 2015-10-18 4442 (sbi->s_mount_opt ^ sbi->s_def_mount_opt)) {
1e381f60dad913 Dmitry Monakhov 2015-10-18 4443 ext4_msg(sb, KERN_ERR, "can't mount with "
1e381f60dad913 Dmitry Monakhov 2015-10-18 4444 "data=, fs mounted w/o journal");
1e381f60dad913 Dmitry Monakhov 2015-10-18 4445 goto failed_mount_wq;
1e381f60dad913 Dmitry Monakhov 2015-10-18 4446 }
50b29d8f033a7c Debabrata Banerjee 2019-04-30 4447 sbi->s_def_mount_opt &= ~EXT4_MOUNT_JOURNAL_CHECKSUM;
1e381f60dad913 Dmitry Monakhov 2015-10-18 4448 clear_opt(sb, JOURNAL_CHECKSUM);
fd8c37eccdda21 Theodore Ts'o 2010-12-15 4449 clear_opt(sb, DATA_FLAGS);
0390131ba84fd3 Frank Mayhar 2009-01-07 4450 sbi->s_journal = NULL;
0390131ba84fd3 Frank Mayhar 2009-01-07 4451 needs_recovery = 0;
0390131ba84fd3 Frank Mayhar 2009-01-07 4452 goto no_journal;
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4453 }
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4454
e2b911c53584a9 Darrick J. Wong 2015-10-17 4455 if (ext4_has_feature_64bit(sb) &&
eb40a09c679d7f Jose R. Santos 2007-07-18 4456 !jbd2_journal_set_features(EXT4_SB(sb)->s_journal, 0, 0,
eb40a09c679d7f Jose R. Santos 2007-07-18 4457 JBD2_FEATURE_INCOMPAT_64BIT)) {
b31e15527a9bb7 Eric Sandeen 2009-06-04 4458 ext4_msg(sb, KERN_ERR, "Failed to set 64-bit journal feature");
744692dc059845 Jiaying Zhang 2010-03-04 4459 goto failed_mount_wq;
eb40a09c679d7f Jose R. Santos 2007-07-18 4460 }
eb40a09c679d7f Jose R. Santos 2007-07-18 4461
25ed6e8a54df90 Darrick J. Wong 2012-05-27 4462 if (!set_journal_csum_feature_set(sb)) {
25ed6e8a54df90 Darrick J. Wong 2012-05-27 4463 ext4_msg(sb, KERN_ERR, "Failed to set journal checksum "
25ed6e8a54df90 Darrick J. Wong 2012-05-27 4464 "feature set");
25ed6e8a54df90 Darrick J. Wong 2012-05-27 4465 goto failed_mount_wq;
d4da6c9ccf648f Linus Torvalds 2009-11-02 4466 }
818d276ceb83aa Girish Shilamkar 2008-01-28 4467
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4468 /* We have now updated the journal if required, so we can
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4469 * validate the data journaling mode. */
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4470 switch (test_opt(sb, DATA_FLAGS)) {
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4471 case 0:
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4472 /* No mode set, assume a default based on the journal
63f5793351d821 Andrew Morton 2006-10-11 4473 * capabilities: ORDERED_DATA if the journal can
63f5793351d821 Andrew Morton 2006-10-11 4474 * cope, else JOURNAL_DATA
63f5793351d821 Andrew Morton 2006-10-11 4475 */
dab291af8d6307 Mingming Cao 2006-10-11 4476 if (jbd2_journal_check_available_features
27f394a7718d00 Tyson Nottingham 2018-03-30 4477 (sbi->s_journal, 0, 0, JBD2_FEATURE_INCOMPAT_REVOKE)) {
fd8c37eccdda21 Theodore Ts'o 2010-12-15 4478 set_opt(sb, ORDERED_DATA);
27f394a7718d00 Tyson Nottingham 2018-03-30 4479 sbi->s_def_mount_opt |= EXT4_MOUNT_ORDERED_DATA;
27f394a7718d00 Tyson Nottingham 2018-03-30 4480 } else {
fd8c37eccdda21 Theodore Ts'o 2010-12-15 4481 set_opt(sb, JOURNAL_DATA);
27f394a7718d00 Tyson Nottingham 2018-03-30 4482 sbi->s_def_mount_opt |= EXT4_MOUNT_JOURNAL_DATA;
27f394a7718d00 Tyson Nottingham 2018-03-30 4483 }
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4484 break;
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4485
617ba13b31fbf5 Mingming Cao 2006-10-11 4486 case EXT4_MOUNT_ORDERED_DATA:
617ba13b31fbf5 Mingming Cao 2006-10-11 4487 case EXT4_MOUNT_WRITEBACK_DATA:
dab291af8d6307 Mingming Cao 2006-10-11 4488 if (!jbd2_journal_check_available_features
dab291af8d6307 Mingming Cao 2006-10-11 4489 (sbi->s_journal, 0, 0, JBD2_FEATURE_INCOMPAT_REVOKE)) {
b31e15527a9bb7 Eric Sandeen 2009-06-04 4490 ext4_msg(sb, KERN_ERR, "Journal does not support "
b31e15527a9bb7 Eric Sandeen 2009-06-04 4491 "requested data journaling mode");
744692dc059845 Jiaying Zhang 2010-03-04 4492 goto failed_mount_wq;
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4493 }
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4494 default:
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4495 break;
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4496 }
ab04df78181b27 Jan Kara 2016-12-03 4497
ab04df78181b27 Jan Kara 2016-12-03 4498 if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA &&
ab04df78181b27 Jan Kara 2016-12-03 4499 test_opt(sb, JOURNAL_ASYNC_COMMIT)) {
ab04df78181b27 Jan Kara 2016-12-03 4500 ext4_msg(sb, KERN_ERR, "can't mount with "
ab04df78181b27 Jan Kara 2016-12-03 4501 "journal_async_commit in data=ordered mode");
ab04df78181b27 Jan Kara 2016-12-03 4502 goto failed_mount_wq;
ab04df78181b27 Jan Kara 2016-12-03 4503 }
ab04df78181b27 Jan Kara 2016-12-03 4504
b3881f74b31b7d Theodore Ts'o 2009-01-05 4505 set_task_ioprio(sbi->s_journal->j_task, journal_ioprio);
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4506
18aadd47f88464 Bobi Jam 2012-02-20 4507 sbi->s_journal->j_commit_callback = ext4_journal_commit_callback;
18aadd47f88464 Bobi Jam 2012-02-20 4508
ce7e010aef63dc Theodore Ts'o 2010-11-03 4509 no_journal:
cdb7ee4c632759 Tahsin Erdogan 2017-06-22 4510 if (!test_opt(sb, NO_MBCACHE)) {
47387409ee2e09 Tahsin Erdogan 2017-06-22 4511 sbi->s_ea_block_cache = ext4_xattr_create_cache();
47387409ee2e09 Tahsin Erdogan 2017-06-22 4512 if (!sbi->s_ea_block_cache) {
cdb7ee4c632759 Tahsin Erdogan 2017-06-22 4513 ext4_msg(sb, KERN_ERR,
cdb7ee4c632759 Tahsin Erdogan 2017-06-22 4514 "Failed to create ea_block_cache");
9c191f701ce9f9 T Makphaibulchoke 2014-03-18 4515 goto failed_mount_wq;
9c191f701ce9f9 T Makphaibulchoke 2014-03-18 4516 }
9c191f701ce9f9 T Makphaibulchoke 2014-03-18 4517
dec214d00e0d78 Tahsin Erdogan 2017-06-22 4518 if (ext4_has_feature_ea_inode(sb)) {
dec214d00e0d78 Tahsin Erdogan 2017-06-22 4519 sbi->s_ea_inode_cache = ext4_xattr_create_cache();
dec214d00e0d78 Tahsin Erdogan 2017-06-22 4520 if (!sbi->s_ea_inode_cache) {
dec214d00e0d78 Tahsin Erdogan 2017-06-22 4521 ext4_msg(sb, KERN_ERR,
dec214d00e0d78 Tahsin Erdogan 2017-06-22 4522 "Failed to create ea_inode_cache");
dec214d00e0d78 Tahsin Erdogan 2017-06-22 4523 goto failed_mount_wq;
dec214d00e0d78 Tahsin Erdogan 2017-06-22 4524 }
dec214d00e0d78 Tahsin Erdogan 2017-06-22 4525 }
cdb7ee4c632759 Tahsin Erdogan 2017-06-22 4526 }
dec214d00e0d78 Tahsin Erdogan 2017-06-22 4527
c93d8f88580921 Eric Biggers 2019-07-22 4528 if (ext4_has_feature_verity(sb) && blocksize != PAGE_SIZE) {
c93d8f88580921 Eric Biggers 2019-07-22 4529 ext4_msg(sb, KERN_ERR, "Unsupported blocksize for fs-verity");
c93d8f88580921 Eric Biggers 2019-07-22 4530 goto failed_mount_wq;
c93d8f88580921 Eric Biggers 2019-07-22 4531 }
c93d8f88580921 Eric Biggers 2019-07-22 4532
bc98a42c1f7d0f David Howells 2017-07-17 4533 if (DUMMY_ENCRYPTION_ENABLED(sbi) && !sb_rdonly(sb) &&
e2b911c53584a9 Darrick J. Wong 2015-10-17 4534 !ext4_has_feature_encrypt(sb)) {
e2b911c53584a9 Darrick J. Wong 2015-10-17 4535 ext4_set_feature_encrypt(sb);
6ddb2447846a8e Theodore Ts'o 2015-04-16 4536 ext4_commit_super(sb, 1);
6ddb2447846a8e Theodore Ts'o 2015-04-16 4537 }
6ddb2447846a8e Theodore Ts'o 2015-04-16 4538
952fc18ef9ec70 Theodore Ts'o 2012-07-09 4539 /*
952fc18ef9ec70 Theodore Ts'o 2012-07-09 4540 * Get the # of file system overhead blocks from the
952fc18ef9ec70 Theodore Ts'o 2012-07-09 4541 * superblock if present.
952fc18ef9ec70 Theodore Ts'o 2012-07-09 4542 */
952fc18ef9ec70 Theodore Ts'o 2012-07-09 4543 if (es->s_overhead_clusters)
952fc18ef9ec70 Theodore Ts'o 2012-07-09 4544 sbi->s_overhead = le32_to_cpu(es->s_overhead_clusters);
952fc18ef9ec70 Theodore Ts'o 2012-07-09 4545 else {
07aa2ea13814ea Lukas Czerner 2012-11-08 4546 err = ext4_calculate_overhead(sb);
07aa2ea13814ea Lukas Czerner 2012-11-08 4547 if (err)
952fc18ef9ec70 Theodore Ts'o 2012-07-09 4548 goto failed_mount_wq;
952fc18ef9ec70 Theodore Ts'o 2012-07-09 4549 }
952fc18ef9ec70 Theodore Ts'o 2012-07-09 4550
fd89d5f2030ac8 Tejun Heo 2011-02-01 4551 /*
fd89d5f2030ac8 Tejun Heo 2011-02-01 4552 * The maximum number of concurrent works can be high and
fd89d5f2030ac8 Tejun Heo 2011-02-01 4553 * concurrency isn't really necessary. Limit it to 1.
fd89d5f2030ac8 Tejun Heo 2011-02-01 4554 */
2e8fa54e3b48e4 Jan Kara 2013-06-04 4555 EXT4_SB(sb)->rsv_conversion_wq =
2e8fa54e3b48e4 Jan Kara 2013-06-04 4556 alloc_workqueue("ext4-rsv-conversion", WQ_MEM_RECLAIM | WQ_UNBOUND, 1);
2e8fa54e3b48e4 Jan Kara 2013-06-04 4557 if (!EXT4_SB(sb)->rsv_conversion_wq) {
2e8fa54e3b48e4 Jan Kara 2013-06-04 4558 printk(KERN_ERR "EXT4-fs: failed to create workqueue\n");
07aa2ea13814ea Lukas Czerner 2012-11-08 4559 ret = -ENOMEM;
2e8fa54e3b48e4 Jan Kara 2013-06-04 4560 goto failed_mount4;
2e8fa54e3b48e4 Jan Kara 2013-06-04 4561 }
2e8fa54e3b48e4 Jan Kara 2013-06-04 4562
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4563 /*
dab291af8d6307 Mingming Cao 2006-10-11 4564 * The jbd2_journal_load will have done any necessary log recovery,
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4565 * so we can safely mount the rest of the filesystem now.
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4566 */
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4567
8a363970d1dc38 Theodore Ts'o 2018-12-19 4568 root = ext4_iget(sb, EXT4_ROOT_INO, EXT4_IGET_SPECIAL);
1d1fe1ee02b9ac David Howells 2008-02-07 4569 if (IS_ERR(root)) {
b31e15527a9bb7 Eric Sandeen 2009-06-04 4570 ext4_msg(sb, KERN_ERR, "get root inode failed");
1d1fe1ee02b9ac David Howells 2008-02-07 4571 ret = PTR_ERR(root);
32a9bb57d7c1fd Manish Katiyar 2011-02-27 4572 root = NULL;
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4573 goto failed_mount4;
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4574 }
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4575 if (!S_ISDIR(root->i_mode) || !root->i_blocks || !root->i_size) {
b31e15527a9bb7 Eric Sandeen 2009-06-04 4576 ext4_msg(sb, KERN_ERR, "corrupt root inode, run e2fsck");
94bf608a18fa44 Al Viro 2012-01-09 4577 iput(root);
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4578 goto failed_mount4;
ac27a0ec112a08 Dave Kleikamp 2006-10-11 4579 }
b886ee3e778ec2 Gabriel Krisman Bertazi 2019-04-25 4580

:::::: The code at line 4297 was first introduced by commit
:::::: b31e15527a9bb71b6a11a425d17ce139a62f5af5 ext4: Change all super.c messages to print the device

:::::: TO: Eric Sandeen <[email protected]>
:::::: CC: Theodore Ts'o <[email protected]>

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]


Attachments:
(No filename) (55.46 kB)
.config.gz (11.46 kB)
Download all attachments

2020-03-28 23:09:21

by Andreas Dilger

[permalink] [raw]
Subject: Re: [PATCH] ext4: Fix incorrect group count in ext4_fill_super error message

On Mar 28, 2020, at 3:54 PM, Josh Triplett <[email protected]> wrote:
>
> ext4_fill_super doublechecks the number of groups before mounting; if
> that check fails, the resulting error message prints the group count
> from the ext4_sb_info sbi, which hasn't been set yet. Print the freshly
> computed group count instead (which at that point has just been computed
> in "blocks_count").
>
> Signed-off-by: Josh Triplett <[email protected]>
> Fixes: 4ec1102813798 ("ext4: Add sanity checks for the superblock before mounting the filesystem")

Modulo the compiler warning pointed out by kbuild test robot, I think the
patch is correct, but was definitely confusing to read within the shown
context, since "blocks_count" definitely doesn't seem to be "groups count"
(it *is* the "groups count", but is just used as a temporary variable).

Reviewed-by: Andreas Dilger <[email protected]>

> ---
> fs/ext4/super.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/fs/ext4/super.c b/fs/ext4/super.c
> index 0c7c4adb664e..7f5f37653a03 100644
> --- a/fs/ext4/super.c
> +++ b/fs/ext4/super.c
> @@ -4288,7 +4288,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
> if (blocks_count > ((uint64_t)1<<32) - EXT4_DESC_PER_BLOCK(sb)) {
> ext4_msg(sb, KERN_WARNING, "groups count too large: %u "
> "(block count %llu, first data block %u, "
> - "blocks per group %lu)", sbi->s_groups_count,
> + "blocks per group %lu)", blocks_count,
> ext4_blocks_count(es),
> le32_to_cpu(es->s_first_data_block),
> EXT4_BLOCKS_PER_GROUP(sb));
> --
> 2.26.0


Cheers, Andreas






Attachments:
signature.asc (890.00 B)
Message signed with OpenPGP

2020-03-28 23:56:44

by Josh Triplett

[permalink] [raw]
Subject: Re: [PATCH] ext4: Fix incorrect group count in ext4_fill_super error message

On Sat, Mar 28, 2020 at 05:07:55PM -0600, Andreas Dilger wrote:
> On Mar 28, 2020, at 3:54 PM, Josh Triplett <[email protected]> wrote:
> >
> > ext4_fill_super doublechecks the number of groups before mounting; if
> > that check fails, the resulting error message prints the group count
> > from the ext4_sb_info sbi, which hasn't been set yet. Print the freshly
> > computed group count instead (which at that point has just been computed
> > in "blocks_count").
> >
> > Signed-off-by: Josh Triplett <[email protected]>
> > Fixes: 4ec1102813798 ("ext4: Add sanity checks for the superblock before mounting the filesystem")
>
> Modulo the compiler warning pointed out by kbuild test robot, I think the
> patch is correct, but was definitely confusing to read within the shown
> context, since "blocks_count" definitely doesn't seem to be "groups count"
> (it *is* the "groups count", but is just used as a temporary variable).

I agree that the code and patch read confusingly due to the (lack of)
context. The commit message attempted to explain that, but clearer code
seems preferable to confusing-but-explained code.

I sent a new version of this patch, which instead just moves the
assignment to sbi's group count earlier, so that the error message can
continue referencing it that way. (That also addresses the warning.)

- Josh Triplett

2020-03-29 02:50:51

by Theodore Ts'o

[permalink] [raw]
Subject: Re: [PATCH] ext4: Fix incorrect group count in ext4_fill_super error message

On Sat, Mar 28, 2020 at 02:54:01PM -0700, Josh Triplett wrote:
> ext4_fill_super doublechecks the number of groups before mounting; if
> that check fails, the resulting error message prints the group count
> from the ext4_sb_info sbi, which hasn't been set yet. Print the freshly
> computed group count instead (which at that point has just been computed
> in "blocks_count").
>
> Signed-off-by: Josh Triplett <[email protected]>
> Fixes: 4ec1102813798 ("ext4: Add sanity checks for the superblock before mounting the filesystem")

Applied, with a fix to the format string:

> fs/ext4/super.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/fs/ext4/super.c b/fs/ext4/super.c
> index 0c7c4adb664e..7f5f37653a03 100644
> --- a/fs/ext4/super.c
> +++ b/fs/ext4/super.c
> @@ -4288,7 +4288,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
> if (blocks_count > ((uint64_t)1<<32) - EXT4_DESC_PER_BLOCK(sb)) {
> ext4_msg(sb, KERN_WARNING, "groups count too large: %u "

s/%u/%llu/

> "(block count %llu, first data block %u, "
> - "blocks per group %lu)", sbi->s_groups_count,
> + "blocks per group %lu)", blocks_count,
> ext4_blocks_count(es),
> le32_to_cpu(es->s_first_data_block),
> EXT4_BLOCKS_PER_GROUP(sb));
> --
> 2.26.0

- Ted

2020-03-29 04:37:33

by Andreas Dilger

[permalink] [raw]
Subject: Re: [PATCH] ext4: Fix incorrect group count in ext4_fill_super error message

You missed the v2 patch, which was better IMHO.

Cheers, Andreas

> On Mar 28, 2020, at 20:47, Theodore Y. Ts'o <[email protected]> wrote:
>
> On Sat, Mar 28, 2020 at 02:54:01PM -0700, Josh Triplett wrote:
>> ext4_fill_super doublechecks the number of groups before mounting; if
>> that check fails, the resulting error message prints the group count
>> from the ext4_sb_info sbi, which hasn't been set yet. Print the freshly
>> computed group count instead (which at that point has just been computed
>> in "blocks_count").
>>
>> Signed-off-by: Josh Triplett <[email protected]>
>> Fixes: 4ec1102813798 ("ext4: Add sanity checks for the superblock before mounting the filesystem")
>
> Applied, with a fix to the format string:
>
>> fs/ext4/super.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/fs/ext4/super.c b/fs/ext4/super.c
>> index 0c7c4adb664e..7f5f37653a03 100644
>> --- a/fs/ext4/super.c
>> +++ b/fs/ext4/super.c
>> @@ -4288,7 +4288,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
>> if (blocks_count > ((uint64_t)1<<32) - EXT4_DESC_PER_BLOCK(sb)) {
>> ext4_msg(sb, KERN_WARNING, "groups count too large: %u "
>
> s/%u/%llu/
>
>> "(block count %llu, first data block %u, "
>> - "blocks per group %lu)", sbi->s_groups_count,
>> + "blocks per group %lu)", blocks_count,
>> ext4_blocks_count(es),
>> le32_to_cpu(es->s_first_data_block),
>> EXT4_BLOCKS_PER_GROUP(sb));
>> --
>> 2.26.0
>
> - Ted

2020-03-29 16:48:46

by Theodore Ts'o

[permalink] [raw]
Subject: Re: [PATCH] ext4: Fix incorrect group count in ext4_fill_super error message

On Sat, Mar 28, 2020 at 10:36:07PM -0600, Andreas Dilger wrote:
> You missed the v2 patch, which was better IMHO.

I saw the V2 patch, but the it will print the 32-bit truncated block
count, and it's possible if things are really insane, the number of
block groups calculated will be > 2**32. In which case the V1 patch
with the format string adjusted will print a less confusing message.
e.g.:

groups count too large: 8589934634 ....

as opposed to:

groups count too large: 42 ....

- Ted