f2fs: fix error path when fail to read inline data
Subsystems (2)
PATCH 1/1 f2fs: fix error path when fail to read inline data
We should unlock page in ->readpage() path and also should unlock & release page in error path of ->write_begin() to avoid deadlock or memory leak. So let's add release code to fix the problem when we fail to read inline data.
Signed-off-by Chao Yu <[email protected]>
--- fs/f2fs/data.c | 14 ++++++++++---- fs/f2fs/inline.c | 4 +++- 2 files changed, 13 insertions(+), 5 deletions(-)
fs/f2fs/data.c +10 -4
@@ -942,13 +942,19 @@ inline_data:if (dn.data_blkaddr ==NEW_ADDR ) {zero_user_segment (page,0 ,PAGE_CACHE_SIZE ); }else { -if (f2fs_has_inline_data (inode)) +if (f2fs_has_inline_data (inode)) { err =f2fs_read_inline_data (inode, page); -else +if (err) { +page_cache_release (page); +return err; + } + }else { err =f2fs_submit_page_bio (sbi, page, dn.data_blkaddr,READ_SYNC ); -if (err) -return err; +if (err) +return err; + } +lock_page (page);if (unlikely (!PageUptodate (page))) {f2fs_put_page (page,1 );
fs/f2fs/inline.c +3 -1
@@ -45,8 +45,10 @@ int f2fs_read_inline_data(struct inode *inode, struct page *page) } ipage =get_node_page (sbi, inode->i_ino); -if (IS_ERR (ipage)) +if (IS_ERR (ipage)) { +unlock_page (page);return PTR_ERR (ipage); + }zero_user_segment (page,MAX_INLINE_DATA ,PAGE_CACHE_SIZE );
Signature · 5 lines
1.7.9.5 ------------------------------------------------------------------------------