diff options
Diffstat (limited to 'fs/ext4/ialloc.c')
| -rw-r--r-- | fs/ext4/ialloc.c | 12 | 
1 files changed, 8 insertions, 4 deletions
diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index 787ab89c2c26..754f961cd9fd 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c @@ -91,7 +91,7 @@ static int ext4_validate_inode_bitmap(struct super_block *sb,  	if (buffer_verified(bh))  		return 0; -	if (EXT4_MB_GRP_IBITMAP_CORRUPT(grp)) +	if (!grp || EXT4_MB_GRP_IBITMAP_CORRUPT(grp))  		return -EFSCORRUPTED;  	ext4_lock_group(sb, block_group); @@ -293,7 +293,7 @@ void ext4_free_inode(handle_t *handle, struct inode *inode)  	}  	if (!(sbi->s_mount_state & EXT4_FC_REPLAY)) {  		grp = ext4_get_group_info(sb, block_group); -		if (unlikely(EXT4_MB_GRP_IBITMAP_CORRUPT(grp))) { +		if (!grp || unlikely(EXT4_MB_GRP_IBITMAP_CORRUPT(grp))) {  			fatal = -EFSCORRUPTED;  			goto error_return;  		} @@ -1046,7 +1046,7 @@ got_group:  			 * Skip groups with already-known suspicious inode  			 * tables  			 */ -			if (EXT4_MB_GRP_IBITMAP_CORRUPT(grp)) +			if (!grp || EXT4_MB_GRP_IBITMAP_CORRUPT(grp))  				goto next_group;  		} @@ -1183,6 +1183,10 @@ got:  		if (!(sbi->s_mount_state & EXT4_FC_REPLAY)) {  			grp = ext4_get_group_info(sb, group); +			if (!grp) { +				err = -EFSCORRUPTED; +				goto out; +			}  			down_read(&grp->alloc_sem); /*  						     * protect vs itable  						     * lazyinit @@ -1526,7 +1530,7 @@ int ext4_init_inode_table(struct super_block *sb, ext4_group_t group,  	}  	gdp = ext4_get_group_desc(sb, group, &group_desc_bh); -	if (!gdp) +	if (!gdp || !grp)  		goto out;  	/*  | 
