From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753099AbbL2DMU (ORCPT ); Mon, 28 Dec 2015 22:12:20 -0500 Received: from mailout2.samsung.com ([203.254.224.25]:55859 "EHLO mailout2.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751959AbbL2DMR (ORCPT ); Mon, 28 Dec 2015 22:12:17 -0500 X-AuditID: cbfee61b-f793c6d00000236c-02-5681fa0edffb From: Chao Yu To: Jaegeuk Kim Cc: linux-f2fs-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org Subject: [PATCH 1/2] f2fs: split drop_inmem_pages from commit_inmem_pages Date: Tue, 29 Dec 2015 11:11:33 +0800 Message-id: <00a801d141e6$b756d620$26048260$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AdFB5o3fimEjuCfFSZiSmQ7OWbztUA== Content-language: zh-cn X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrDLMWRmVeSWpSXmKPExsVy+t9jQV2+X41hBj9Oalo8WT+L2eLSIneL y7vmsDkwe2xa1cnmsXvBZyaPz5vkApijuGxSUnMyy1KL9O0SuDKuX3rIVPDatGLeyZVMDYzr dLoYOTkkBEwkOt5NZ4GwxSQu3FvP1sXIxSEkMItR4snjDawQzitGiYt3u9hAqtgEVCSWd/xn ArFFgOxDiy6zg9jMAh4SjR3fWUFsYQFPiVnfOsFqWARUJXpbdzCD2LwClhLLL25mgbAFJX5M vscC0aslsX7ncSYIW15i85q3zBAXKUjsOPuaEWKXnsT7o+2sEDXiEhuP3GKZwAh0JsKoWUhG zUIyahaSlgWMLKsYJVILkguKk9JzjfJSy/WKE3OLS/PS9ZLzczcxgsP4mfQOxsO73A8xCnAw KvHwZkxqDBNiTSwrrsw9xCjBwawkwuu6BSjEm5JYWZValB9fVJqTWnyIUZqDRUmcd9+lyDAh gfTEktTs1NSC1CKYLBMHp1QDY6DtrPtOH68vZmWqsFmUr8C+tlo6WcB6+ekTp5dmbzf4mcl1 WWbN8pUHp567/rfdQK9xRtW+zy0xpq9FFWf719TVnJq5Rj9uw77VR0+pWl2V6o9JkZfaKLTg 3ir+nTc9dOO9dj4s+P030vLSqqM7DGU+B+drxR4vzvnLqfq4KU/uvv9zoUs2mUosxRmJhlrM RcWJAIcpHSdfAgAA Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Split drop_inmem_pages from commit_inmem_pages for code readability, and prepare for the following modification. Signed-off-by: Chao Yu --- fs/f2fs/f2fs.h | 3 +- fs/f2fs/file.c | 6 ++-- fs/f2fs/inode.c | 2 +- fs/f2fs/segment.c | 101 ++++++++++++++++++++++++++++++++++-------------------- fs/f2fs/super.c | 2 +- 5 files changed, 70 insertions(+), 44 deletions(-) diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 293dc4e..7fbfee9 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -1781,7 +1781,8 @@ void destroy_node_manager_caches(void); * segment.c */ void register_inmem_page(struct inode *, struct page *); -int commit_inmem_pages(struct inode *, bool); +void drop_inmem_pages(struct inode *); +int commit_inmem_pages(struct inode *); void f2fs_balance_fs(struct f2fs_sb_info *); void f2fs_balance_fs_bg(struct f2fs_sb_info *); int f2fs_issue_flush(struct f2fs_sb_info *); diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 91f576a..cfe7f13 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -1253,7 +1253,7 @@ static int f2fs_release_file(struct inode *inode, struct file *filp) { /* some remained atomic pages should discarded */ if (f2fs_is_atomic_file(inode)) - commit_inmem_pages(inode, true); + drop_inmem_pages(inode); if (f2fs_is_volatile_file(inode)) { set_inode_flag(F2FS_I(inode), FI_DROP_CACHE); filemap_fdatawrite(inode->i_mapping); @@ -1375,7 +1375,7 @@ static int f2fs_ioc_commit_atomic_write(struct file *filp) if (f2fs_is_atomic_file(inode)) { clear_inode_flag(F2FS_I(inode), FI_ATOMIC_FILE); - ret = commit_inmem_pages(inode, false); + ret = commit_inmem_pages(inode); if (ret) goto err_out; } @@ -1435,7 +1435,7 @@ static int f2fs_ioc_abort_volatile_write(struct file *filp) clear_inode_flag(F2FS_I(inode), FI_ATOMIC_FILE); clear_inode_flag(F2FS_I(inode), FI_VOLATILE_FILE); - commit_inmem_pages(inode, true); + drop_inmem_pages(inode); mnt_drop_write_file(filp); return ret; diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index e955008..9075c5e 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c @@ -318,7 +318,7 @@ void f2fs_evict_inode(struct inode *inode) /* some remained atomic pages should discarded */ if (f2fs_is_atomic_file(inode)) - commit_inmem_pages(inode, true); + drop_inmem_pages(inode); trace_f2fs_evict_inode(inode); truncate_inode_pages_final(&inode->i_data); diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index a3474ba..733f876 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -191,55 +191,67 @@ void register_inmem_page(struct inode *inode, struct page *page) trace_f2fs_register_inmem_page(page, INMEM); } -int commit_inmem_pages(struct inode *inode, bool abort) +static void __revoke_inmem_pages(struct inode *inode, + struct list_head *head) +{ + struct inmem_pages *cur, *tmp; + + list_for_each_entry_safe(cur, tmp, head, list) { + trace_f2fs_commit_inmem_page(cur->page, INMEM_DROP); + + lock_page(cur->page); + ClearPageUptodate(cur->page); + set_page_private(cur->page, 0); + ClearPagePrivate(cur->page); + f2fs_put_page(cur->page, 1); + + list_del(&cur->list); + kmem_cache_free(inmem_entry_slab, cur); + dec_page_count(F2FS_I_SB(inode), F2FS_INMEM_PAGES); + } +} + +void drop_inmem_pages(struct inode *inode) +{ + struct f2fs_inode_info *fi = F2FS_I(inode); + + mutex_lock(&fi->inmem_lock); + __revoke_inmem_pages(inode, &fi->inmem_pages); + mutex_unlock(&fi->inmem_lock); +} + +static int __commit_inmem_pages(struct inode *inode) { struct f2fs_sb_info *sbi = F2FS_I_SB(inode); struct f2fs_inode_info *fi = F2FS_I(inode); struct inmem_pages *cur, *tmp; - bool submit_bio = false; struct f2fs_io_info fio = { .sbi = sbi, .type = DATA, .rw = WRITE_SYNC | REQ_PRIO, .encrypted_page = NULL, }; + bool submit_bio = false; int err = 0; - /* - * The abort is true only when f2fs_evict_inode is called. - * Basically, the f2fs_evict_inode doesn't produce any data writes, so - * that we don't need to call f2fs_balance_fs. - * Otherwise, f2fs_gc in f2fs_balance_fs can wait forever until this - * inode becomes free by iget_locked in f2fs_iget. - */ - if (!abort) { - f2fs_balance_fs(sbi); - f2fs_lock_op(sbi); - } - - mutex_lock(&fi->inmem_lock); list_for_each_entry_safe(cur, tmp, &fi->inmem_pages, list) { lock_page(cur->page); - if (!abort) { - if (cur->page->mapping == inode->i_mapping) { - set_page_dirty(cur->page); - f2fs_wait_on_page_writeback(cur->page, DATA); - if (clear_page_dirty_for_io(cur->page)) - inode_dec_dirty_pages(inode); - trace_f2fs_commit_inmem_page(cur->page, INMEM); - fio.page = cur->page; - err = do_write_data_page(&fio); - if (err) { - unlock_page(cur->page); - break; - } - clear_cold_data(cur->page); - submit_bio = true; + if (cur->page->mapping == inode->i_mapping) { + set_page_dirty(cur->page); + f2fs_wait_on_page_writeback(cur->page, DATA); + if (clear_page_dirty_for_io(cur->page)) + inode_dec_dirty_pages(inode); + trace_f2fs_commit_inmem_page(cur->page, INMEM); + fio.page = cur->page; + err = do_write_data_page(&fio); + if (err) { + unlock_page(cur->page); + break; } - } else { - ClearPageUptodate(cur->page); - trace_f2fs_commit_inmem_page(cur->page, INMEM_DROP); + clear_cold_data(cur->page); + submit_bio = true; } + set_page_private(cur->page, 0); ClearPagePrivate(cur->page); f2fs_put_page(cur->page, 1); @@ -248,13 +260,26 @@ int commit_inmem_pages(struct inode *inode, bool abort) kmem_cache_free(inmem_entry_slab, cur); dec_page_count(F2FS_I_SB(inode), F2FS_INMEM_PAGES); } + + if (submit_bio) + f2fs_submit_merged_bio(sbi, DATA, WRITE); + return err; +} + +int commit_inmem_pages(struct inode *inode) +{ + struct f2fs_sb_info *sbi = F2FS_I_SB(inode); + struct f2fs_inode_info *fi = F2FS_I(inode); + int err = 0; + + f2fs_balance_fs(sbi); + f2fs_lock_op(sbi); + + mutex_lock(&fi->inmem_lock); + err = __commit_inmem_pages(inode); mutex_unlock(&fi->inmem_lock); - if (!abort) { - f2fs_unlock_op(sbi); - if (submit_bio) - f2fs_submit_merged_bio(sbi, DATA, WRITE); - } + f2fs_unlock_op(sbi); return err; } diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 4a2e51e..f474355 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -474,7 +474,7 @@ static int f2fs_drop_inode(struct inode *inode) /* some remained atomic pages should discarded */ if (f2fs_is_atomic_file(inode)) - commit_inmem_pages(inode, true); + drop_inmem_pages(inode); /* should remain fi->extent_tree for writepage */ f2fs_destroy_extent_node(inode); -- 2.6.3