diff options
Diffstat (limited to 'fs/f2fs/inode.c')
| -rw-r--r-- | fs/f2fs/inode.c | 36 | 
1 files changed, 26 insertions, 10 deletions
diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index b4c4f2b25304..205add3d0f3a 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c @@ -22,6 +22,9 @@  void f2fs_mark_inode_dirty_sync(struct inode *inode, bool sync)  { +	if (is_inode_flag_set(inode, FI_NEW_INODE)) +		return; +  	if (f2fs_inode_dirtied(inode, sync))  		return; @@ -275,6 +278,12 @@ static int do_read_inode(struct inode *inode)  		i_projid = F2FS_DEF_PROJID;  	fi->i_projid = make_kprojid(&init_user_ns, i_projid); +	if (f2fs_has_extra_attr(inode) && f2fs_sb_has_inode_crtime(sbi->sb) && +			F2FS_FITS_IN_INODE(ri, fi->i_extra_isize, i_crtime)) { +		fi->i_crtime.tv_sec = le64_to_cpu(ri->i_crtime); +		fi->i_crtime.tv_nsec = le32_to_cpu(ri->i_crtime_nsec); +	} +  	f2fs_put_page(node_page, 1);  	stat_inc_inline_xattr(inode); @@ -360,14 +369,15 @@ retry:  	return inode;  } -int update_inode(struct inode *inode, struct page *node_page) +void update_inode(struct inode *inode, struct page *node_page)  {  	struct f2fs_inode *ri;  	struct extent_tree *et = F2FS_I(inode)->extent_tree; -	f2fs_inode_synced(inode); -  	f2fs_wait_on_page_writeback(node_page, NODE, true); +	set_page_dirty(node_page); + +	f2fs_inode_synced(inode);  	ri = F2FS_INODE(node_page); @@ -417,6 +427,15 @@ int update_inode(struct inode *inode, struct page *node_page)  						F2FS_I(inode)->i_projid);  			ri->i_projid = cpu_to_le32(i_projid);  		} + +		if (f2fs_sb_has_inode_crtime(F2FS_I_SB(inode)->sb) && +			F2FS_FITS_IN_INODE(ri, F2FS_I(inode)->i_extra_isize, +								i_crtime)) { +			ri->i_crtime = +				cpu_to_le64(F2FS_I(inode)->i_crtime.tv_sec); +			ri->i_crtime_nsec = +				cpu_to_le32(F2FS_I(inode)->i_crtime.tv_nsec); +		}  	}  	__set_inode_rdev(inode, ri); @@ -426,14 +445,12 @@ int update_inode(struct inode *inode, struct page *node_page)  	if (inode->i_nlink == 0)  		clear_inline_node(node_page); -	return set_page_dirty(node_page);  } -int update_inode_page(struct inode *inode) +void update_inode_page(struct inode *inode)  {  	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);  	struct page *node_page; -	int ret = 0;  retry:  	node_page = get_node_page(sbi, inode->i_ino);  	if (IS_ERR(node_page)) { @@ -444,11 +461,10 @@ retry:  		} else if (err != -ENOENT) {  			f2fs_stop_checkpoint(sbi, false);  		} -		return 0; +		return;  	} -	ret = update_inode(inode, node_page); +	update_inode(inode, node_page);  	f2fs_put_page(node_page, 1); -	return ret;  }  int f2fs_write_inode(struct inode *inode, struct writeback_control *wbc) @@ -569,7 +585,7 @@ no_delete:  			!exist_written_data(sbi, inode->i_ino, ORPHAN_INO));  	}  out_clear: -	fscrypt_put_encryption_info(inode, NULL); +	fscrypt_put_encryption_info(inode);  	clear_inode(inode);  }  |