@@ -3545,12 +3545,15 @@ static void ext4_clamp_want_extra_isize(struct super_block *sb)
35453545{
35463546 struct ext4_sb_info * sbi = EXT4_SB (sb );
35473547 struct ext4_super_block * es = sbi -> s_es ;
3548+ unsigned def_extra_isize = sizeof (struct ext4_inode ) -
3549+ EXT4_GOOD_OLD_INODE_SIZE ;
35483550
3549- /* determine the minimum size of new large inodes, if present */
3550- if (sbi -> s_inode_size > EXT4_GOOD_OLD_INODE_SIZE &&
3551- sbi -> s_want_extra_isize == 0 ) {
3552- sbi -> s_want_extra_isize = sizeof (struct ext4_inode ) -
3553- EXT4_GOOD_OLD_INODE_SIZE ;
3551+ if (sbi -> s_inode_size == EXT4_GOOD_OLD_INODE_SIZE ) {
3552+ sbi -> s_want_extra_isize = 0 ;
3553+ return ;
3554+ }
3555+ if (sbi -> s_want_extra_isize < 4 ) {
3556+ sbi -> s_want_extra_isize = def_extra_isize ;
35543557 if (ext4_has_feature_extra_isize (sb )) {
35553558 if (sbi -> s_want_extra_isize <
35563559 le16_to_cpu (es -> s_want_extra_isize ))
@@ -3563,10 +3566,10 @@ static void ext4_clamp_want_extra_isize(struct super_block *sb)
35633566 }
35643567 }
35653568 /* Check if enough inode space is available */
3566- if (EXT4_GOOD_OLD_INODE_SIZE + sbi -> s_want_extra_isize >
3567- sbi -> s_inode_size ) {
3568- sbi -> s_want_extra_isize = sizeof ( struct ext4_inode ) -
3569- EXT4_GOOD_OLD_INODE_SIZE ;
3569+ if (( sbi -> s_want_extra_isize > sbi -> s_inode_size ) ||
3570+ ( EXT4_GOOD_OLD_INODE_SIZE + sbi -> s_want_extra_isize >
3571+ sbi -> s_inode_size )) {
3572+ sbi -> s_want_extra_isize = def_extra_isize ;
35703573 ext4_msg (sb , KERN_INFO ,
35713574 "required extra inode space not available" );
35723575 }
0 commit comments