On 2017/9/11 15:30, Daeho Jeong wrote:
> On a senario like writing out the first dirty page of the inode
> as the inline data, we only cleared dirty flags of the pages, but
> didn't clear the dirty tags of those pages in the radix tree.
> 
> If we don't clear the dirty tags of the pages in the radix tree, the
> inodes which contain the pages will be marked with I_DIRTY_PAGES again
> and again, and writepages() for the inodes will be invoked in every
> writeback period. As a result, nothing will be done in every
> writepages() for the inodes and it will just consume CPU time
> meaninglessly.
> 
> Signed-off-by: Daeho Jeong <[email protected]>

Reviewed-by: Chao Yu <[email protected]>

> ---
>  fs/f2fs/dir.c    | 7 +++++++
>  fs/f2fs/inline.c | 7 +++++++
>  2 files changed, 14 insertions(+)
> 
> diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c
> index 37f9c7f..c0c933ad 100644
> --- a/fs/f2fs/dir.c
> +++ b/fs/f2fs/dir.c
> @@ -705,6 +705,8 @@ void f2fs_delete_entry(struct f2fs_dir_entry *dentry, 
> struct page *page,
>       struct  f2fs_dentry_block *dentry_blk;
>       unsigned int bit_pos;
>       int slots = GET_DENTRY_SLOTS(le16_to_cpu(dentry->name_len));
> +     struct address_space *mapping = page_mapping(page);
> +     unsigned long flags;
>       int i;
>  
>       f2fs_update_time(F2FS_I_SB(dir), REQ_TIME);
> @@ -735,6 +737,11 @@ void f2fs_delete_entry(struct f2fs_dir_entry *dentry, 
> struct page *page,
>  
>       if (bit_pos == NR_DENTRY_IN_BLOCK &&
>                       !truncate_hole(dir, page->index, page->index + 1)) {
> +             spin_lock_irqsave(&mapping->tree_lock, flags);
> +             radix_tree_tag_clear(&mapping->page_tree, page_index(page),
> +                                  PAGECACHE_TAG_DIRTY);
> +             spin_unlock_irqrestore(&mapping->tree_lock, flags);
> +
>               clear_page_dirty_for_io(page);
>               ClearPagePrivate(page);
>               ClearPageUptodate(page);
> diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c
> index c133a4f..8322e4e 100644
> --- a/fs/f2fs/inline.c
> +++ b/fs/f2fs/inline.c
> @@ -202,6 +202,8 @@ int f2fs_write_inline_data(struct inode *inode, struct 
> page *page)
>  {
>       void *src_addr, *dst_addr;
>       struct dnode_of_data dn;
> +     struct address_space *mapping = page_mapping(page);
> +     unsigned long flags;
>       int err;
>  
>       set_new_dnode(&dn, inode, NULL, NULL, 0);
> @@ -223,6 +225,11 @@ int f2fs_write_inline_data(struct inode *inode, struct 
> page *page)
>       kunmap_atomic(src_addr);
>       set_page_dirty(dn.inode_page);
>  
> +     spin_lock_irqsave(&mapping->tree_lock, flags);
> +     radix_tree_tag_clear(&mapping->page_tree, page_index(page),
> +                          PAGECACHE_TAG_DIRTY);
> +     spin_unlock_irqrestore(&mapping->tree_lock, flags);
> +
>       set_inode_flag(inode, FI_APPEND_WRITE);
>       set_inode_flag(inode, FI_DATA_EXIST);
>  
> 


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to