diff options
Diffstat (limited to 'fs/ext4/inode.c')
| -rw-r--r-- | fs/ext4/inode.c | 23 | 
1 files changed, 11 insertions, 12 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 2ea07efbe016..4efe77286ecd 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -402,9 +402,9 @@ static int __check_block_validity(struct inode *inode, const char *func,  	if (!ext4_data_block_valid(EXT4_SB(inode->i_sb), map->m_pblk,  				   map->m_len)) {  		ext4_error_inode(inode, func, line, map->m_pblk, -				 "lblock %lu mapped to illegal pblock " +				 "lblock %lu mapped to illegal pblock %llu "  				 "(length %d)", (unsigned long) map->m_lblk, -				 map->m_len); +				 map->m_pblk, map->m_len);  		return -EFSCORRUPTED;  	}  	return 0; @@ -1389,9 +1389,10 @@ static int ext4_write_end(struct file *file,  	loff_t old_size = inode->i_size;  	int ret = 0, ret2;  	int i_size_changed = 0; +	int inline_data = ext4_has_inline_data(inode);  	trace_ext4_write_end(inode, pos, len, copied); -	if (ext4_has_inline_data(inode)) { +	if (inline_data) {  		ret = ext4_write_inline_data_end(inode, pos, len,  						 copied, page);  		if (ret < 0) { @@ -1419,7 +1420,7 @@ static int ext4_write_end(struct file *file,  	 * ordering of page lock and transaction start for journaling  	 * filesystems.  	 */ -	if (i_size_changed) +	if (i_size_changed || inline_data)  		ext4_mark_inode_dirty(handle, inode);  	if (pos + len > inode->i_size && ext4_can_truncate(inode)) @@ -1493,6 +1494,7 @@ static int ext4_journalled_write_end(struct file *file,  	int partial = 0;  	unsigned from, to;  	int size_changed = 0; +	int inline_data = ext4_has_inline_data(inode);  	trace_ext4_journalled_write_end(inode, pos, len, copied);  	from = pos & (PAGE_SIZE - 1); @@ -1500,7 +1502,7 @@ static int ext4_journalled_write_end(struct file *file,  	BUG_ON(!ext4_handle_valid(handle)); -	if (ext4_has_inline_data(inode)) { +	if (inline_data) {  		ret = ext4_write_inline_data_end(inode, pos, len,  						 copied, page);  		if (ret < 0) { @@ -1531,7 +1533,7 @@ static int ext4_journalled_write_end(struct file *file,  	if (old_size < pos)  		pagecache_isize_extended(inode, old_size, pos); -	if (size_changed) { +	if (size_changed || inline_data) {  		ret2 = ext4_mark_inode_dirty(handle, inode);  		if (!ret)  			ret = ret2; @@ -2028,11 +2030,7 @@ static int __ext4_journalled_writepage(struct page *page,  	}  	if (inline_data) { -		BUFFER_TRACE(inode_bh, "get write access"); -		ret = ext4_journal_get_write_access(handle, inode_bh); - -		err = ext4_handle_dirty_metadata(handle, inode, inode_bh); - +		ret = ext4_mark_inode_dirty(handle, inode);  	} else {  		ret = ext4_walk_page_buffers(handle, page_bufs, 0, len, NULL,  					     do_journal_get_write_access); @@ -4506,7 +4504,8 @@ static int __ext4_get_inode_loc(struct inode *inode,  	int			inodes_per_block, inode_offset;  	iloc->bh = NULL; -	if (!ext4_valid_inum(sb, inode->i_ino)) +	if (inode->i_ino < EXT4_ROOT_INO || +	    inode->i_ino > le32_to_cpu(EXT4_SB(sb)->s_es->s_inodes_count))  		return -EFSCORRUPTED;  	iloc->block_group = (inode->i_ino - 1) / EXT4_INODES_PER_GROUP(sb);  | 
