diff options
Diffstat (limited to 'fs/ext4/inline.c')
| -rw-r--r-- | fs/ext4/inline.c | 49 | 
1 files changed, 10 insertions, 39 deletions
diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c index 70cf4c7b268a..e55a8bc870bd 100644 --- a/fs/ext4/inline.c +++ b/fs/ext4/inline.c @@ -144,6 +144,12 @@ int ext4_find_inline_data_nolock(struct inode *inode)  		goto out;  	if (!is.s.not_found) { +		if (is.s.here->e_value_inum) { +			EXT4_ERROR_INODE(inode, "inline data xattr refers " +					 "to an external xattr inode"); +			error = -EFSCORRUPTED; +			goto out; +		}  		EXT4_I(inode)->i_inline_off = (u16)((void *)is.s.here -  					(void *)ext4_raw_inode(&is.iloc));  		EXT4_I(inode)->i_inline_size = EXT4_MIN_INLINE_DATA_SIZE + @@ -431,6 +437,7 @@ static int ext4_destroy_inline_data_nolock(handle_t *handle,  	memset((void *)ext4_raw_inode(&is.iloc)->i_block,  		0, EXT4_MIN_INLINE_DATA_SIZE); +	memset(ei->i_data, 0, EXT4_MIN_INLINE_DATA_SIZE);  	if (ext4_has_feature_extents(inode->i_sb)) {  		if (S_ISDIR(inode->i_mode) || @@ -880,11 +887,11 @@ retry_journal:  	flags |= AOP_FLAG_NOFS;  	if (ret == -ENOSPC) { +		ext4_journal_stop(handle);  		ret = ext4_da_convert_inline_data_to_extent(mapping,  							    inode,  							    flags,  							    fsdata); -		ext4_journal_stop(handle);  		if (ret == -ENOSPC &&  		    ext4_should_retry_alloc(inode->i_sb, &retries))  			goto retry_journal; @@ -1835,8 +1842,8 @@ int ext4_inline_data_iomap(struct inode *inode, struct iomap *iomap)  	iomap->offset = 0;  	iomap->length = min_t(loff_t, ext4_get_inline_size(inode),  			      i_size_read(inode)); -	iomap->type = 0; -	iomap->flags = IOMAP_F_DATA_INLINE; +	iomap->type = IOMAP_INLINE; +	iomap->flags = 0;  out:  	up_read(&EXT4_I(inode)->xattr_sem); @@ -1884,42 +1891,6 @@ out:  	return (error < 0 ? error : 0);  } -/* - * Called during xattr set, and if we can sparse space 'needed', - * just create the extent tree evict the data to the outer block. - * - * We use jbd2 instead of page cache to move data to the 1st block - * so that the whole transaction can be committed as a whole and - * the data isn't lost because of the delayed page cache write. - */ -int ext4_try_to_evict_inline_data(handle_t *handle, -				  struct inode *inode, -				  int needed) -{ -	int error; -	struct ext4_xattr_entry *entry; -	struct ext4_inode *raw_inode; -	struct ext4_iloc iloc; - -	error = ext4_get_inode_loc(inode, &iloc); -	if (error) -		return error; - -	raw_inode = ext4_raw_inode(&iloc); -	entry = (struct ext4_xattr_entry *)((void *)raw_inode + -					    EXT4_I(inode)->i_inline_off); -	if (EXT4_XATTR_LEN(entry->e_name_len) + -	    EXT4_XATTR_SIZE(le32_to_cpu(entry->e_value_size)) < needed) { -		error = -ENOSPC; -		goto out; -	} - -	error = ext4_convert_inline_data_nolock(handle, inode, &iloc); -out: -	brelse(iloc.bh); -	return error; -} -  int ext4_inline_data_truncate(struct inode *inode, int *has_inline)  {  	handle_t *handle;  |