f2fs: use PGP_LOCK to check its truncation
Subsystems (2)
Jaegeuk Kim
maintainerPATCH 1/2 f2fs: use PGP_LOCK to check its truncation
Previously, after trylock_page is succeeded, it doesn't check its mapping. In order to fix that, we can just give PGP_LOCK to pagecache_get_page.
Signed-off-by Jaegeuk Kim <[email protected]>
--- fs/f2fs/node.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
fs/f2fs/node.c +1 -4
@@ -1202,13 +1202,10 @@ static void flush_inline_data(struct f2fs_sb_info *sbi, nid_t ino)if (!inode)return ; - page =pagecache_get_page (inode->i_mapping,0 ,FGP_NOWAIT ,0 ); + page =pagecache_get_page (inode->i_mapping,0 ,FGP_LOCK |FGP_NOWAIT ,0 );if (!page) goto iput_out; -if (!trylock_page (page)) - goto release_out; -if (!PageUptodate (page)) goto page_out;
Signature · 1 line
2.6.3
Jaegeuk Kim
maintainerPATCH 2/2 f2fs: add BUG_ON to avoid unnecessary flow
This patch adds BUG_ON instead of retrying loop.
In the case of node pages, we already got this inode page, but unlocked it. By the fact that we don't truncate any node pages in operations, the page's mapping should be unchangeable.
Signed-off-by Jaegeuk Kim <[email protected]>
--- fs/f2fs/node.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
fs/f2fs/node.c +2 -5
@@ -832,7 +832,7 @@ int truncate_inode_blocks(struct inode *inode, pgoff_t from)trace_f2fs_truncate_inode_blocks_enter (inode, from); level =get_node_path (inode, from, offset, noffset); -restart: + page =get_node_page (sbi, inode->i_ino);if (IS_ERR (page)) {trace_f2fs_truncate_inode_blocks_exit (inode,PTR_ERR (page));
@@ -896,10 +896,7 @@ skip_partial:if (offset[1 ] ==0 && ri->i_nid[offset[0 ] -NODE_DIR1_BLOCK ]) {lock_page (page); -if (unlikely (page->mapping !=NODE_MAPPING (sbi))) { -f2fs_put_page (page,1 ); - goto restart; - } +BUG_ON (page->mapping !=NODE_MAPPING (sbi));f2fs_wait_on_page_writeback (page,NODE , true); ri->i_nid[offset[0 ] -NODE_DIR1_BLOCK ] =0 ;set_page_dirty (page);
Signature · 1 line
2.6.3