diff options
Diffstat (limited to 'fs/f2fs/node.c')
| -rw-r--r-- | fs/f2fs/node.c | 27 |
1 files changed, 11 insertions, 16 deletions
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index ef80f791b02b..4fa3fd5def34 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c | |||
| @@ -1296,23 +1296,18 @@ static int add_free_nid(struct f2fs_nm_info *nm_i, nid_t nid, bool build) | |||
| 1296 | if (nid == 0) | 1296 | if (nid == 0) |
| 1297 | return 0; | 1297 | return 0; |
| 1298 | 1298 | ||
| 1299 | if (!build) | 1299 | if (build) { |
| 1300 | goto retry; | 1300 | /* do not add allocated nids */ |
| 1301 | 1301 | read_lock(&nm_i->nat_tree_lock); | |
| 1302 | /* do not add allocated nids */ | 1302 | ne = __lookup_nat_cache(nm_i, nid); |
| 1303 | read_lock(&nm_i->nat_tree_lock); | 1303 | if (ne && nat_get_blkaddr(ne) != NULL_ADDR) |
| 1304 | ne = __lookup_nat_cache(nm_i, nid); | 1304 | allocated = true; |
| 1305 | if (ne && nat_get_blkaddr(ne) != NULL_ADDR) | 1305 | read_unlock(&nm_i->nat_tree_lock); |
| 1306 | allocated = true; | 1306 | if (allocated) |
| 1307 | read_unlock(&nm_i->nat_tree_lock); | 1307 | return 0; |
| 1308 | if (allocated) | ||
| 1309 | return 0; | ||
| 1310 | retry: | ||
| 1311 | i = kmem_cache_alloc(free_nid_slab, GFP_NOFS); | ||
| 1312 | if (!i) { | ||
| 1313 | cond_resched(); | ||
| 1314 | goto retry; | ||
| 1315 | } | 1308 | } |
| 1309 | |||
| 1310 | i = f2fs_kmem_cache_alloc(free_nid_slab, GFP_NOFS); | ||
| 1316 | i->nid = nid; | 1311 | i->nid = nid; |
| 1317 | i->state = NID_NEW; | 1312 | i->state = NID_NEW; |
| 1318 | 1313 | ||
