diff options
author | Haicheng Li <haicheng.li@linux.intel.com> | 2013-05-06 11:15:43 -0400 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk.kim@samsung.com> | 2013-05-08 06:54:22 -0400 |
commit | 23d38844276680abbf33624f56b6779d43f53633 (patch) | |
tree | 13238b257994d31c5bc6653d4b4328e10984be83 /fs/f2fs | |
parent | 8760952d92b2fd2310fac340ff5bcdf3ada500d7 (diff) |
f2fs: optimize scan_nat_page()
When nm_i->fcnt > 2 * MAX_FREE_NIDS, stop scanning other NAT entries.
Signed-off-by: Haicheng Li <haicheng.li@linux.intel.com>
[Jaegeuk Kim: fix handling the return value of add_free_nid()]
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
Diffstat (limited to 'fs/f2fs')
-rw-r--r-- | fs/f2fs/node.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index 122200e677a4..e42934e689c5 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c | |||
@@ -1254,7 +1254,7 @@ static int add_free_nid(struct f2fs_nm_info *nm_i, nid_t nid) | |||
1254 | struct free_nid *i; | 1254 | struct free_nid *i; |
1255 | 1255 | ||
1256 | if (nm_i->fcnt > 2 * MAX_FREE_NIDS) | 1256 | if (nm_i->fcnt > 2 * MAX_FREE_NIDS) |
1257 | return 0; | 1257 | return -1; |
1258 | 1258 | ||
1259 | /* 0 nid should not be used */ | 1259 | /* 0 nid should not be used */ |
1260 | if (nid == 0) | 1260 | if (nid == 0) |
@@ -1302,12 +1302,16 @@ static void scan_nat_page(struct f2fs_nm_info *nm_i, | |||
1302 | i = start_nid % NAT_ENTRY_PER_BLOCK; | 1302 | i = start_nid % NAT_ENTRY_PER_BLOCK; |
1303 | 1303 | ||
1304 | for (; i < NAT_ENTRY_PER_BLOCK; i++, start_nid++) { | 1304 | for (; i < NAT_ENTRY_PER_BLOCK; i++, start_nid++) { |
1305 | |||
1305 | if (start_nid >= nm_i->max_nid) | 1306 | if (start_nid >= nm_i->max_nid) |
1306 | break; | 1307 | break; |
1307 | blk_addr = le32_to_cpu(nat_blk->entries[i].block_addr); | 1308 | |
1309 | blk_addr = le32_to_cpu(nat_blk->entries[i].block_addr); | ||
1308 | BUG_ON(blk_addr == NEW_ADDR); | 1310 | BUG_ON(blk_addr == NEW_ADDR); |
1309 | if (blk_addr == NULL_ADDR) | 1311 | if (blk_addr == NULL_ADDR) { |
1310 | add_free_nid(nm_i, start_nid); | 1312 | if (add_free_nid(nm_i, start_nid) < 0) |
1313 | break; | ||
1314 | } | ||
1311 | } | 1315 | } |
1312 | } | 1316 | } |
1313 | 1317 | ||
@@ -1655,7 +1659,7 @@ flush_now: | |||
1655 | } | 1659 | } |
1656 | 1660 | ||
1657 | if (nat_get_blkaddr(ne) == NULL_ADDR && | 1661 | if (nat_get_blkaddr(ne) == NULL_ADDR && |
1658 | !add_free_nid(NM_I(sbi), nid)) { | 1662 | add_free_nid(NM_I(sbi), nid) <= 0) { |
1659 | write_lock(&nm_i->nat_tree_lock); | 1663 | write_lock(&nm_i->nat_tree_lock); |
1660 | __del_from_nat_cache(nm_i, ne); | 1664 | __del_from_nat_cache(nm_i, ne); |
1661 | write_unlock(&nm_i->nat_tree_lock); | 1665 | write_unlock(&nm_i->nat_tree_lock); |