From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754355AbbCSLZt (ORCPT ); Thu, 19 Mar 2015 07:25:49 -0400 Received: from mailout4.samsung.com ([203.254.224.34]:63141 "EHLO mailout4.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753487AbbCSLZo (ORCPT ); Thu, 19 Mar 2015 07:25:44 -0400 X-AuditID: cbfee61a-f79c06d000004e71-3c-550ab236505a From: Chao Yu To: Jaegeuk Kim , Changman Lee Cc: linux-f2fs-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org Subject: [PATCH 2/4] f2fs: introduce __{find,grab}_extent_tree Date: Thu, 19 Mar 2015 19:24:59 +0800 Message-id: <000101d06237$702d3a80$5087af80$@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: AdBh86u0l4dKQe+7QNCvIOJLjUe3LQ== Content-language: zh-cn X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrMLMWRmVeSWpSXmKPExsVy+t9jQV2zTVyhBlvuWVpc29fIZPFk/Sxm i0uL3C0u75rD5sDisWlVJ5vH7gWfmTz6tqxi9Pi8SS6AJYrLJiU1J7MstUjfLoEr48yufywF U+Uq1j27yNjA2CXZxcjJISFgIrHpySc2CFtM4sK99UA2F4eQwHRGiZnnO1ggnB+MEi2ztjKB VLEJqEgs7/gPZosIeElM2n+CBcRmFvCQaOz4zgpiCwvYSaxY3A02lUVAVeJ1/26wel4BS4kr zzexQtiCEj8m34Pq1ZJYv/M4E4QtL7F5zVtmiIsUJHacfc0IsUtPorN5GSNEjbjExiO3WCYw CsxCMmoWklGzkIyahaRlASPLKkbR1ILkguKk9FxDveLE3OLSvHS95PzcTYzgoH4mtYNxZYPF IUYBDkYlHt4Md65QIdbEsuLK3EOMEhzMSiK8p8uAQrwpiZVVqUX58UWlOanFhxilOViUxHmV 7NtChATSE0tSs1NTC1KLYLJMHJxSDYzxLCftIsXP7bo/p2HVnm1hwT9VZaOfae1IElVp3zVJ +L/Kd/HHVtGHW6Z4FWfO7WdjO6C5VfFYcYw2E+cG6Va/I8nm+jmuD04XJCW0bdkWyS978v7Z z4+TRDq876lV7jE88/LQvc46W+7XbBbtH1e/sVUqyP5v13Pl8fRcd/OPXm11W/f4pCixFGck GmoxFxUnAgC5IzfhZgIAAA== Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch introduces __{find,grab}_extent_tree for reusing by following patches. Signed-off-by: Chao Yu --- fs/f2fs/data.c | 79 +++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 48 insertions(+), 31 deletions(-) diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index edeba35..a73df90 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -393,6 +393,49 @@ static void __detach_extent_node(struct f2fs_sb_info *sbi, et->cached_en = NULL; } +static struct extent_tree *__find_extent_tree(struct f2fs_sb_info *sbi, + nid_t ino) +{ + struct extent_tree *et; + + down_read(&sbi->extent_tree_lock); + et = radix_tree_lookup(&sbi->extent_tree_root, ino); + if (!et) { + up_read(&sbi->extent_tree_lock); + return NULL; + } + atomic_inc(&et->refcount); + up_read(&sbi->extent_tree_lock); + + return et; +} + +static struct extent_tree *__grab_extent_tree(struct inode *inode) +{ + struct f2fs_sb_info *sbi = F2FS_I_SB(inode); + struct extent_tree *et; + nid_t ino = inode->i_ino; + + down_write(&sbi->extent_tree_lock); + et = radix_tree_lookup(&sbi->extent_tree_root, ino); + if (!et) { + et = f2fs_kmem_cache_alloc(extent_tree_slab, GFP_NOFS); + f2fs_radix_tree_insert(&sbi->extent_tree_root, ino, et); + memset(et, 0, sizeof(struct extent_tree)); + et->ino = ino; + et->root = RB_ROOT; + et->cached_en = NULL; + rwlock_init(&et->lock); + atomic_set(&et->refcount, 0); + et->count = 0; + sbi->total_ext_tree++; + } + atomic_inc(&et->refcount); + up_write(&sbi->extent_tree_lock); + + return et; +} + static struct extent_node *__lookup_extent_tree(struct extent_tree *et, unsigned int fofs) { @@ -537,14 +580,9 @@ static bool f2fs_lookup_extent_tree(struct inode *inode, pgoff_t pgofs, trace_f2fs_lookup_extent_tree_start(inode, pgofs); - down_read(&sbi->extent_tree_lock); - et = radix_tree_lookup(&sbi->extent_tree_root, inode->i_ino); - if (!et) { - up_read(&sbi->extent_tree_lock); + et = __find_extent_tree(sbi, inode->i_ino); + if (!et) return false; - } - atomic_inc(&et->refcount); - up_read(&sbi->extent_tree_lock); read_lock(&et->lock); en = __lookup_extent_tree(et, pgofs); @@ -569,7 +607,6 @@ static void f2fs_update_extent_tree(struct inode *inode, pgoff_t fofs, block_t blkaddr) { struct f2fs_sb_info *sbi = F2FS_I_SB(inode); - nid_t ino = inode->i_ino; struct extent_tree *et; struct extent_node *en = NULL, *en1 = NULL, *en2 = NULL, *en3 = NULL; struct extent_node *den = NULL; @@ -578,22 +615,7 @@ static void f2fs_update_extent_tree(struct inode *inode, pgoff_t fofs, trace_f2fs_update_extent_tree(inode, fofs, blkaddr); - down_write(&sbi->extent_tree_lock); - et = radix_tree_lookup(&sbi->extent_tree_root, ino); - if (!et) { - et = f2fs_kmem_cache_alloc(extent_tree_slab, GFP_NOFS); - f2fs_radix_tree_insert(&sbi->extent_tree_root, ino, et); - memset(et, 0, sizeof(struct extent_tree)); - et->ino = ino; - et->root = RB_ROOT; - et->cached_en = NULL; - rwlock_init(&et->lock); - atomic_set(&et->refcount, 0); - et->count = 0; - sbi->total_ext_tree++; - } - atomic_inc(&et->refcount); - up_write(&sbi->extent_tree_lock); + et = __grab_extent_tree(inode); write_lock(&et->lock); @@ -731,14 +753,9 @@ void f2fs_destroy_extent_tree(struct inode *inode) if (!test_opt(sbi, EXTENT_CACHE)) return; - down_read(&sbi->extent_tree_lock); - et = radix_tree_lookup(&sbi->extent_tree_root, inode->i_ino); - if (!et) { - up_read(&sbi->extent_tree_lock); + et = __find_extent_tree(sbi, inode->i_ino); + if (!et) goto out; - } - atomic_inc(&et->refcount); - up_read(&sbi->extent_tree_lock); /* free all extent info belong to this extent tree */ write_lock(&et->lock); -- 2.3.1