From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755231AbbCSL2u (ORCPT ); Thu, 19 Mar 2015 07:28:50 -0400 Received: from mailout2.samsung.com ([203.254.224.25]:37302 "EHLO mailout2.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755148AbbCSL2q (ORCPT ); Thu, 19 Mar 2015 07:28:46 -0400 X-AuditID: cbfee61b-f79d76d0000024d6-24-550ab2edbdc8 From: Chao Yu To: Jaegeuk Kim , Changman Lee Cc: linux-f2fs-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org Subject: [PATCH 4/4] f2fs: preserve extent info for extent cache Date: Thu, 19 Mar 2015 19:27:51 +0800 Message-id: <000301d06237$dd05c2d0$97114870$@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: AdBh9GE903cI7DptQG+8Q0MirQzrAQ== Content-language: zh-cn X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrMLMWRmVeSWpSXmKPExsVy+t9jAd23m7hCDd7dk7G4tq+RyeLJ+lnM FpcWuVtc3jWHzYHFY9OqTjaP3Qs+M3n0bVnF6PF5k1wASxSXTUpqTmZZapG+XQJXxuNtj9gK /klWfGg9xNLAuEC0i5GTQ0LAROJu8ws2CFtM4sK99UA2F4eQwCJGiSNNH5kgnB+MEnvWnWAC qWITUJFY3vEfzBYR8JKYtP8EC4jNLOAh0djxnRXEFhZwkNjY0McMYrMIqEpseX6aEcTmFbCU uHZ6FguELSjxY/I9qF4tifU7jzNB2PISm9e8ZYa4SEFix9nXjBC79CTebb7LDlEjLrHxyC2W CYwCs5CMmoVk1Cwko2YhaVnAyLKKUTS1ILmgOCk910ivODG3uDQvXS85P3cTIzion0nvYFzV YHGIUYCDUYmHN8OdK1SINbGsuDL3EKMEB7OSCO/pMqAQb0piZVVqUX58UWlOavEhRmkOFiVx XiX7thAhgfTEktTs1NSC1CKYLBMHp1QDY1/V5dshJ5sL4n4q9RsoKJ26Exun/oKJXyJqdafh 3b7E7a+s5b7wTr/ysP/UYoOTIrX3VB123JW97HDlPcP59OkT767PaVr66cfjL8yXRJ5q8+zz m33p+5qD2jmLby48OW9lhgh3vPKuJr3cacWT3H6lt9qpMj7x5j/8fvLzNtU1ymcWTlSqK1di Kc5INNRiLipOBABPPiQ8ZgIAAA== Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch tries to preserve last extent info in extent tree cache into on-disk inode, so this can help us to reuse the last extent info next time for performance. Signed-off-by: Chao Yu --- fs/f2fs/data.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ fs/f2fs/f2fs.h | 8 ++++++++ fs/f2fs/inode.c | 5 +++++ 3 files changed, 62 insertions(+) diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 0c48af91..e761540 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -718,6 +718,55 @@ update_extent: atomic_dec(&et->refcount); } +void f2fs_preserve_extent_tree(struct inode *inode) +{ + struct extent_tree *et; + struct extent_info *ext = &F2FS_I(inode)->ext; + bool sync = false; + + if (!test_opt(F2FS_I_SB(inode), EXTENT_CACHE)) + return; + + et = __find_extent_tree(F2FS_I_SB(inode), inode->i_ino); + if (!et) { + if (ext->len) { + ext->len = 0; + update_inode_page(inode); + } + return; + } + + read_lock(&et->lock); + if (et->count) { + struct extent_node *en; + + if (et->cached_en) { + en = et->cached_en; + } else { + struct rb_node *node = rb_first(&et->root); + + if (!node) + node = rb_last(&et->root); + en = rb_entry(node, struct extent_node, rb_node); + } + + if (__is_extent_same(ext, &en->ei)) + goto out; + + *ext = en->ei; + sync = true; + } else if (ext->len) { + ext->len = 0; + sync = true; + } +out: + read_unlock(&et->lock); + atomic_dec(&et->refcount); + + if (sync) + update_inode_page(inode); +} + void f2fs_shrink_extent_tree(struct f2fs_sb_info *sbi, int nr_shrink) { struct extent_tree *treevec[EXT_TREE_VEC_SIZE]; diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 836e5a9..9b0c75f 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -362,6 +362,13 @@ static inline void set_extent_info(struct extent_info *ei, unsigned int fofs, ei->len = len; } +static inline bool __is_extent_same(struct extent_info *ei1, + struct extent_info *ei2) +{ + return (ei1->fofs == ei2->fofs && ei1->blk == ei2->blk && + ei1->len == ei2->len); +} + static inline bool __is_extent_mergeable(struct extent_info *back, struct extent_info *front) { @@ -1579,6 +1586,7 @@ void f2fs_shrink_extent_tree(struct f2fs_sb_info *, int); void f2fs_destroy_extent_tree(struct inode *); void f2fs_init_extent_cache(struct inode *, struct f2fs_extent *); void f2fs_update_extent_cache(struct dnode_of_data *); +void f2fs_preserve_extent_tree(struct inode *); struct page *find_data_page(struct inode *, pgoff_t, bool); struct page *get_lock_data_page(struct inode *, pgoff_t); struct page *get_new_data_page(struct inode *, struct page *, pgoff_t, bool); diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index fcd1e7b..599d328 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c @@ -333,7 +333,12 @@ void f2fs_evict_inode(struct inode *inode) no_delete: stat_dec_inline_dir(inode); stat_dec_inline_inode(inode); + + /* update extent info in inode */ + if (inode->i_nlink) + f2fs_preserve_extent_tree(inode); f2fs_destroy_extent_tree(inode); + invalidate_mapping_pages(NODE_MAPPING(sbi), inode->i_ino, inode->i_ino); if (xnid) invalidate_mapping_pages(NODE_MAPPING(sbi), xnid, xnid); -- 2.3.1