diff options
Diffstat (limited to 'fs/f2fs/inline.c')
| -rw-r--r-- | fs/f2fs/inline.c | 18 | 
1 files changed, 15 insertions, 3 deletions
diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c index 3613efca8c00..896db0416f0e 100644 --- a/fs/f2fs/inline.c +++ b/fs/f2fs/inline.c @@ -131,6 +131,7 @@ int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page)  	err = f2fs_get_node_info(fio.sbi, dn->nid, &ni);  	if (err) { +		f2fs_truncate_data_blocks_range(dn, 1);  		f2fs_put_dnode(dn);  		return err;  	} @@ -320,7 +321,7 @@ struct f2fs_dir_entry *f2fs_find_in_inline_dir(struct inode *dir,  		return NULL;  	} -	namehash = f2fs_dentry_hash(&name, fname); +	namehash = f2fs_dentry_hash(dir, &name, fname);  	inline_dentry = inline_data_addr(dir, ipage); @@ -580,7 +581,7 @@ int f2fs_add_inline_entry(struct inode *dir, const struct qstr *new_name,  	f2fs_wait_on_page_writeback(ipage, NODE, true, true); -	name_hash = f2fs_dentry_hash(new_name, NULL); +	name_hash = f2fs_dentry_hash(dir, new_name, NULL);  	f2fs_update_dentry(ino, mode, &d, new_name, name_hash, bit_pos);  	set_page_dirty(ipage); @@ -588,6 +589,11 @@ int f2fs_add_inline_entry(struct inode *dir, const struct qstr *new_name,  	/* we don't need to mark_inode_dirty now */  	if (inode) {  		f2fs_i_pino_write(inode, dir->i_ino); + +		/* synchronize inode page's data from inode cache */ +		if (is_inode_flag_set(inode, FI_NEW_INODE)) +			f2fs_update_inode(inode, page); +  		f2fs_put_page(page, 1);  	} @@ -704,7 +710,13 @@ int f2fs_inline_data_fiemap(struct inode *inode,  	if (IS_ERR(ipage))  		return PTR_ERR(ipage); -	if (!f2fs_has_inline_data(inode)) { +	if ((S_ISREG(inode->i_mode) || S_ISLNK(inode->i_mode)) && +				!f2fs_has_inline_data(inode)) { +		err = -EAGAIN; +		goto out; +	} + +	if (S_ISDIR(inode->i_mode) && !f2fs_has_inline_dentry(inode)) {  		err = -EAGAIN;  		goto out;  	}  |