On 04/12, Jaegeuk Kim wrote:
> 2049d4fcb057 ("f2fs: avoid multiple node page writes due to inline_data")
> introduced flushing inline_data when flushing node pages.
> 
> b763f3bedc2d ("f2fs: restructure f2fs page.private layout")
> Replace PageChecked with PagePrivate
> 
> But, it turned out the bit was not cleared in corner case.
> Let's revert the original hack and rely on the generic write path to flush
> inline_data.

Ok, this gives generic/204 failure. Let me check in other way to address private
usage.

> 
> Fixes: 2049d4fcb057 ("f2fs: avoid multiple node page writes due to 
> inline_data")
> Fixes: b763f3bedc2d ("f2fs: restructure f2fs page.private layout")
> Signed-off-by: Jaegeuk Kim <[email protected]>
> ---
>  fs/f2fs/data.c   |  2 --
>  fs/f2fs/f2fs.h   |  9 ++-------
>  fs/f2fs/inline.c |  2 --
>  fs/f2fs/inode.c  |  4 ----
>  fs/f2fs/node.c   | 52 ------------------------------------------------
>  5 files changed, 2 insertions(+), 67 deletions(-)
> 
> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
> index 5a3636b70f48..14cd647d727d 100644
> --- a/fs/f2fs/data.c
> +++ b/fs/f2fs/data.c
> @@ -3389,8 +3389,6 @@ static int prepare_write_begin(struct f2fs_sb_info *sbi,
>               if (pos + len <= MAX_INLINE_DATA(inode)) {
>                       f2fs_do_read_inline_data(page, ipage);
>                       set_inode_flag(inode, FI_DATA_EXIST);
> -                     if (inode->i_nlink)
> -                             set_page_private_inline(ipage);
>                       goto out;
>               }
>               err = f2fs_convert_inline_page(&dn, page);
> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
> index ede38bcef80e..200fb2243e8a 100644
> --- a/fs/f2fs/f2fs.h
> +++ b/fs/f2fs/f2fs.h
> @@ -1382,9 +1382,8 @@ static inline void f2fs_clear_bit(unsigned int nr, char 
> *addr);
>   * bit 0     PAGE_PRIVATE_NOT_POINTER
>   * bit 1     PAGE_PRIVATE_DUMMY_WRITE
>   * bit 2     PAGE_PRIVATE_ONGOING_MIGRATION
> - * bit 3     PAGE_PRIVATE_INLINE_INODE
> - * bit 4     PAGE_PRIVATE_REF_RESOURCE
> - * bit 5-    f2fs private data
> + * bit 3     PAGE_PRIVATE_REF_RESOURCE
> + * bit 4-    f2fs private data
>   *
>   * Layout B: lowest bit should be 0
>   * page.private is a wrapped pointer.
> @@ -1393,7 +1392,6 @@ enum {
>       PAGE_PRIVATE_NOT_POINTER,               /* private contains non-pointer 
> data */
>       PAGE_PRIVATE_DUMMY_WRITE,               /* data page for padding 
> aligned IO */
>       PAGE_PRIVATE_ONGOING_MIGRATION,         /* data page which is on-going 
> migrating */
> -     PAGE_PRIVATE_INLINE_INODE,              /* inode page contains inline 
> data */
>       PAGE_PRIVATE_REF_RESOURCE,              /* dirty page has referenced 
> resources */
>       PAGE_PRIVATE_MAX
>  };
> @@ -1432,17 +1430,14 @@ static inline void clear_page_private_##name(struct 
> page *page) \
>  }
>  
>  PAGE_PRIVATE_GET_FUNC(nonpointer, NOT_POINTER);
> -PAGE_PRIVATE_GET_FUNC(inline, INLINE_INODE);
>  PAGE_PRIVATE_GET_FUNC(gcing, ONGOING_MIGRATION);
>  PAGE_PRIVATE_GET_FUNC(dummy, DUMMY_WRITE);
>  
>  PAGE_PRIVATE_SET_FUNC(reference, REF_RESOURCE);
> -PAGE_PRIVATE_SET_FUNC(inline, INLINE_INODE);
>  PAGE_PRIVATE_SET_FUNC(gcing, ONGOING_MIGRATION);
>  PAGE_PRIVATE_SET_FUNC(dummy, DUMMY_WRITE);
>  
>  PAGE_PRIVATE_CLEAR_FUNC(reference, REF_RESOURCE);
> -PAGE_PRIVATE_CLEAR_FUNC(inline, INLINE_INODE);
>  PAGE_PRIVATE_CLEAR_FUNC(gcing, ONGOING_MIGRATION);
>  PAGE_PRIVATE_CLEAR_FUNC(dummy, DUMMY_WRITE);
>  
> diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c
> index 4638fee16a91..c9ede493f8cc 100644
> --- a/fs/f2fs/inline.c
> +++ b/fs/f2fs/inline.c
> @@ -188,7 +188,6 @@ int f2fs_convert_inline_page(struct dnode_of_data *dn, 
> struct page *page)
>  
>       /* clear inline data and flag after data writeback */
>       f2fs_truncate_inline_inode(dn->inode, dn->inode_page, 0);
> -     clear_page_private_inline(dn->inode_page);
>  clear_out:
>       stat_dec_inline_inode(dn->inode);
>       clear_inode_flag(dn->inode, FI_INLINE_DATA);
> @@ -267,7 +266,6 @@ int f2fs_write_inline_data(struct inode *inode, struct 
> page *page)
>       set_inode_flag(inode, FI_APPEND_WRITE);
>       set_inode_flag(inode, FI_DATA_EXIST);
>  
> -     clear_page_private_inline(dn.inode_page);
>       f2fs_put_dnode(&dn);
>       return 0;
>  }
> diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c
> index cf4327ad106c..336f92afb7e7 100644
> --- a/fs/f2fs/inode.c
> +++ b/fs/f2fs/inode.c
> @@ -699,10 +699,6 @@ void f2fs_update_inode(struct inode *inode, struct page 
> *node_page)
>  
>       __set_inode_rdev(inode, ri);
>  
> -     /* deleted inode */
> -     if (inode->i_nlink == 0)
> -             clear_page_private_inline(node_page);
> -
>       init_idisk_time(inode);
>  #ifdef CONFIG_F2FS_CHECK_FS
>       f2fs_inode_chksum_set(F2FS_I_SB(inode), node_page);
> diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
> index bd1dad523796..8bdcf80ca07a 100644
> --- a/fs/f2fs/node.c
> +++ b/fs/f2fs/node.c
> @@ -1479,42 +1479,6 @@ struct page *f2fs_get_node_page_ra(struct page 
> *parent, int start)
>       return __get_node_page(sbi, nid, parent, start);
>  }
>  
> -static void flush_inline_data(struct f2fs_sb_info *sbi, nid_t ino)
> -{
> -     struct inode *inode;
> -     struct page *page;
> -     int ret;
> -
> -     /* should flush inline_data before evict_inode */
> -     inode = ilookup(sbi->sb, ino);
> -     if (!inode)
> -             return;
> -
> -     page = f2fs_pagecache_get_page(inode->i_mapping, 0,
> -                                     FGP_LOCK|FGP_NOWAIT, 0);
> -     if (!page)
> -             goto iput_out;
> -
> -     if (!PageUptodate(page))
> -             goto page_out;
> -
> -     if (!PageDirty(page))
> -             goto page_out;
> -
> -     if (!clear_page_dirty_for_io(page))
> -             goto page_out;
> -
> -     ret = f2fs_write_inline_data(inode, page);
> -     inode_dec_dirty_pages(inode);
> -     f2fs_remove_dirty_inode(inode);
> -     if (ret)
> -             set_page_dirty(page);
> -page_out:
> -     f2fs_put_page(page, 1);
> -iput_out:
> -     iput(inode);
> -}
> -
>  static struct page *last_fsync_dnode(struct f2fs_sb_info *sbi, nid_t ino)
>  {
>       pgoff_t index;
> @@ -1918,14 +1882,6 @@ void f2fs_flush_inline_data(struct f2fs_sb_info *sbi)
>                               /* someone wrote it for us */
>                               goto continue_unlock;
>                       }
> -
> -                     /* flush inline_data, if it's async context. */
> -                     if (page_private_inline(page)) {
> -                             clear_page_private_inline(page);
> -                             unlock_page(page);
> -                             flush_inline_data(sbi, ino_of_node(page));
> -                             continue;
> -                     }
>                       unlock_page(page);
>               }
>               folio_batch_release(&fbatch);
> @@ -2000,14 +1956,6 @@ int f2fs_sync_node_pages(struct f2fs_sb_info *sbi,
>                       if (!do_balance)
>                               goto write_node;
>  
> -                     /* flush inline_data */
> -                     if (page_private_inline(page)) {
> -                             clear_page_private_inline(page);
> -                             unlock_page(page);
> -                             flush_inline_data(sbi, ino_of_node(page));
> -                             goto lock_node;
> -                     }
> -
>                       /* flush dirty inode */
>                       if (IS_INODE(page) && flush_dirty_inode(page))
>                               goto lock_node;
> -- 
> 2.40.0.577.gac1e443424-goog


_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to