diff options
Diffstat (limited to 'fs/ext4')
| -rw-r--r-- | fs/ext4/ext4_jbd2.c | 11 | ||||
| -rw-r--r-- | fs/ext4/inode.c | 8 | ||||
| -rw-r--r-- | fs/ext4/orphan.c | 4 | 
3 files changed, 19 insertions, 4 deletions
diff --git a/fs/ext4/ext4_jbd2.c b/fs/ext4/ext4_jbd2.c index b3e9b7bd7978..a0e66bc10093 100644 --- a/fs/ext4/ext4_jbd2.c +++ b/fs/ext4/ext4_jbd2.c @@ -280,9 +280,16 @@ int __ext4_forget(const char *where, unsigned int line, handle_t *handle,  		  bh, is_metadata, inode->i_mode,  		  test_opt(inode->i_sb, DATA_FLAGS)); -	/* In the no journal case, we can just do a bforget and return */ +	/* +	 * In the no journal case, we should wait for the ongoing buffer +	 * to complete and do a forget. +	 */  	if (!ext4_handle_valid(handle)) { -		bforget(bh); +		if (bh) { +			clear_buffer_dirty(bh); +			wait_on_buffer(bh); +			__bforget(bh); +		}  		return 0;  	} diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index f9e4ac87211e..e99306a8f47c 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -5319,6 +5319,14 @@ struct inode *__ext4_iget(struct super_block *sb, unsigned long ino,  	}  	ei->i_flags = le32_to_cpu(raw_inode->i_flags);  	ext4_set_inode_flags(inode, true); +	/* Detect invalid flag combination - can't have both inline data and extents */ +	if (ext4_test_inode_flag(inode, EXT4_INODE_INLINE_DATA) && +	    ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { +		ext4_error_inode(inode, function, line, 0, +			"inode has both inline data and extents flags"); +		ret = -EFSCORRUPTED; +		goto bad_inode; +	}  	inode->i_blocks = ext4_inode_blocks(raw_inode, ei);  	ei->i_file_acl = le32_to_cpu(raw_inode->i_file_acl_lo);  	if (ext4_has_feature_64bit(sb)) diff --git a/fs/ext4/orphan.c b/fs/ext4/orphan.c index 33c3a89396b1..82d5e7501455 100644 --- a/fs/ext4/orphan.c +++ b/fs/ext4/orphan.c @@ -513,7 +513,7 @@ void ext4_release_orphan_info(struct super_block *sb)  		return;  	for (i = 0; i < oi->of_blocks; i++)  		brelse(oi->of_binfo[i].ob_bh); -	kfree(oi->of_binfo); +	kvfree(oi->of_binfo);  }  static struct ext4_orphan_block_tail *ext4_orphan_block_tail( @@ -637,7 +637,7 @@ int ext4_init_orphan_info(struct super_block *sb)  out_free:  	for (i--; i >= 0; i--)  		brelse(oi->of_binfo[i].ob_bh); -	kfree(oi->of_binfo); +	kvfree(oi->of_binfo);  out_put:  	iput(inode);  	return ret;  | 
