forked from mirrors/linux
		
	f2fs: remove syncing inode page in all the cases
This patch reduces to call them across the whole tree. - sync_inode_page() - update_inode_page() - update_inode() - f2fs_write_inode() Instead, checkpoint will flush all the dirty inode metadata before syncing node pages. Note that, this is doable, since we call mark_inode_dirty_sync() for all inode's field change which needs to update on-disk inode as well. Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
		
							parent
							
								
									0f18b462b2
								
							
						
					
					
						commit
						ee6d182f2a
					
				
					 10 changed files with 17 additions and 121 deletions
				
			
		| 
						 | 
					@ -343,8 +343,6 @@ int reserve_new_blocks(struct dnode_of_data *dn, blkcnt_t count)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (set_page_dirty(dn->node_page))
 | 
						if (set_page_dirty(dn->node_page))
 | 
				
			||||||
		dn->node_changed = true;
 | 
							dn->node_changed = true;
 | 
				
			||||||
 | 
					 | 
				
			||||||
	sync_inode_page(dn);
 | 
					 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -562,11 +560,8 @@ struct page *get_new_data_page(struct inode *inode,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
got_it:
 | 
					got_it:
 | 
				
			||||||
	if (new_i_size && i_size_read(inode) <
 | 
						if (new_i_size && i_size_read(inode) <
 | 
				
			||||||
				((loff_t)(index + 1) << PAGE_SHIFT)) {
 | 
									((loff_t)(index + 1) << PAGE_SHIFT))
 | 
				
			||||||
		f2fs_i_size_write(inode, ((loff_t)(index + 1) << PAGE_SHIFT));
 | 
							f2fs_i_size_write(inode, ((loff_t)(index + 1) << PAGE_SHIFT));
 | 
				
			||||||
		/* Only the directory inode sets new_i_size */
 | 
					 | 
				
			||||||
		set_inode_flag(inode, FI_UPDATE_DIR);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return page;
 | 
						return page;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -787,8 +782,6 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map,
 | 
				
			||||||
	else if (dn.ofs_in_node < end_offset)
 | 
						else if (dn.ofs_in_node < end_offset)
 | 
				
			||||||
		goto next_block;
 | 
							goto next_block;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (allocated)
 | 
					 | 
				
			||||||
		sync_inode_page(&dn);
 | 
					 | 
				
			||||||
	f2fs_put_dnode(&dn);
 | 
						f2fs_put_dnode(&dn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (create) {
 | 
						if (create) {
 | 
				
			||||||
| 
						 | 
					@ -799,8 +792,6 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map,
 | 
				
			||||||
	goto next_dnode;
 | 
						goto next_dnode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sync_out:
 | 
					sync_out:
 | 
				
			||||||
	if (allocated)
 | 
					 | 
				
			||||||
		sync_inode_page(&dn);
 | 
					 | 
				
			||||||
	f2fs_put_dnode(&dn);
 | 
						f2fs_put_dnode(&dn);
 | 
				
			||||||
unlock_out:
 | 
					unlock_out:
 | 
				
			||||||
	if (create) {
 | 
						if (create) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -454,19 +454,15 @@ void update_parent_metadata(struct inode *dir, struct inode *inode,
 | 
				
			||||||
						unsigned int current_depth)
 | 
											unsigned int current_depth)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (inode && is_inode_flag_set(inode, FI_NEW_INODE)) {
 | 
						if (inode && is_inode_flag_set(inode, FI_NEW_INODE)) {
 | 
				
			||||||
		if (S_ISDIR(inode->i_mode)) {
 | 
							if (S_ISDIR(inode->i_mode))
 | 
				
			||||||
			f2fs_i_links_write(dir, true);
 | 
								f2fs_i_links_write(dir, true);
 | 
				
			||||||
			set_inode_flag(dir, FI_UPDATE_DIR);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		clear_inode_flag(inode, FI_NEW_INODE);
 | 
							clear_inode_flag(inode, FI_NEW_INODE);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	dir->i_mtime = dir->i_ctime = CURRENT_TIME;
 | 
						dir->i_mtime = dir->i_ctime = CURRENT_TIME;
 | 
				
			||||||
	mark_inode_dirty_sync(dir);
 | 
						mark_inode_dirty_sync(dir);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (F2FS_I(dir)->i_current_depth != current_depth) {
 | 
						if (F2FS_I(dir)->i_current_depth != current_depth)
 | 
				
			||||||
		f2fs_i_depth_write(dir, current_depth);
 | 
							f2fs_i_depth_write(dir, current_depth);
 | 
				
			||||||
		set_inode_flag(dir, FI_UPDATE_DIR);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (inode && is_inode_flag_set(inode, FI_INC_LINK))
 | 
						if (inode && is_inode_flag_set(inode, FI_INC_LINK))
 | 
				
			||||||
		clear_inode_flag(inode, FI_INC_LINK);
 | 
							clear_inode_flag(inode, FI_INC_LINK);
 | 
				
			||||||
| 
						 | 
					@ -595,9 +591,7 @@ int f2fs_add_regular_entry(struct inode *dir, const struct qstr *new_name,
 | 
				
			||||||
	set_page_dirty(dentry_page);
 | 
						set_page_dirty(dentry_page);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (inode) {
 | 
						if (inode) {
 | 
				
			||||||
		/* we don't need to mark_inode_dirty now */
 | 
					 | 
				
			||||||
		f2fs_i_pino_write(inode, dir->i_ino);
 | 
							f2fs_i_pino_write(inode, dir->i_ino);
 | 
				
			||||||
		update_inode(inode, page);
 | 
					 | 
				
			||||||
		f2fs_put_page(page, 1);
 | 
							f2fs_put_page(page, 1);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -606,10 +600,6 @@ int f2fs_add_regular_entry(struct inode *dir, const struct qstr *new_name,
 | 
				
			||||||
	if (inode)
 | 
						if (inode)
 | 
				
			||||||
		up_write(&F2FS_I(inode)->i_sem);
 | 
							up_write(&F2FS_I(inode)->i_sem);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (is_inode_flag_set(dir, FI_UPDATE_DIR)) {
 | 
					 | 
				
			||||||
		update_inode_page(dir);
 | 
					 | 
				
			||||||
		clear_inode_flag(dir, FI_UPDATE_DIR);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	kunmap(dentry_page);
 | 
						kunmap(dentry_page);
 | 
				
			||||||
	f2fs_put_page(dentry_page, 1);
 | 
						f2fs_put_page(dentry_page, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -656,8 +646,6 @@ int f2fs_do_tmpfile(struct inode *inode, struct inode *dir)
 | 
				
			||||||
		err = PTR_ERR(page);
 | 
							err = PTR_ERR(page);
 | 
				
			||||||
		goto fail;
 | 
							goto fail;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	/* we don't need to mark_inode_dirty now */
 | 
					 | 
				
			||||||
	update_inode(inode, page);
 | 
					 | 
				
			||||||
	f2fs_put_page(page, 1);
 | 
						f2fs_put_page(page, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	clear_inode_flag(inode, FI_NEW_INODE);
 | 
						clear_inode_flag(inode, FI_NEW_INODE);
 | 
				
			||||||
| 
						 | 
					@ -673,13 +661,8 @@ void f2fs_drop_nlink(struct inode *dir, struct inode *inode, struct page *page)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	down_write(&F2FS_I(inode)->i_sem);
 | 
						down_write(&F2FS_I(inode)->i_sem);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (S_ISDIR(inode->i_mode)) {
 | 
						if (S_ISDIR(inode->i_mode))
 | 
				
			||||||
		f2fs_i_links_write(dir, false);
 | 
							f2fs_i_links_write(dir, false);
 | 
				
			||||||
		if (page)
 | 
					 | 
				
			||||||
			update_inode(dir, page);
 | 
					 | 
				
			||||||
		else
 | 
					 | 
				
			||||||
			update_inode_page(dir);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	inode->i_ctime = CURRENT_TIME;
 | 
						inode->i_ctime = CURRENT_TIME;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	f2fs_i_links_write(inode, false);
 | 
						f2fs_i_links_write(inode, false);
 | 
				
			||||||
| 
						 | 
					@ -688,7 +671,6 @@ void f2fs_drop_nlink(struct inode *dir, struct inode *inode, struct page *page)
 | 
				
			||||||
		f2fs_i_size_write(inode, 0);
 | 
							f2fs_i_size_write(inode, 0);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	up_write(&F2FS_I(inode)->i_sem);
 | 
						up_write(&F2FS_I(inode)->i_sem);
 | 
				
			||||||
	update_inode_page(inode);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (inode->i_nlink == 0)
 | 
						if (inode->i_nlink == 0)
 | 
				
			||||||
		add_orphan_inode(sbi, inode->i_ino);
 | 
							add_orphan_inode(sbi, inode->i_ino);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -689,9 +689,7 @@ void f2fs_update_extent_cache(struct dnode_of_data *dn)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fofs = start_bidx_of_node(ofs_of_node(dn->node_page), dn->inode) +
 | 
						fofs = start_bidx_of_node(ofs_of_node(dn->node_page), dn->inode) +
 | 
				
			||||||
								dn->ofs_in_node;
 | 
													dn->ofs_in_node;
 | 
				
			||||||
 | 
						f2fs_update_extent_tree_range(dn->inode, fofs, blkaddr, 1);
 | 
				
			||||||
	if (f2fs_update_extent_tree_range(dn->inode, fofs, blkaddr, 1))
 | 
					 | 
				
			||||||
		sync_inode_page(dn);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void f2fs_update_extent_cache_range(struct dnode_of_data *dn,
 | 
					void f2fs_update_extent_cache_range(struct dnode_of_data *dn,
 | 
				
			||||||
| 
						 | 
					@ -701,8 +699,7 @@ void f2fs_update_extent_cache_range(struct dnode_of_data *dn,
 | 
				
			||||||
	if (!f2fs_may_extent_tree(dn->inode))
 | 
						if (!f2fs_may_extent_tree(dn->inode))
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (f2fs_update_extent_tree_range(dn->inode, fofs, blkaddr, len))
 | 
						f2fs_update_extent_tree_range(dn->inode, fofs, blkaddr, len);
 | 
				
			||||||
		sync_inode_page(dn);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void init_extent_cache_info(struct f2fs_sb_info *sbi)
 | 
					void init_extent_cache_info(struct f2fs_sb_info *sbi)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1521,7 +1521,6 @@ enum {
 | 
				
			||||||
	FI_ACL_MODE,		/* indicate acl mode */
 | 
						FI_ACL_MODE,		/* indicate acl mode */
 | 
				
			||||||
	FI_NO_ALLOC,		/* should not allocate any blocks */
 | 
						FI_NO_ALLOC,		/* should not allocate any blocks */
 | 
				
			||||||
	FI_FREE_NID,		/* free allocated nide */
 | 
						FI_FREE_NID,		/* free allocated nide */
 | 
				
			||||||
	FI_UPDATE_DIR,		/* should update inode block for consistency */
 | 
					 | 
				
			||||||
	FI_NO_EXTENT,		/* not to use the extent cache */
 | 
						FI_NO_EXTENT,		/* not to use the extent cache */
 | 
				
			||||||
	FI_INLINE_XATTR,	/* used for inline xattr */
 | 
						FI_INLINE_XATTR,	/* used for inline xattr */
 | 
				
			||||||
	FI_INLINE_DATA,		/* used for inline data*/
 | 
						FI_INLINE_DATA,		/* used for inline data*/
 | 
				
			||||||
| 
						 | 
					@ -1936,7 +1935,6 @@ struct page *new_node_page(struct dnode_of_data *, unsigned int, struct page *);
 | 
				
			||||||
void ra_node_page(struct f2fs_sb_info *, nid_t);
 | 
					void ra_node_page(struct f2fs_sb_info *, nid_t);
 | 
				
			||||||
struct page *get_node_page(struct f2fs_sb_info *, pgoff_t);
 | 
					struct page *get_node_page(struct f2fs_sb_info *, pgoff_t);
 | 
				
			||||||
struct page *get_node_page_ra(struct page *, int);
 | 
					struct page *get_node_page_ra(struct page *, int);
 | 
				
			||||||
void sync_inode_page(struct dnode_of_data *);
 | 
					 | 
				
			||||||
void move_node_page(struct page *, int);
 | 
					void move_node_page(struct page *, int);
 | 
				
			||||||
int fsync_node_pages(struct f2fs_sb_info *, nid_t, struct writeback_control *,
 | 
					int fsync_node_pages(struct f2fs_sb_info *, nid_t, struct writeback_control *,
 | 
				
			||||||
								bool);
 | 
													bool);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -173,12 +173,8 @@ static void try_to_fix_pino(struct inode *inode)
 | 
				
			||||||
			get_parent_ino(inode, &pino)) {
 | 
								get_parent_ino(inode, &pino)) {
 | 
				
			||||||
		f2fs_i_pino_write(inode, pino);
 | 
							f2fs_i_pino_write(inode, pino);
 | 
				
			||||||
		file_got_pino(inode);
 | 
							file_got_pino(inode);
 | 
				
			||||||
		up_write(&fi->i_sem);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		f2fs_write_inode(inode, NULL);
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		up_write(&fi->i_sem);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						up_write(&fi->i_sem);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int f2fs_do_sync_file(struct file *file, loff_t start, loff_t end,
 | 
					static int f2fs_do_sync_file(struct file *file, loff_t start, loff_t end,
 | 
				
			||||||
| 
						 | 
					@ -499,7 +495,6 @@ int truncate_data_blocks_range(struct dnode_of_data *dn, int count)
 | 
				
			||||||
							dn->inode) + ofs;
 | 
												dn->inode) + ofs;
 | 
				
			||||||
		f2fs_update_extent_cache_range(dn, fofs, 0, len);
 | 
							f2fs_update_extent_cache_range(dn, fofs, 0, len);
 | 
				
			||||||
		dec_valid_block_count(sbi, dn->inode, nr_free);
 | 
							dec_valid_block_count(sbi, dn->inode, nr_free);
 | 
				
			||||||
		sync_inode_page(dn);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	dn->ofs_in_node = ofs;
 | 
						dn->ofs_in_node = ofs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1123,10 +1118,8 @@ static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
	if (!(mode & FALLOC_FL_KEEP_SIZE) && i_size_read(inode) < new_size) {
 | 
						if (!(mode & FALLOC_FL_KEEP_SIZE) && i_size_read(inode) < new_size)
 | 
				
			||||||
		f2fs_i_size_write(inode, new_size);
 | 
							f2fs_i_size_write(inode, new_size);
 | 
				
			||||||
		update_inode_page(inode);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1232,10 +1225,8 @@ static int expand_inode_data(struct inode *inode, loff_t offset,
 | 
				
			||||||
		new_size = ((loff_t)pg_end << PAGE_SHIFT) + off_end;
 | 
							new_size = ((loff_t)pg_end << PAGE_SHIFT) + off_end;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!(mode & FALLOC_FL_KEEP_SIZE) && i_size_read(inode) < new_size) {
 | 
						if (!(mode & FALLOC_FL_KEEP_SIZE) && i_size_read(inode) < new_size)
 | 
				
			||||||
		f2fs_i_size_write(inode, new_size);
 | 
							f2fs_i_size_write(inode, new_size);
 | 
				
			||||||
		update_inode_page(inode);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -73,7 +73,7 @@ bool truncate_inline_inode(struct page *ipage, u64 from)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	f2fs_wait_on_page_writeback(ipage, NODE, true);
 | 
						f2fs_wait_on_page_writeback(ipage, NODE, true);
 | 
				
			||||||
	memset(addr + from, 0, MAX_INLINE_DATA - from);
 | 
						memset(addr + from, 0, MAX_INLINE_DATA - from);
 | 
				
			||||||
 | 
						set_page_dirty(ipage);
 | 
				
			||||||
	return true;
 | 
						return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -146,7 +146,6 @@ int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page)
 | 
				
			||||||
clear_out:
 | 
					clear_out:
 | 
				
			||||||
	stat_dec_inline_inode(dn->inode);
 | 
						stat_dec_inline_inode(dn->inode);
 | 
				
			||||||
	f2fs_clear_inline_inode(dn->inode);
 | 
						f2fs_clear_inline_inode(dn->inode);
 | 
				
			||||||
	sync_inode_page(dn);
 | 
					 | 
				
			||||||
	f2fs_put_dnode(dn);
 | 
						f2fs_put_dnode(dn);
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -212,11 +211,11 @@ int f2fs_write_inline_data(struct inode *inode, struct page *page)
 | 
				
			||||||
	dst_addr = inline_data_addr(dn.inode_page);
 | 
						dst_addr = inline_data_addr(dn.inode_page);
 | 
				
			||||||
	memcpy(dst_addr, src_addr, MAX_INLINE_DATA);
 | 
						memcpy(dst_addr, src_addr, MAX_INLINE_DATA);
 | 
				
			||||||
	kunmap_atomic(src_addr);
 | 
						kunmap_atomic(src_addr);
 | 
				
			||||||
 | 
						set_page_dirty(dn.inode_page);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	set_inode_flag(inode, FI_APPEND_WRITE);
 | 
						set_inode_flag(inode, FI_APPEND_WRITE);
 | 
				
			||||||
	set_inode_flag(inode, FI_DATA_EXIST);
 | 
						set_inode_flag(inode, FI_DATA_EXIST);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sync_inode_page(&dn);
 | 
					 | 
				
			||||||
	clear_inline_node(dn.inode_page);
 | 
						clear_inline_node(dn.inode_page);
 | 
				
			||||||
	f2fs_put_dnode(&dn);
 | 
						f2fs_put_dnode(&dn);
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
| 
						 | 
					@ -255,7 +254,7 @@ bool recover_inline_data(struct inode *inode, struct page *npage)
 | 
				
			||||||
		set_inode_flag(inode, FI_INLINE_DATA);
 | 
							set_inode_flag(inode, FI_INLINE_DATA);
 | 
				
			||||||
		set_inode_flag(inode, FI_DATA_EXIST);
 | 
							set_inode_flag(inode, FI_DATA_EXIST);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		update_inode(inode, ipage);
 | 
							set_page_dirty(ipage);
 | 
				
			||||||
		f2fs_put_page(ipage, 1);
 | 
							f2fs_put_page(ipage, 1);
 | 
				
			||||||
		return true;
 | 
							return true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -266,7 +265,6 @@ bool recover_inline_data(struct inode *inode, struct page *npage)
 | 
				
			||||||
		if (!truncate_inline_inode(ipage, 0))
 | 
							if (!truncate_inline_inode(ipage, 0))
 | 
				
			||||||
			return false;
 | 
								return false;
 | 
				
			||||||
		f2fs_clear_inline_inode(inode);
 | 
							f2fs_clear_inline_inode(inode);
 | 
				
			||||||
		update_inode(inode, ipage);
 | 
					 | 
				
			||||||
		f2fs_put_page(ipage, 1);
 | 
							f2fs_put_page(ipage, 1);
 | 
				
			||||||
	} else if (ri && (ri->i_inline & F2FS_INLINE_DATA)) {
 | 
						} else if (ri && (ri->i_inline & F2FS_INLINE_DATA)) {
 | 
				
			||||||
		if (truncate_blocks(inode, 0, false))
 | 
							if (truncate_blocks(inode, 0, false))
 | 
				
			||||||
| 
						 | 
					@ -339,10 +337,8 @@ int make_empty_inline_dir(struct inode *inode, struct inode *parent,
 | 
				
			||||||
	set_page_dirty(ipage);
 | 
						set_page_dirty(ipage);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* update i_size to MAX_INLINE_DATA */
 | 
						/* update i_size to MAX_INLINE_DATA */
 | 
				
			||||||
	if (i_size_read(inode) < MAX_INLINE_DATA) {
 | 
						if (i_size_read(inode) < MAX_INLINE_DATA)
 | 
				
			||||||
		f2fs_i_size_write(inode, MAX_INLINE_DATA);
 | 
							f2fs_i_size_write(inode, MAX_INLINE_DATA);
 | 
				
			||||||
		set_inode_flag(inode, FI_UPDATE_DIR);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -401,12 +397,8 @@ static int f2fs_move_inline_dirents(struct inode *dir, struct page *ipage,
 | 
				
			||||||
	clear_inode_flag(dir, FI_INLINE_DENTRY);
 | 
						clear_inode_flag(dir, FI_INLINE_DENTRY);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	f2fs_i_depth_write(dir, 1);
 | 
						f2fs_i_depth_write(dir, 1);
 | 
				
			||||||
	if (i_size_read(dir) < PAGE_SIZE) {
 | 
						if (i_size_read(dir) < PAGE_SIZE)
 | 
				
			||||||
		f2fs_i_size_write(dir, PAGE_SIZE);
 | 
							f2fs_i_size_write(dir, PAGE_SIZE);
 | 
				
			||||||
		set_inode_flag(dir, FI_UPDATE_DIR);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	sync_inode_page(&dn);
 | 
					 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
	f2fs_put_page(page, 1);
 | 
						f2fs_put_page(page, 1);
 | 
				
			||||||
	return err;
 | 
						return err;
 | 
				
			||||||
| 
						 | 
					@ -486,7 +478,6 @@ static int f2fs_move_rehashed_dirents(struct inode *dir, struct page *ipage,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	stat_dec_inline_dir(dir);
 | 
						stat_dec_inline_dir(dir);
 | 
				
			||||||
	clear_inode_flag(dir, FI_INLINE_DENTRY);
 | 
						clear_inode_flag(dir, FI_INLINE_DENTRY);
 | 
				
			||||||
	update_inode(dir, ipage);
 | 
					 | 
				
			||||||
	kfree(backup_dentry);
 | 
						kfree(backup_dentry);
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
recover:
 | 
					recover:
 | 
				
			||||||
| 
						 | 
					@ -494,7 +485,7 @@ static int f2fs_move_rehashed_dirents(struct inode *dir, struct page *ipage,
 | 
				
			||||||
	memcpy(inline_dentry, backup_dentry, MAX_INLINE_DATA);
 | 
						memcpy(inline_dentry, backup_dentry, MAX_INLINE_DATA);
 | 
				
			||||||
	f2fs_i_depth_write(dir, 0);
 | 
						f2fs_i_depth_write(dir, 0);
 | 
				
			||||||
	f2fs_i_size_write(dir, MAX_INLINE_DATA);
 | 
						f2fs_i_size_write(dir, MAX_INLINE_DATA);
 | 
				
			||||||
	update_inode(dir, ipage);
 | 
						set_page_dirty(ipage);
 | 
				
			||||||
	f2fs_put_page(ipage, 1);
 | 
						f2fs_put_page(ipage, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	kfree(backup_dentry);
 | 
						kfree(backup_dentry);
 | 
				
			||||||
| 
						 | 
					@ -559,7 +550,6 @@ int f2fs_add_inline_entry(struct inode *dir, const struct qstr *name,
 | 
				
			||||||
	/* we don't need to mark_inode_dirty now */
 | 
						/* we don't need to mark_inode_dirty now */
 | 
				
			||||||
	if (inode) {
 | 
						if (inode) {
 | 
				
			||||||
		f2fs_i_pino_write(inode, dir->i_ino);
 | 
							f2fs_i_pino_write(inode, dir->i_ino);
 | 
				
			||||||
		update_inode(inode, page);
 | 
					 | 
				
			||||||
		f2fs_put_page(page, 1);
 | 
							f2fs_put_page(page, 1);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -567,11 +557,6 @@ int f2fs_add_inline_entry(struct inode *dir, const struct qstr *name,
 | 
				
			||||||
fail:
 | 
					fail:
 | 
				
			||||||
	if (inode)
 | 
						if (inode)
 | 
				
			||||||
		up_write(&F2FS_I(inode)->i_sem);
 | 
							up_write(&F2FS_I(inode)->i_sem);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (is_inode_flag_set(dir, FI_UPDATE_DIR)) {
 | 
					 | 
				
			||||||
		update_inode(dir, ipage);
 | 
					 | 
				
			||||||
		clear_inode_flag(dir, FI_UPDATE_DIR);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
	f2fs_put_page(ipage, 1);
 | 
						f2fs_put_page(ipage, 1);
 | 
				
			||||||
	return err;
 | 
						return err;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -706,9 +706,6 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
 | 
				
			||||||
			add_orphan_inode(sbi, new_inode->i_ino);
 | 
								add_orphan_inode(sbi, new_inode->i_ino);
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			release_orphan_inode(sbi);
 | 
								release_orphan_inode(sbi);
 | 
				
			||||||
 | 
					 | 
				
			||||||
		update_inode_page(old_inode);
 | 
					 | 
				
			||||||
		update_inode_page(new_inode);
 | 
					 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		f2fs_balance_fs(sbi, true);
 | 
							f2fs_balance_fs(sbi, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -720,10 +717,8 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
 | 
				
			||||||
			goto out_whiteout;
 | 
								goto out_whiteout;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (old_dir_entry) {
 | 
							if (old_dir_entry)
 | 
				
			||||||
			f2fs_i_links_write(new_dir, true);
 | 
								f2fs_i_links_write(new_dir, true);
 | 
				
			||||||
			update_inode_page(new_dir);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
		 * old entry and new entry can locate in the same inline
 | 
							 * old entry and new entry can locate in the same inline
 | 
				
			||||||
| 
						 | 
					@ -771,13 +766,11 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
 | 
				
			||||||
		if (old_dir != new_dir && !whiteout) {
 | 
							if (old_dir != new_dir && !whiteout) {
 | 
				
			||||||
			f2fs_set_link(old_inode, old_dir_entry,
 | 
								f2fs_set_link(old_inode, old_dir_entry,
 | 
				
			||||||
						old_dir_page, new_dir);
 | 
											old_dir_page, new_dir);
 | 
				
			||||||
			update_inode_page(old_inode);
 | 
					 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			f2fs_dentry_kunmap(old_inode, old_dir_page);
 | 
								f2fs_dentry_kunmap(old_inode, old_dir_page);
 | 
				
			||||||
			f2fs_put_page(old_dir_page, 0);
 | 
								f2fs_put_page(old_dir_page, 0);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		f2fs_i_links_write(old_dir, false);
 | 
							f2fs_i_links_write(old_dir, false);
 | 
				
			||||||
		update_inode_page(old_dir);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	f2fs_unlock_op(sbi);
 | 
						f2fs_unlock_op(sbi);
 | 
				
			||||||
| 
						 | 
					@ -899,8 +892,6 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
 | 
				
			||||||
	file_lost_pino(old_inode);
 | 
						file_lost_pino(old_inode);
 | 
				
			||||||
	up_write(&F2FS_I(old_inode)->i_sem);
 | 
						up_write(&F2FS_I(old_inode)->i_sem);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	update_inode_page(old_inode);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	old_dir->i_ctime = CURRENT_TIME;
 | 
						old_dir->i_ctime = CURRENT_TIME;
 | 
				
			||||||
	if (old_nlink) {
 | 
						if (old_nlink) {
 | 
				
			||||||
		down_write(&F2FS_I(old_dir)->i_sem);
 | 
							down_write(&F2FS_I(old_dir)->i_sem);
 | 
				
			||||||
| 
						 | 
					@ -908,7 +899,6 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
 | 
				
			||||||
		up_write(&F2FS_I(old_dir)->i_sem);
 | 
							up_write(&F2FS_I(old_dir)->i_sem);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	mark_inode_dirty_sync(old_dir);
 | 
						mark_inode_dirty_sync(old_dir);
 | 
				
			||||||
	update_inode_page(old_dir);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* update directory entry info of new dir inode */
 | 
						/* update directory entry info of new dir inode */
 | 
				
			||||||
	f2fs_set_link(new_dir, new_entry, new_page, old_inode);
 | 
						f2fs_set_link(new_dir, new_entry, new_page, old_inode);
 | 
				
			||||||
| 
						 | 
					@ -917,8 +907,6 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
 | 
				
			||||||
	file_lost_pino(new_inode);
 | 
						file_lost_pino(new_inode);
 | 
				
			||||||
	up_write(&F2FS_I(new_inode)->i_sem);
 | 
						up_write(&F2FS_I(new_inode)->i_sem);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	update_inode_page(new_inode);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	new_dir->i_ctime = CURRENT_TIME;
 | 
						new_dir->i_ctime = CURRENT_TIME;
 | 
				
			||||||
	if (new_nlink) {
 | 
						if (new_nlink) {
 | 
				
			||||||
		down_write(&F2FS_I(new_dir)->i_sem);
 | 
							down_write(&F2FS_I(new_dir)->i_sem);
 | 
				
			||||||
| 
						 | 
					@ -926,7 +914,6 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
 | 
				
			||||||
		up_write(&F2FS_I(new_dir)->i_sem);
 | 
							up_write(&F2FS_I(new_dir)->i_sem);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	mark_inode_dirty_sync(new_dir);
 | 
						mark_inode_dirty_sync(new_dir);
 | 
				
			||||||
	update_inode_page(new_dir);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	f2fs_unlock_op(sbi);
 | 
						f2fs_unlock_op(sbi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -671,8 +671,6 @@ static void truncate_node(struct dnode_of_data *dn)
 | 
				
			||||||
		remove_orphan_inode(sbi, dn->nid);
 | 
							remove_orphan_inode(sbi, dn->nid);
 | 
				
			||||||
		dec_valid_inode_count(sbi);
 | 
							dec_valid_inode_count(sbi);
 | 
				
			||||||
		f2fs_inode_synced(dn->inode);
 | 
							f2fs_inode_synced(dn->inode);
 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		sync_inode_page(dn);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
invalidate:
 | 
					invalidate:
 | 
				
			||||||
	clear_node_page_dirty(dn->node_page);
 | 
						clear_node_page_dirty(dn->node_page);
 | 
				
			||||||
| 
						 | 
					@ -1050,14 +1048,8 @@ struct page *new_node_page(struct dnode_of_data *dn,
 | 
				
			||||||
	if (f2fs_has_xattr_block(ofs))
 | 
						if (f2fs_has_xattr_block(ofs))
 | 
				
			||||||
		f2fs_i_xnid_write(dn->inode, dn->nid);
 | 
							f2fs_i_xnid_write(dn->inode, dn->nid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dn->node_page = page;
 | 
					 | 
				
			||||||
	if (ipage)
 | 
					 | 
				
			||||||
		update_inode(dn->inode, ipage);
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		sync_inode_page(dn);
 | 
					 | 
				
			||||||
	if (ofs == 0)
 | 
						if (ofs == 0)
 | 
				
			||||||
		inc_valid_inode_count(sbi);
 | 
							inc_valid_inode_count(sbi);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	return page;
 | 
						return page;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fail:
 | 
					fail:
 | 
				
			||||||
| 
						 | 
					@ -1176,24 +1168,6 @@ struct page *get_node_page_ra(struct page *parent, int start)
 | 
				
			||||||
	return __get_node_page(sbi, nid, parent, start);
 | 
						return __get_node_page(sbi, nid, parent, start);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void sync_inode_page(struct dnode_of_data *dn)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	int ret = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (IS_INODE(dn->node_page) || dn->inode_page == dn->node_page) {
 | 
					 | 
				
			||||||
		ret = update_inode(dn->inode, dn->node_page);
 | 
					 | 
				
			||||||
	} else if (dn->inode_page) {
 | 
					 | 
				
			||||||
		if (!dn->inode_page_locked)
 | 
					 | 
				
			||||||
			lock_page(dn->inode_page);
 | 
					 | 
				
			||||||
		ret = update_inode(dn->inode, dn->inode_page);
 | 
					 | 
				
			||||||
		if (!dn->inode_page_locked)
 | 
					 | 
				
			||||||
			unlock_page(dn->inode_page);
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		ret = update_inode_page(dn->inode);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	dn->node_changed = ret ? true: false;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void flush_inline_data(struct f2fs_sb_info *sbi, nid_t ino)
 | 
					static void flush_inline_data(struct f2fs_sb_info *sbi, nid_t ino)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct inode *inode;
 | 
						struct inode *inode;
 | 
				
			||||||
| 
						 | 
					@ -2003,8 +1977,6 @@ void recover_xattr_data(struct inode *inode, struct page *page, block_t blkaddr)
 | 
				
			||||||
	/* 3: update xattr blkaddr */
 | 
						/* 3: update xattr blkaddr */
 | 
				
			||||||
	refresh_sit_entry(sbi, NEW_ADDR, blkaddr);
 | 
						refresh_sit_entry(sbi, NEW_ADDR, blkaddr);
 | 
				
			||||||
	set_node_addr(sbi, &ni, blkaddr, false);
 | 
						set_node_addr(sbi, &ni, blkaddr, false);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	update_inode_page(inode);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int recover_inode_page(struct f2fs_sb_info *sbi, struct page *page)
 | 
					int recover_inode_page(struct f2fs_sb_info *sbi, struct page *page)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -490,9 +490,6 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (IS_INODE(dn.node_page))
 | 
					 | 
				
			||||||
		sync_inode_page(&dn);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	copy_node_footer(dn.node_page, page);
 | 
						copy_node_footer(dn.node_page, page);
 | 
				
			||||||
	fill_node_footer(dn.node_page, dn.nid, ni.ino,
 | 
						fill_node_footer(dn.node_page, dn.nid, ni.ino,
 | 
				
			||||||
					ofs_of_node(page), false);
 | 
										ofs_of_node(page), false);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -299,6 +299,7 @@ static inline int write_all_xattrs(struct inode *inode, __u32 hsize,
 | 
				
			||||||
		if (ipage) {
 | 
							if (ipage) {
 | 
				
			||||||
			inline_addr = inline_xattr_addr(ipage);
 | 
								inline_addr = inline_xattr_addr(ipage);
 | 
				
			||||||
			f2fs_wait_on_page_writeback(ipage, NODE, true);
 | 
								f2fs_wait_on_page_writeback(ipage, NODE, true);
 | 
				
			||||||
 | 
								set_page_dirty(ipage);
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			page = get_node_page(sbi, inode->i_ino);
 | 
								page = get_node_page(sbi, inode->i_ino);
 | 
				
			||||||
			if (IS_ERR(page)) {
 | 
								if (IS_ERR(page)) {
 | 
				
			||||||
| 
						 | 
					@ -546,11 +547,6 @@ static int __f2fs_setxattr(struct inode *inode, int index,
 | 
				
			||||||
	if (index == F2FS_XATTR_INDEX_ENCRYPTION &&
 | 
						if (index == F2FS_XATTR_INDEX_ENCRYPTION &&
 | 
				
			||||||
			!strcmp(name, F2FS_XATTR_NAME_ENCRYPTION_CONTEXT))
 | 
								!strcmp(name, F2FS_XATTR_NAME_ENCRYPTION_CONTEXT))
 | 
				
			||||||
		f2fs_set_encrypted_inode(inode);
 | 
							f2fs_set_encrypted_inode(inode);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (ipage)
 | 
					 | 
				
			||||||
		update_inode(inode, ipage);
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		update_inode_page(inode);
 | 
					 | 
				
			||||||
	mark_inode_dirty_sync(inode);
 | 
						mark_inode_dirty_sync(inode);
 | 
				
			||||||
exit:
 | 
					exit:
 | 
				
			||||||
	kzfree(base_addr);
 | 
						kzfree(base_addr);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue