blob: 6f421e4e5021cffa19616df5ce1c6470ac490beb [file] [log] [blame]
jrior00197c0eac2015-03-09 20:50:56 -04001/*
2 * fs/f2fs/node.c
3 *
4 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 * http://www.samsung.com/
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11#include <linux/fs.h>
12#include <linux/f2fs_fs.h>
13#include <linux/mpage.h>
14#include <linux/backing-dev.h>
15#include <linux/blkdev.h>
16#include <linux/pagevec.h>
17#include <linux/swap.h>
18
19#include "f2fs.h"
20#include "node.h"
21#include "segment.h"
22#include "trace.h"
23#include <trace/events/f2fs.h>
24
25#define on_build_free_nids(nmi) mutex_is_locked(&nm_i->build_lock)
26
Matt Mower6c846322016-06-03 11:26:48 -050027#ifndef PTR_ERR_OR_ZERO
28static inline int __must_check PTR_ERR_OR_ZERO(__force const void *ptr)
29{
30 if (IS_ERR(ptr))
31 return PTR_ERR(ptr);
32 else
33 return 0;
34}
35#endif
36
jrior00197c0eac2015-03-09 20:50:56 -040037static struct kmem_cache *nat_entry_slab;
38static struct kmem_cache *free_nid_slab;
39static struct kmem_cache *nat_entry_set_slab;
40
41bool available_free_memory(struct f2fs_sb_info *sbi, int type)
42{
43 struct f2fs_nm_info *nm_i = NM_I(sbi);
44 struct sysinfo val;
45 unsigned long avail_ram;
46 unsigned long mem_size = 0;
47 bool res = false;
48
49 si_meminfo(&val);
50
51 /* only uses low memory */
52 avail_ram = val.totalram - val.totalhigh;
53
54 /*
55 * give 25%, 25%, 50%, 50%, 50% memory for each components respectively
56 */
57 if (type == FREE_NIDS) {
58 mem_size = (nm_i->fcnt * sizeof(struct free_nid)) >>
Matt Mower6c846322016-06-03 11:26:48 -050059 PAGE_SHIFT;
jrior00197c0eac2015-03-09 20:50:56 -040060 res = mem_size < ((avail_ram * nm_i->ram_thresh / 100) >> 2);
61 } else if (type == NAT_ENTRIES) {
62 mem_size = (nm_i->nat_cnt * sizeof(struct nat_entry)) >>
Matt Mower6c846322016-06-03 11:26:48 -050063 PAGE_SHIFT;
jrior00197c0eac2015-03-09 20:50:56 -040064 res = mem_size < ((avail_ram * nm_i->ram_thresh / 100) >> 2);
65 } else if (type == DIRTY_DENTS) {
66 if (sbi->sb->s_bdi->dirty_exceeded)
67 return false;
68 mem_size = get_pages(sbi, F2FS_DIRTY_DENTS);
69 res = mem_size < ((avail_ram * nm_i->ram_thresh / 100) >> 1);
70 } else if (type == INO_ENTRIES) {
71 int i;
72
73 for (i = 0; i <= UPDATE_INO; i++)
74 mem_size += (sbi->im[i].ino_num *
Matt Mower6c846322016-06-03 11:26:48 -050075 sizeof(struct ino_entry)) >> PAGE_SHIFT;
jrior00197c0eac2015-03-09 20:50:56 -040076 res = mem_size < ((avail_ram * nm_i->ram_thresh / 100) >> 1);
77 } else if (type == EXTENT_CACHE) {
Matt Mower7d1db3b2016-05-23 11:34:02 -050078 mem_size = (atomic_read(&sbi->total_ext_tree) *
79 sizeof(struct extent_tree) +
jrior00197c0eac2015-03-09 20:50:56 -040080 atomic_read(&sbi->total_ext_node) *
Matt Mower6c846322016-06-03 11:26:48 -050081 sizeof(struct extent_node)) >> PAGE_SHIFT;
jrior00197c0eac2015-03-09 20:50:56 -040082 res = mem_size < ((avail_ram * nm_i->ram_thresh / 100) >> 1);
83 } else {
Matt Mower7d1db3b2016-05-23 11:34:02 -050084 if (!sbi->sb->s_bdi->dirty_exceeded)
85 return true;
jrior00197c0eac2015-03-09 20:50:56 -040086 }
87 return res;
88}
89
90static void clear_node_page_dirty(struct page *page)
91{
92 struct address_space *mapping = page->mapping;
93 unsigned int long flags;
94
95 if (PageDirty(page)) {
96 spin_lock_irqsave(&mapping->tree_lock, flags);
97 radix_tree_tag_clear(&mapping->page_tree,
98 page_index(page),
99 PAGECACHE_TAG_DIRTY);
100 spin_unlock_irqrestore(&mapping->tree_lock, flags);
101
102 clear_page_dirty_for_io(page);
103 dec_page_count(F2FS_M_SB(mapping), F2FS_DIRTY_NODES);
104 }
105 ClearPageUptodate(page);
106}
107
108static struct page *get_current_nat_page(struct f2fs_sb_info *sbi, nid_t nid)
109{
110 pgoff_t index = current_nat_addr(sbi, nid);
111 return get_meta_page(sbi, index);
112}
113
114static struct page *get_next_nat_page(struct f2fs_sb_info *sbi, nid_t nid)
115{
116 struct page *src_page;
117 struct page *dst_page;
118 pgoff_t src_off;
119 pgoff_t dst_off;
120 void *src_addr;
121 void *dst_addr;
122 struct f2fs_nm_info *nm_i = NM_I(sbi);
123
124 src_off = current_nat_addr(sbi, nid);
125 dst_off = next_nat_addr(sbi, src_off);
126
127 /* get current nat block page with lock */
128 src_page = get_meta_page(sbi, src_off);
129 dst_page = grab_meta_page(sbi, dst_off);
130 f2fs_bug_on(sbi, PageDirty(src_page));
131
132 src_addr = page_address(src_page);
133 dst_addr = page_address(dst_page);
Matt Mower6c846322016-06-03 11:26:48 -0500134 memcpy(dst_addr, src_addr, PAGE_SIZE);
jrior00197c0eac2015-03-09 20:50:56 -0400135 set_page_dirty(dst_page);
136 f2fs_put_page(src_page, 1);
137
138 set_to_next_nat(nm_i, nid);
139
140 return dst_page;
141}
142
143static struct nat_entry *__lookup_nat_cache(struct f2fs_nm_info *nm_i, nid_t n)
144{
145 return radix_tree_lookup(&nm_i->nat_root, n);
146}
147
148static unsigned int __gang_lookup_nat_cache(struct f2fs_nm_info *nm_i,
149 nid_t start, unsigned int nr, struct nat_entry **ep)
150{
151 return radix_tree_gang_lookup(&nm_i->nat_root, (void **)ep, start, nr);
152}
153
154static void __del_from_nat_cache(struct f2fs_nm_info *nm_i, struct nat_entry *e)
155{
156 list_del(&e->list);
157 radix_tree_delete(&nm_i->nat_root, nat_get_nid(e));
158 nm_i->nat_cnt--;
159 kmem_cache_free(nat_entry_slab, e);
160}
161
162static void __set_nat_cache_dirty(struct f2fs_nm_info *nm_i,
163 struct nat_entry *ne)
164{
165 nid_t set = NAT_BLOCK_OFFSET(ne->ni.nid);
166 struct nat_entry_set *head;
167
168 if (get_nat_flag(ne, IS_DIRTY))
169 return;
170
171 head = radix_tree_lookup(&nm_i->nat_set_root, set);
172 if (!head) {
Matt Mower7d1db3b2016-05-23 11:34:02 -0500173 head = f2fs_kmem_cache_alloc(nat_entry_set_slab, GFP_NOFS);
jrior00197c0eac2015-03-09 20:50:56 -0400174
175 INIT_LIST_HEAD(&head->entry_list);
176 INIT_LIST_HEAD(&head->set_list);
177 head->set = set;
178 head->entry_cnt = 0;
179 f2fs_radix_tree_insert(&nm_i->nat_set_root, set, head);
180 }
181 list_move_tail(&ne->list, &head->entry_list);
182 nm_i->dirty_nat_cnt++;
183 head->entry_cnt++;
184 set_nat_flag(ne, IS_DIRTY, true);
185}
186
187static void __clear_nat_cache_dirty(struct f2fs_nm_info *nm_i,
188 struct nat_entry *ne)
189{
190 nid_t set = NAT_BLOCK_OFFSET(ne->ni.nid);
191 struct nat_entry_set *head;
192
193 head = radix_tree_lookup(&nm_i->nat_set_root, set);
194 if (head) {
195 list_move_tail(&ne->list, &nm_i->nat_entries);
196 set_nat_flag(ne, IS_DIRTY, false);
197 head->entry_cnt--;
198 nm_i->dirty_nat_cnt--;
199 }
200}
201
202static unsigned int __gang_lookup_nat_set(struct f2fs_nm_info *nm_i,
203 nid_t start, unsigned int nr, struct nat_entry_set **ep)
204{
205 return radix_tree_gang_lookup(&nm_i->nat_set_root, (void **)ep,
206 start, nr);
207}
208
Matt Mower7d1db3b2016-05-23 11:34:02 -0500209int need_dentry_mark(struct f2fs_sb_info *sbi, nid_t nid)
210{
211 struct f2fs_nm_info *nm_i = NM_I(sbi);
212 struct nat_entry *e;
213 bool need = false;
214
215 down_read(&nm_i->nat_tree_lock);
216 e = __lookup_nat_cache(nm_i, nid);
217 if (e) {
218 if (!get_nat_flag(e, IS_CHECKPOINTED) &&
219 !get_nat_flag(e, HAS_FSYNCED_INODE))
220 need = true;
221 }
222 up_read(&nm_i->nat_tree_lock);
223 return need;
224}
225
jrior00197c0eac2015-03-09 20:50:56 -0400226bool is_checkpointed_node(struct f2fs_sb_info *sbi, nid_t nid)
227{
228 struct f2fs_nm_info *nm_i = NM_I(sbi);
229 struct nat_entry *e;
230 bool is_cp = true;
231
232 down_read(&nm_i->nat_tree_lock);
233 e = __lookup_nat_cache(nm_i, nid);
234 if (e && !get_nat_flag(e, IS_CHECKPOINTED))
235 is_cp = false;
236 up_read(&nm_i->nat_tree_lock);
237 return is_cp;
238}
239
jrior00197c0eac2015-03-09 20:50:56 -0400240bool need_inode_block_update(struct f2fs_sb_info *sbi, nid_t ino)
241{
242 struct f2fs_nm_info *nm_i = NM_I(sbi);
243 struct nat_entry *e;
244 bool need_update = true;
245
246 down_read(&nm_i->nat_tree_lock);
247 e = __lookup_nat_cache(nm_i, ino);
248 if (e && get_nat_flag(e, HAS_LAST_FSYNC) &&
249 (get_nat_flag(e, IS_CHECKPOINTED) ||
250 get_nat_flag(e, HAS_FSYNCED_INODE)))
251 need_update = false;
252 up_read(&nm_i->nat_tree_lock);
253 return need_update;
254}
255
256static struct nat_entry *grab_nat_entry(struct f2fs_nm_info *nm_i, nid_t nid)
257{
258 struct nat_entry *new;
259
Matt Mower7d1db3b2016-05-23 11:34:02 -0500260 new = f2fs_kmem_cache_alloc(nat_entry_slab, GFP_NOFS);
jrior00197c0eac2015-03-09 20:50:56 -0400261 f2fs_radix_tree_insert(&nm_i->nat_root, nid, new);
262 memset(new, 0, sizeof(struct nat_entry));
263 nat_set_nid(new, nid);
264 nat_reset_flag(new);
265 list_add_tail(&new->list, &nm_i->nat_entries);
266 nm_i->nat_cnt++;
267 return new;
268}
269
Matt Mower7d1db3b2016-05-23 11:34:02 -0500270static void cache_nat_entry(struct f2fs_sb_info *sbi, nid_t nid,
jrior00197c0eac2015-03-09 20:50:56 -0400271 struct f2fs_nat_entry *ne)
272{
Matt Mower7d1db3b2016-05-23 11:34:02 -0500273 struct f2fs_nm_info *nm_i = NM_I(sbi);
jrior00197c0eac2015-03-09 20:50:56 -0400274 struct nat_entry *e;
275
jrior00197c0eac2015-03-09 20:50:56 -0400276 e = __lookup_nat_cache(nm_i, nid);
277 if (!e) {
278 e = grab_nat_entry(nm_i, nid);
279 node_info_from_raw_nat(&e->ni, ne);
Matt Mower7d1db3b2016-05-23 11:34:02 -0500280 } else {
281 f2fs_bug_on(sbi, nat_get_ino(e) != ne->ino ||
282 nat_get_blkaddr(e) != ne->block_addr ||
283 nat_get_version(e) != ne->version);
jrior00197c0eac2015-03-09 20:50:56 -0400284 }
jrior00197c0eac2015-03-09 20:50:56 -0400285}
286
287static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni,
288 block_t new_blkaddr, bool fsync_done)
289{
290 struct f2fs_nm_info *nm_i = NM_I(sbi);
291 struct nat_entry *e;
292
293 down_write(&nm_i->nat_tree_lock);
294 e = __lookup_nat_cache(nm_i, ni->nid);
295 if (!e) {
296 e = grab_nat_entry(nm_i, ni->nid);
297 copy_node_info(&e->ni, ni);
298 f2fs_bug_on(sbi, ni->blk_addr == NEW_ADDR);
299 } else if (new_blkaddr == NEW_ADDR) {
300 /*
301 * when nid is reallocated,
302 * previous nat entry can be remained in nat cache.
303 * So, reinitialize it with new information.
304 */
305 copy_node_info(&e->ni, ni);
306 f2fs_bug_on(sbi, ni->blk_addr != NULL_ADDR);
307 }
308
309 /* sanity check */
310 f2fs_bug_on(sbi, nat_get_blkaddr(e) != ni->blk_addr);
311 f2fs_bug_on(sbi, nat_get_blkaddr(e) == NULL_ADDR &&
312 new_blkaddr == NULL_ADDR);
313 f2fs_bug_on(sbi, nat_get_blkaddr(e) == NEW_ADDR &&
314 new_blkaddr == NEW_ADDR);
315 f2fs_bug_on(sbi, nat_get_blkaddr(e) != NEW_ADDR &&
316 nat_get_blkaddr(e) != NULL_ADDR &&
317 new_blkaddr == NEW_ADDR);
318
319 /* increment version no as node is removed */
320 if (nat_get_blkaddr(e) != NEW_ADDR && new_blkaddr == NULL_ADDR) {
321 unsigned char version = nat_get_version(e);
322 nat_set_version(e, inc_node_version(version));
Matt Mower7d1db3b2016-05-23 11:34:02 -0500323
324 /* in order to reuse the nid */
325 if (nm_i->next_scan_nid > ni->nid)
326 nm_i->next_scan_nid = ni->nid;
jrior00197c0eac2015-03-09 20:50:56 -0400327 }
328
329 /* change address */
330 nat_set_blkaddr(e, new_blkaddr);
331 if (new_blkaddr == NEW_ADDR || new_blkaddr == NULL_ADDR)
332 set_nat_flag(e, IS_CHECKPOINTED, false);
333 __set_nat_cache_dirty(nm_i, e);
334
335 /* update fsync_mark if its inode nat entry is still alive */
Matt Mower7d1db3b2016-05-23 11:34:02 -0500336 if (ni->nid != ni->ino)
337 e = __lookup_nat_cache(nm_i, ni->ino);
jrior00197c0eac2015-03-09 20:50:56 -0400338 if (e) {
339 if (fsync_done && ni->nid == ni->ino)
340 set_nat_flag(e, HAS_FSYNCED_INODE, true);
341 set_nat_flag(e, HAS_LAST_FSYNC, fsync_done);
342 }
343 up_write(&nm_i->nat_tree_lock);
344}
345
346int try_to_free_nats(struct f2fs_sb_info *sbi, int nr_shrink)
347{
348 struct f2fs_nm_info *nm_i = NM_I(sbi);
Matt Mower7d1db3b2016-05-23 11:34:02 -0500349 int nr = nr_shrink;
jrior00197c0eac2015-03-09 20:50:56 -0400350
Matt Mower7d1db3b2016-05-23 11:34:02 -0500351 if (!down_write_trylock(&nm_i->nat_tree_lock))
jrior00197c0eac2015-03-09 20:50:56 -0400352 return 0;
353
jrior00197c0eac2015-03-09 20:50:56 -0400354 while (nr_shrink && !list_empty(&nm_i->nat_entries)) {
355 struct nat_entry *ne;
356 ne = list_first_entry(&nm_i->nat_entries,
357 struct nat_entry, list);
358 __del_from_nat_cache(nm_i, ne);
359 nr_shrink--;
360 }
361 up_write(&nm_i->nat_tree_lock);
Matt Mower7d1db3b2016-05-23 11:34:02 -0500362 return nr - nr_shrink;
jrior00197c0eac2015-03-09 20:50:56 -0400363}
364
365/*
366 * This function always returns success
367 */
368void get_node_info(struct f2fs_sb_info *sbi, nid_t nid, struct node_info *ni)
369{
370 struct f2fs_nm_info *nm_i = NM_I(sbi);
371 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
Matt Mower7d1db3b2016-05-23 11:34:02 -0500372 struct f2fs_journal *journal = curseg->journal;
jrior00197c0eac2015-03-09 20:50:56 -0400373 nid_t start_nid = START_NID(nid);
374 struct f2fs_nat_block *nat_blk;
375 struct page *page = NULL;
376 struct f2fs_nat_entry ne;
377 struct nat_entry *e;
378 int i;
379
380 ni->nid = nid;
381
382 /* Check nat cache */
383 down_read(&nm_i->nat_tree_lock);
384 e = __lookup_nat_cache(nm_i, nid);
385 if (e) {
386 ni->ino = nat_get_ino(e);
387 ni->blk_addr = nat_get_blkaddr(e);
388 ni->version = nat_get_version(e);
Matt Mower7d1db3b2016-05-23 11:34:02 -0500389 up_read(&nm_i->nat_tree_lock);
jrior00197c0eac2015-03-09 20:50:56 -0400390 return;
Matt Mower7d1db3b2016-05-23 11:34:02 -0500391 }
jrior00197c0eac2015-03-09 20:50:56 -0400392
393 memset(&ne, 0, sizeof(struct f2fs_nat_entry));
394
395 /* Check current segment summary */
Matt Mower7d1db3b2016-05-23 11:34:02 -0500396 down_read(&curseg->journal_rwsem);
397 i = lookup_journal_in_cursum(journal, NAT_JOURNAL, nid, 0);
jrior00197c0eac2015-03-09 20:50:56 -0400398 if (i >= 0) {
Matt Mower7d1db3b2016-05-23 11:34:02 -0500399 ne = nat_in_journal(journal, i);
jrior00197c0eac2015-03-09 20:50:56 -0400400 node_info_from_raw_nat(ni, &ne);
401 }
Matt Mower7d1db3b2016-05-23 11:34:02 -0500402 up_read(&curseg->journal_rwsem);
jrior00197c0eac2015-03-09 20:50:56 -0400403 if (i >= 0)
404 goto cache;
405
406 /* Fill node_info from nat page */
407 page = get_current_nat_page(sbi, start_nid);
408 nat_blk = (struct f2fs_nat_block *)page_address(page);
409 ne = nat_blk->entries[nid - start_nid];
410 node_info_from_raw_nat(ni, &ne);
411 f2fs_put_page(page, 1);
412cache:
Matt Mower7d1db3b2016-05-23 11:34:02 -0500413 up_read(&nm_i->nat_tree_lock);
jrior00197c0eac2015-03-09 20:50:56 -0400414 /* cache nat entry */
Matt Mower7d1db3b2016-05-23 11:34:02 -0500415 down_write(&nm_i->nat_tree_lock);
416 cache_nat_entry(sbi, nid, &ne);
417 up_write(&nm_i->nat_tree_lock);
418}
419
Matt Mower6c846322016-06-03 11:26:48 -0500420/*
421 * readahead MAX_RA_NODE number of node pages.
422 */
423static void ra_node_pages(struct page *parent, int start, int n)
424{
425 struct f2fs_sb_info *sbi = F2FS_P_SB(parent);
426 struct blk_plug plug;
427 int i, end;
428 nid_t nid;
429
430 blk_start_plug(&plug);
431
432 /* Then, try readahead for siblings of the desired node */
433 end = start + n;
434 end = min(end, NIDS_PER_BLOCK);
435 for (i = start; i < end; i++) {
436 nid = get_nid(parent, i, false);
437 ra_node_page(sbi, nid);
438 }
439
440 blk_finish_plug(&plug);
441}
442
Matt Mower7d1db3b2016-05-23 11:34:02 -0500443pgoff_t get_next_page_offset(struct dnode_of_data *dn, pgoff_t pgofs)
444{
445 const long direct_index = ADDRS_PER_INODE(dn->inode);
446 const long direct_blks = ADDRS_PER_BLOCK;
447 const long indirect_blks = ADDRS_PER_BLOCK * NIDS_PER_BLOCK;
448 unsigned int skipped_unit = ADDRS_PER_BLOCK;
449 int cur_level = dn->cur_level;
450 int max_level = dn->max_level;
451 pgoff_t base = 0;
452
453 if (!dn->max_level)
454 return pgofs + 1;
455
456 while (max_level-- > cur_level)
457 skipped_unit *= NIDS_PER_BLOCK;
458
459 switch (dn->max_level) {
460 case 3:
461 base += 2 * indirect_blks;
462 case 2:
463 base += 2 * direct_blks;
464 case 1:
465 base += direct_index;
466 break;
467 default:
468 f2fs_bug_on(F2FS_I_SB(dn->inode), 1);
469 }
470
471 return ((pgofs - base) / skipped_unit + 1) * skipped_unit + base;
jrior00197c0eac2015-03-09 20:50:56 -0400472}
473
474/*
475 * The maximum depth is four.
476 * Offset[0] will have raw inode offset.
477 */
Matt Mower7d1db3b2016-05-23 11:34:02 -0500478static int get_node_path(struct inode *inode, long block,
jrior00197c0eac2015-03-09 20:50:56 -0400479 int offset[4], unsigned int noffset[4])
480{
Matt Mower7d1db3b2016-05-23 11:34:02 -0500481 const long direct_index = ADDRS_PER_INODE(inode);
jrior00197c0eac2015-03-09 20:50:56 -0400482 const long direct_blks = ADDRS_PER_BLOCK;
483 const long dptrs_per_blk = NIDS_PER_BLOCK;
484 const long indirect_blks = ADDRS_PER_BLOCK * NIDS_PER_BLOCK;
485 const long dindirect_blks = indirect_blks * NIDS_PER_BLOCK;
486 int n = 0;
487 int level = 0;
488
489 noffset[0] = 0;
490
491 if (block < direct_index) {
492 offset[n] = block;
493 goto got;
494 }
495 block -= direct_index;
496 if (block < direct_blks) {
497 offset[n++] = NODE_DIR1_BLOCK;
498 noffset[n] = 1;
499 offset[n] = block;
500 level = 1;
501 goto got;
502 }
503 block -= direct_blks;
504 if (block < direct_blks) {
505 offset[n++] = NODE_DIR2_BLOCK;
506 noffset[n] = 2;
507 offset[n] = block;
508 level = 1;
509 goto got;
510 }
511 block -= direct_blks;
512 if (block < indirect_blks) {
513 offset[n++] = NODE_IND1_BLOCK;
514 noffset[n] = 3;
515 offset[n++] = block / direct_blks;
516 noffset[n] = 4 + offset[n - 1];
517 offset[n] = block % direct_blks;
518 level = 2;
519 goto got;
520 }
521 block -= indirect_blks;
522 if (block < indirect_blks) {
523 offset[n++] = NODE_IND2_BLOCK;
524 noffset[n] = 4 + dptrs_per_blk;
525 offset[n++] = block / direct_blks;
526 noffset[n] = 5 + dptrs_per_blk + offset[n - 1];
527 offset[n] = block % direct_blks;
528 level = 2;
529 goto got;
530 }
531 block -= indirect_blks;
532 if (block < dindirect_blks) {
533 offset[n++] = NODE_DIND_BLOCK;
534 noffset[n] = 5 + (dptrs_per_blk * 2);
535 offset[n++] = block / indirect_blks;
536 noffset[n] = 6 + (dptrs_per_blk * 2) +
537 offset[n - 1] * (dptrs_per_blk + 1);
538 offset[n++] = (block / direct_blks) % dptrs_per_blk;
539 noffset[n] = 7 + (dptrs_per_blk * 2) +
540 offset[n - 2] * (dptrs_per_blk + 1) +
541 offset[n - 1];
542 offset[n] = block % direct_blks;
543 level = 3;
544 goto got;
545 } else {
546 BUG();
547 }
548got:
549 return level;
550}
551
552/*
553 * Caller should call f2fs_put_dnode(dn).
554 * Also, it should grab and release a rwsem by calling f2fs_lock_op() and
555 * f2fs_unlock_op() only if ro is not set RDONLY_NODE.
556 * In the case of RDONLY_NODE, we don't need to care about mutex.
557 */
558int get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int mode)
559{
560 struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
561 struct page *npage[4];
562 struct page *parent = NULL;
563 int offset[4];
564 unsigned int noffset[4];
565 nid_t nids[4];
Matt Mower7d1db3b2016-05-23 11:34:02 -0500566 int level, i = 0;
jrior00197c0eac2015-03-09 20:50:56 -0400567 int err = 0;
568
Matt Mower7d1db3b2016-05-23 11:34:02 -0500569 level = get_node_path(dn->inode, index, offset, noffset);
jrior00197c0eac2015-03-09 20:50:56 -0400570
571 nids[0] = dn->inode->i_ino;
572 npage[0] = dn->inode_page;
573
574 if (!npage[0]) {
575 npage[0] = get_node_page(sbi, nids[0]);
576 if (IS_ERR(npage[0]))
577 return PTR_ERR(npage[0]);
578 }
579
580 /* if inline_data is set, should not report any block indices */
581 if (f2fs_has_inline_data(dn->inode) && index) {
582 err = -ENOENT;
583 f2fs_put_page(npage[0], 1);
584 goto release_out;
585 }
586
587 parent = npage[0];
588 if (level != 0)
589 nids[1] = get_nid(parent, offset[0], true);
590 dn->inode_page = npage[0];
591 dn->inode_page_locked = true;
592
593 /* get indirect or direct nodes */
594 for (i = 1; i <= level; i++) {
595 bool done = false;
596
597 if (!nids[i] && mode == ALLOC_NODE) {
598 /* alloc new node */
599 if (!alloc_nid(sbi, &(nids[i]))) {
600 err = -ENOSPC;
601 goto release_pages;
602 }
603
604 dn->nid = nids[i];
605 npage[i] = new_node_page(dn, noffset[i], NULL);
606 if (IS_ERR(npage[i])) {
607 alloc_nid_failed(sbi, nids[i]);
608 err = PTR_ERR(npage[i]);
609 goto release_pages;
610 }
611
612 set_nid(parent, offset[i - 1], nids[i], i == 1);
613 alloc_nid_done(sbi, nids[i]);
614 done = true;
615 } else if (mode == LOOKUP_NODE_RA && i == level && level > 1) {
616 npage[i] = get_node_page_ra(parent, offset[i - 1]);
617 if (IS_ERR(npage[i])) {
618 err = PTR_ERR(npage[i]);
619 goto release_pages;
620 }
621 done = true;
622 }
623 if (i == 1) {
624 dn->inode_page_locked = false;
625 unlock_page(parent);
626 } else {
627 f2fs_put_page(parent, 1);
628 }
629
630 if (!done) {
631 npage[i] = get_node_page(sbi, nids[i]);
632 if (IS_ERR(npage[i])) {
633 err = PTR_ERR(npage[i]);
634 f2fs_put_page(npage[0], 0);
635 goto release_out;
636 }
637 }
638 if (i < level) {
639 parent = npage[i];
640 nids[i + 1] = get_nid(parent, offset[i], false);
641 }
642 }
643 dn->nid = nids[level];
644 dn->ofs_in_node = offset[level];
645 dn->node_page = npage[level];
646 dn->data_blkaddr = datablock_addr(dn->node_page, dn->ofs_in_node);
647 return 0;
648
649release_pages:
650 f2fs_put_page(parent, 1);
651 if (i > 1)
652 f2fs_put_page(npage[0], 0);
653release_out:
654 dn->inode_page = NULL;
655 dn->node_page = NULL;
Matt Mower7d1db3b2016-05-23 11:34:02 -0500656 if (err == -ENOENT) {
657 dn->cur_level = i;
658 dn->max_level = level;
659 }
jrior00197c0eac2015-03-09 20:50:56 -0400660 return err;
661}
662
663static void truncate_node(struct dnode_of_data *dn)
664{
665 struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
666 struct node_info ni;
667
668 get_node_info(sbi, dn->nid, &ni);
669 if (dn->inode->i_blocks == 0) {
670 f2fs_bug_on(sbi, ni.blk_addr != NULL_ADDR);
671 goto invalidate;
672 }
673 f2fs_bug_on(sbi, ni.blk_addr == NULL_ADDR);
674
675 /* Deallocate node address */
676 invalidate_blocks(sbi, ni.blk_addr);
677 dec_valid_node_count(sbi, dn->inode);
678 set_node_addr(sbi, &ni, NULL_ADDR, false);
679
680 if (dn->nid == dn->inode->i_ino) {
681 remove_orphan_inode(sbi, dn->nid);
682 dec_valid_inode_count(sbi);
683 } else {
684 sync_inode_page(dn);
685 }
686invalidate:
687 clear_node_page_dirty(dn->node_page);
688 set_sbi_flag(sbi, SBI_IS_DIRTY);
689
690 f2fs_put_page(dn->node_page, 1);
691
692 invalidate_mapping_pages(NODE_MAPPING(sbi),
693 dn->node_page->index, dn->node_page->index);
694
695 dn->node_page = NULL;
696 trace_f2fs_truncate_node(dn->inode, dn->nid, ni.blk_addr);
697}
698
699static int truncate_dnode(struct dnode_of_data *dn)
700{
701 struct page *page;
702
703 if (dn->nid == 0)
704 return 1;
705
706 /* get direct node */
707 page = get_node_page(F2FS_I_SB(dn->inode), dn->nid);
708 if (IS_ERR(page) && PTR_ERR(page) == -ENOENT)
709 return 1;
710 else if (IS_ERR(page))
711 return PTR_ERR(page);
712
713 /* Make dnode_of_data for parameter */
714 dn->node_page = page;
715 dn->ofs_in_node = 0;
716 truncate_data_blocks(dn);
717 truncate_node(dn);
718 return 1;
719}
720
721static int truncate_nodes(struct dnode_of_data *dn, unsigned int nofs,
722 int ofs, int depth)
723{
724 struct dnode_of_data rdn = *dn;
725 struct page *page;
726 struct f2fs_node *rn;
727 nid_t child_nid;
728 unsigned int child_nofs;
729 int freed = 0;
730 int i, ret;
731
732 if (dn->nid == 0)
733 return NIDS_PER_BLOCK + 1;
734
735 trace_f2fs_truncate_nodes_enter(dn->inode, dn->nid, dn->data_blkaddr);
736
737 page = get_node_page(F2FS_I_SB(dn->inode), dn->nid);
738 if (IS_ERR(page)) {
739 trace_f2fs_truncate_nodes_exit(dn->inode, PTR_ERR(page));
740 return PTR_ERR(page);
741 }
742
Matt Mower6c846322016-06-03 11:26:48 -0500743 ra_node_pages(page, ofs, NIDS_PER_BLOCK);
744
jrior00197c0eac2015-03-09 20:50:56 -0400745 rn = F2FS_NODE(page);
746 if (depth < 3) {
747 for (i = ofs; i < NIDS_PER_BLOCK; i++, freed++) {
748 child_nid = le32_to_cpu(rn->in.nid[i]);
749 if (child_nid == 0)
750 continue;
751 rdn.nid = child_nid;
752 ret = truncate_dnode(&rdn);
753 if (ret < 0)
754 goto out_err;
Matt Mower7d1db3b2016-05-23 11:34:02 -0500755 if (set_nid(page, i, 0, false))
756 dn->node_changed = true;
jrior00197c0eac2015-03-09 20:50:56 -0400757 }
758 } else {
759 child_nofs = nofs + ofs * (NIDS_PER_BLOCK + 1) + 1;
760 for (i = ofs; i < NIDS_PER_BLOCK; i++) {
761 child_nid = le32_to_cpu(rn->in.nid[i]);
762 if (child_nid == 0) {
763 child_nofs += NIDS_PER_BLOCK + 1;
764 continue;
765 }
766 rdn.nid = child_nid;
767 ret = truncate_nodes(&rdn, child_nofs, 0, depth - 1);
768 if (ret == (NIDS_PER_BLOCK + 1)) {
Matt Mower7d1db3b2016-05-23 11:34:02 -0500769 if (set_nid(page, i, 0, false))
770 dn->node_changed = true;
jrior00197c0eac2015-03-09 20:50:56 -0400771 child_nofs += ret;
772 } else if (ret < 0 && ret != -ENOENT) {
773 goto out_err;
774 }
775 }
776 freed = child_nofs;
777 }
778
779 if (!ofs) {
780 /* remove current indirect node */
781 dn->node_page = page;
782 truncate_node(dn);
783 freed++;
784 } else {
785 f2fs_put_page(page, 1);
786 }
787 trace_f2fs_truncate_nodes_exit(dn->inode, freed);
788 return freed;
789
790out_err:
791 f2fs_put_page(page, 1);
792 trace_f2fs_truncate_nodes_exit(dn->inode, ret);
793 return ret;
794}
795
796static int truncate_partial_nodes(struct dnode_of_data *dn,
797 struct f2fs_inode *ri, int *offset, int depth)
798{
799 struct page *pages[2];
800 nid_t nid[3];
801 nid_t child_nid;
802 int err = 0;
803 int i;
804 int idx = depth - 2;
805
806 nid[0] = le32_to_cpu(ri->i_nid[offset[0] - NODE_DIR1_BLOCK]);
807 if (!nid[0])
808 return 0;
809
810 /* get indirect nodes in the path */
811 for (i = 0; i < idx + 1; i++) {
812 /* reference count'll be increased */
813 pages[i] = get_node_page(F2FS_I_SB(dn->inode), nid[i]);
814 if (IS_ERR(pages[i])) {
815 err = PTR_ERR(pages[i]);
816 idx = i - 1;
817 goto fail;
818 }
819 nid[i + 1] = get_nid(pages[i], offset[i + 1], false);
820 }
821
Matt Mower6c846322016-06-03 11:26:48 -0500822 ra_node_pages(pages[idx], offset[idx + 1], NIDS_PER_BLOCK);
823
jrior00197c0eac2015-03-09 20:50:56 -0400824 /* free direct nodes linked to a partial indirect node */
825 for (i = offset[idx + 1]; i < NIDS_PER_BLOCK; i++) {
826 child_nid = get_nid(pages[idx], i, false);
827 if (!child_nid)
828 continue;
829 dn->nid = child_nid;
830 err = truncate_dnode(dn);
831 if (err < 0)
832 goto fail;
Matt Mower7d1db3b2016-05-23 11:34:02 -0500833 if (set_nid(pages[idx], i, 0, false))
834 dn->node_changed = true;
jrior00197c0eac2015-03-09 20:50:56 -0400835 }
836
837 if (offset[idx + 1] == 0) {
838 dn->node_page = pages[idx];
839 dn->nid = nid[idx];
840 truncate_node(dn);
841 } else {
842 f2fs_put_page(pages[idx], 1);
843 }
844 offset[idx]++;
845 offset[idx + 1] = 0;
846 idx--;
847fail:
848 for (i = idx; i >= 0; i--)
849 f2fs_put_page(pages[i], 1);
850
851 trace_f2fs_truncate_partial_nodes(dn->inode, nid, depth, err);
852
853 return err;
854}
855
856/*
857 * All the block addresses of data and nodes should be nullified.
858 */
859int truncate_inode_blocks(struct inode *inode, pgoff_t from)
860{
861 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
862 int err = 0, cont = 1;
863 int level, offset[4], noffset[4];
864 unsigned int nofs = 0;
865 struct f2fs_inode *ri;
866 struct dnode_of_data dn;
867 struct page *page;
868
869 trace_f2fs_truncate_inode_blocks_enter(inode, from);
870
Matt Mower7d1db3b2016-05-23 11:34:02 -0500871 level = get_node_path(inode, from, offset, noffset);
Matt Mower6c846322016-06-03 11:26:48 -0500872
jrior00197c0eac2015-03-09 20:50:56 -0400873 page = get_node_page(sbi, inode->i_ino);
874 if (IS_ERR(page)) {
875 trace_f2fs_truncate_inode_blocks_exit(inode, PTR_ERR(page));
876 return PTR_ERR(page);
877 }
878
879 set_new_dnode(&dn, inode, page, NULL, 0);
880 unlock_page(page);
881
882 ri = F2FS_INODE(page);
883 switch (level) {
884 case 0:
885 case 1:
886 nofs = noffset[1];
887 break;
888 case 2:
889 nofs = noffset[1];
890 if (!offset[level - 1])
891 goto skip_partial;
892 err = truncate_partial_nodes(&dn, ri, offset, level);
893 if (err < 0 && err != -ENOENT)
894 goto fail;
895 nofs += 1 + NIDS_PER_BLOCK;
896 break;
897 case 3:
898 nofs = 5 + 2 * NIDS_PER_BLOCK;
899 if (!offset[level - 1])
900 goto skip_partial;
901 err = truncate_partial_nodes(&dn, ri, offset, level);
902 if (err < 0 && err != -ENOENT)
903 goto fail;
904 break;
905 default:
906 BUG();
907 }
908
909skip_partial:
910 while (cont) {
911 dn.nid = le32_to_cpu(ri->i_nid[offset[0] - NODE_DIR1_BLOCK]);
912 switch (offset[0]) {
913 case NODE_DIR1_BLOCK:
914 case NODE_DIR2_BLOCK:
915 err = truncate_dnode(&dn);
916 break;
917
918 case NODE_IND1_BLOCK:
919 case NODE_IND2_BLOCK:
920 err = truncate_nodes(&dn, nofs, offset[1], 2);
921 break;
922
923 case NODE_DIND_BLOCK:
924 err = truncate_nodes(&dn, nofs, offset[1], 3);
925 cont = 0;
926 break;
927
928 default:
929 BUG();
930 }
931 if (err < 0 && err != -ENOENT)
932 goto fail;
933 if (offset[1] == 0 &&
934 ri->i_nid[offset[0] - NODE_DIR1_BLOCK]) {
935 lock_page(page);
Matt Mower6c846322016-06-03 11:26:48 -0500936 BUG_ON(page->mapping != NODE_MAPPING(sbi));
Matt Mower7d1db3b2016-05-23 11:34:02 -0500937 f2fs_wait_on_page_writeback(page, NODE, true);
jrior00197c0eac2015-03-09 20:50:56 -0400938 ri->i_nid[offset[0] - NODE_DIR1_BLOCK] = 0;
939 set_page_dirty(page);
940 unlock_page(page);
941 }
942 offset[1] = 0;
943 offset[0]++;
944 nofs += err;
945 }
946fail:
947 f2fs_put_page(page, 0);
948 trace_f2fs_truncate_inode_blocks_exit(inode, err);
949 return err > 0 ? 0 : err;
950}
951
952int truncate_xattr_node(struct inode *inode, struct page *page)
953{
954 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
955 nid_t nid = F2FS_I(inode)->i_xattr_nid;
956 struct dnode_of_data dn;
957 struct page *npage;
958
959 if (!nid)
960 return 0;
961
962 npage = get_node_page(sbi, nid);
963 if (IS_ERR(npage))
964 return PTR_ERR(npage);
965
966 F2FS_I(inode)->i_xattr_nid = 0;
967
968 /* need to do checkpoint during fsync */
969 F2FS_I(inode)->xattr_ver = cur_cp_version(F2FS_CKPT(sbi));
970
971 set_new_dnode(&dn, inode, page, npage, nid);
972
973 if (page)
974 dn.inode_page_locked = true;
975 truncate_node(&dn);
976 return 0;
977}
978
979/*
980 * Caller should grab and release a rwsem by calling f2fs_lock_op() and
981 * f2fs_unlock_op().
982 */
Matt Mower7d1db3b2016-05-23 11:34:02 -0500983int remove_inode_page(struct inode *inode)
jrior00197c0eac2015-03-09 20:50:56 -0400984{
985 struct dnode_of_data dn;
Matt Mower7d1db3b2016-05-23 11:34:02 -0500986 int err;
jrior00197c0eac2015-03-09 20:50:56 -0400987
988 set_new_dnode(&dn, inode, NULL, NULL, inode->i_ino);
Matt Mower7d1db3b2016-05-23 11:34:02 -0500989 err = get_dnode_of_data(&dn, 0, LOOKUP_NODE);
990 if (err)
991 return err;
jrior00197c0eac2015-03-09 20:50:56 -0400992
Matt Mower7d1db3b2016-05-23 11:34:02 -0500993 err = truncate_xattr_node(inode, dn.inode_page);
994 if (err) {
jrior00197c0eac2015-03-09 20:50:56 -0400995 f2fs_put_dnode(&dn);
Matt Mower7d1db3b2016-05-23 11:34:02 -0500996 return err;
jrior00197c0eac2015-03-09 20:50:56 -0400997 }
998
999 /* remove potential inline_data blocks */
1000 if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
1001 S_ISLNK(inode->i_mode))
1002 truncate_data_blocks_range(&dn, 1);
1003
1004 /* 0 is possible, after f2fs_new_inode() has failed */
1005 f2fs_bug_on(F2FS_I_SB(inode),
1006 inode->i_blocks != 0 && inode->i_blocks != 1);
1007
1008 /* will put inode & node pages */
1009 truncate_node(&dn);
Matt Mower7d1db3b2016-05-23 11:34:02 -05001010 return 0;
jrior00197c0eac2015-03-09 20:50:56 -04001011}
1012
1013struct page *new_inode_page(struct inode *inode)
1014{
1015 struct dnode_of_data dn;
1016
1017 /* allocate inode page for new inode */
1018 set_new_dnode(&dn, inode, NULL, NULL, inode->i_ino);
1019
1020 /* caller should f2fs_put_page(page, 1); */
1021 return new_node_page(&dn, 0, NULL);
1022}
1023
1024struct page *new_node_page(struct dnode_of_data *dn,
1025 unsigned int ofs, struct page *ipage)
1026{
1027 struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
1028 struct node_info old_ni, new_ni;
1029 struct page *page;
1030 int err;
1031
1032 if (unlikely(is_inode_flag_set(F2FS_I(dn->inode), FI_NO_ALLOC)))
1033 return ERR_PTR(-EPERM);
1034
Matt Mower6c846322016-06-03 11:26:48 -05001035 page = f2fs_grab_cache_page(NODE_MAPPING(sbi), dn->nid, false);
jrior00197c0eac2015-03-09 20:50:56 -04001036 if (!page)
1037 return ERR_PTR(-ENOMEM);
1038
1039 if (unlikely(!inc_valid_node_count(sbi, dn->inode))) {
1040 err = -ENOSPC;
1041 goto fail;
1042 }
1043
1044 get_node_info(sbi, dn->nid, &old_ni);
1045
1046 /* Reinitialize old_ni with new node page */
1047 f2fs_bug_on(sbi, old_ni.blk_addr != NULL_ADDR);
1048 new_ni = old_ni;
1049 new_ni.ino = dn->inode->i_ino;
1050 set_node_addr(sbi, &new_ni, NEW_ADDR, false);
1051
Matt Mower7d1db3b2016-05-23 11:34:02 -05001052 f2fs_wait_on_page_writeback(page, NODE, true);
jrior00197c0eac2015-03-09 20:50:56 -04001053 fill_node_footer(page, dn->nid, dn->inode->i_ino, ofs, true);
1054 set_cold_node(dn->inode, page);
1055 SetPageUptodate(page);
Matt Mower7d1db3b2016-05-23 11:34:02 -05001056 if (set_page_dirty(page))
1057 dn->node_changed = true;
jrior00197c0eac2015-03-09 20:50:56 -04001058
1059 if (f2fs_has_xattr_block(ofs))
1060 F2FS_I(dn->inode)->i_xattr_nid = dn->nid;
1061
1062 dn->node_page = page;
1063 if (ipage)
1064 update_inode(dn->inode, ipage);
1065 else
1066 sync_inode_page(dn);
1067 if (ofs == 0)
1068 inc_valid_inode_count(sbi);
1069
1070 return page;
1071
1072fail:
1073 clear_node_page_dirty(page);
1074 f2fs_put_page(page, 1);
1075 return ERR_PTR(err);
1076}
1077
1078/*
1079 * Caller should do after getting the following values.
1080 * 0: f2fs_put_page(page, 0)
Matt Mower7d1db3b2016-05-23 11:34:02 -05001081 * LOCKED_PAGE or error: f2fs_put_page(page, 1)
jrior00197c0eac2015-03-09 20:50:56 -04001082 */
1083static int read_node_page(struct page *page, int rw)
1084{
1085 struct f2fs_sb_info *sbi = F2FS_P_SB(page);
1086 struct node_info ni;
1087 struct f2fs_io_info fio = {
Matt Mower7d1db3b2016-05-23 11:34:02 -05001088 .sbi = sbi,
jrior00197c0eac2015-03-09 20:50:56 -04001089 .type = NODE,
1090 .rw = rw,
Matt Mower7d1db3b2016-05-23 11:34:02 -05001091 .page = page,
1092 .encrypted_page = NULL,
jrior00197c0eac2015-03-09 20:50:56 -04001093 };
1094
1095 get_node_info(sbi, page->index, &ni);
1096
1097 if (unlikely(ni.blk_addr == NULL_ADDR)) {
1098 ClearPageUptodate(page);
jrior00197c0eac2015-03-09 20:50:56 -04001099 return -ENOENT;
1100 }
1101
1102 if (PageUptodate(page))
1103 return LOCKED_PAGE;
1104
Matt Mower7d1db3b2016-05-23 11:34:02 -05001105 fio.new_blkaddr = fio.old_blkaddr = ni.blk_addr;
1106 return f2fs_submit_page_bio(&fio);
jrior00197c0eac2015-03-09 20:50:56 -04001107}
1108
1109/*
1110 * Readahead a node page
1111 */
1112void ra_node_page(struct f2fs_sb_info *sbi, nid_t nid)
1113{
1114 struct page *apage;
1115 int err;
1116
Matt Mower7d1db3b2016-05-23 11:34:02 -05001117 if (!nid)
jrior00197c0eac2015-03-09 20:50:56 -04001118 return;
Matt Mower7d1db3b2016-05-23 11:34:02 -05001119 f2fs_bug_on(sbi, check_nid_range(sbi, nid));
1120
1121 rcu_read_lock();
1122 apage = radix_tree_lookup(&NODE_MAPPING(sbi)->page_tree, nid);
1123 rcu_read_unlock();
1124 if (apage)
1125 return;
jrior00197c0eac2015-03-09 20:50:56 -04001126
Matt Mower6c846322016-06-03 11:26:48 -05001127 apage = f2fs_grab_cache_page(NODE_MAPPING(sbi), nid, false);
jrior00197c0eac2015-03-09 20:50:56 -04001128 if (!apage)
1129 return;
1130
1131 err = read_node_page(apage, READA);
Matt Mower7d1db3b2016-05-23 11:34:02 -05001132 f2fs_put_page(apage, err ? 1 : 0);
jrior00197c0eac2015-03-09 20:50:56 -04001133}
1134
Matt Mower7d1db3b2016-05-23 11:34:02 -05001135static struct page *__get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid,
1136 struct page *parent, int start)
1137{
1138 struct page *page;
1139 int err;
1140
1141 if (!nid)
1142 return ERR_PTR(-ENOENT);
1143 f2fs_bug_on(sbi, check_nid_range(sbi, nid));
1144repeat:
Matt Mower6c846322016-06-03 11:26:48 -05001145 page = f2fs_grab_cache_page(NODE_MAPPING(sbi), nid, false);
Matt Mower7d1db3b2016-05-23 11:34:02 -05001146 if (!page)
1147 return ERR_PTR(-ENOMEM);
1148
1149 err = read_node_page(page, READ_SYNC);
1150 if (err < 0) {
1151 f2fs_put_page(page, 1);
1152 return ERR_PTR(err);
1153 } else if (err == LOCKED_PAGE) {
1154 goto page_hit;
1155 }
1156
1157 if (parent)
Matt Mower6c846322016-06-03 11:26:48 -05001158 ra_node_pages(parent, start + 1, MAX_RA_NODE);
jrior00197c0eac2015-03-09 20:50:56 -04001159
1160 lock_page(page);
Matt Mower7d1db3b2016-05-23 11:34:02 -05001161
1162 if (unlikely(!PageUptodate(page))) {
1163 f2fs_put_page(page, 1);
1164 return ERR_PTR(-EIO);
1165 }
jrior00197c0eac2015-03-09 20:50:56 -04001166 if (unlikely(page->mapping != NODE_MAPPING(sbi))) {
1167 f2fs_put_page(page, 1);
1168 goto repeat;
1169 }
1170page_hit:
jrior00197c0eac2015-03-09 20:50:56 -04001171 mark_page_accessed(page);
Matt Mower7d1db3b2016-05-23 11:34:02 -05001172 f2fs_bug_on(sbi, nid != nid_of_node(page));
jrior00197c0eac2015-03-09 20:50:56 -04001173 return page;
1174}
1175
Matt Mower7d1db3b2016-05-23 11:34:02 -05001176struct page *get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid)
1177{
1178 return __get_node_page(sbi, nid, NULL, 0);
1179}
1180
1181struct page *get_node_page_ra(struct page *parent, int start)
1182{
1183 struct f2fs_sb_info *sbi = F2FS_P_SB(parent);
1184 nid_t nid = get_nid(parent, start, false);
1185
1186 return __get_node_page(sbi, nid, parent, start);
1187}
1188
jrior00197c0eac2015-03-09 20:50:56 -04001189void sync_inode_page(struct dnode_of_data *dn)
1190{
Matt Mower7d1db3b2016-05-23 11:34:02 -05001191 int ret = 0;
1192
jrior00197c0eac2015-03-09 20:50:56 -04001193 if (IS_INODE(dn->node_page) || dn->inode_page == dn->node_page) {
Matt Mower7d1db3b2016-05-23 11:34:02 -05001194 ret = update_inode(dn->inode, dn->node_page);
jrior00197c0eac2015-03-09 20:50:56 -04001195 } else if (dn->inode_page) {
1196 if (!dn->inode_page_locked)
1197 lock_page(dn->inode_page);
Matt Mower7d1db3b2016-05-23 11:34:02 -05001198 ret = update_inode(dn->inode, dn->inode_page);
jrior00197c0eac2015-03-09 20:50:56 -04001199 if (!dn->inode_page_locked)
1200 unlock_page(dn->inode_page);
1201 } else {
Matt Mower7d1db3b2016-05-23 11:34:02 -05001202 ret = update_inode_page(dn->inode);
jrior00197c0eac2015-03-09 20:50:56 -04001203 }
Matt Mower7d1db3b2016-05-23 11:34:02 -05001204 dn->node_changed = ret ? true: false;
1205}
1206
1207static void flush_inline_data(struct f2fs_sb_info *sbi, nid_t ino)
1208{
1209 struct inode *inode;
1210 struct page *page;
Chao Yu884d20a2016-05-21 00:11:09 +08001211 int ret;
Matt Mower7d1db3b2016-05-23 11:34:02 -05001212
1213 /* should flush inline_data before evict_inode */
1214 inode = ilookup(sbi->sb, ino);
1215 if (!inode)
1216 return;
1217
1218 page = find_get_page(inode->i_mapping, 0);
1219 if (!page)
1220 goto iput_out;
1221
1222 if (!trylock_page(page))
1223 goto release_out;
1224
1225 if (!PageUptodate(page))
1226 goto page_out;
1227
1228 if (!PageDirty(page))
1229 goto page_out;
1230
1231 if (!clear_page_dirty_for_io(page))
1232 goto page_out;
1233
Chao Yu884d20a2016-05-21 00:11:09 +08001234 ret = f2fs_write_inline_data(inode, page);
1235 inode_dec_dirty_pages(inode);
1236 if (ret)
Matt Mower7d1db3b2016-05-23 11:34:02 -05001237 set_page_dirty(page);
1238page_out:
1239 unlock_page(page);
1240release_out:
1241 f2fs_put_page(page, 0);
1242iput_out:
1243 iput(inode);
jrior00197c0eac2015-03-09 20:50:56 -04001244}
1245
Matt Mower6c846322016-06-03 11:26:48 -05001246void move_node_page(struct page *node_page, int gc_type)
1247{
1248 if (gc_type == FG_GC) {
1249 struct f2fs_sb_info *sbi = F2FS_P_SB(node_page);
1250 struct writeback_control wbc = {
1251 .sync_mode = WB_SYNC_ALL,
1252 .nr_to_write = 1,
1253 .for_reclaim = 0,
1254 };
1255
1256 set_page_dirty(node_page);
1257 f2fs_wait_on_page_writeback(node_page, NODE, true);
1258
1259 f2fs_bug_on(sbi, PageWriteback(node_page));
1260 if (!clear_page_dirty_for_io(node_page))
1261 goto out_page;
1262
1263 if (NODE_MAPPING(sbi)->a_ops->writepage(node_page, &wbc))
1264 unlock_page(node_page);
1265 goto release_page;
1266 } else {
1267 /* set page dirty and write it */
1268 if (!PageWriteback(node_page))
1269 set_page_dirty(node_page);
1270 }
1271out_page:
1272 unlock_page(node_page);
1273release_page:
1274 f2fs_put_page(node_page, 0);
1275}
1276
1277static struct page *last_fsync_dnode(struct f2fs_sb_info *sbi, nid_t ino)
jrior00197c0eac2015-03-09 20:50:56 -04001278{
1279 pgoff_t index, end;
1280 struct pagevec pvec;
Matt Mower6c846322016-06-03 11:26:48 -05001281 struct page *last_page = NULL;
1282
1283 pagevec_init(&pvec, 0);
1284 index = 0;
1285 end = ULONG_MAX;
1286
1287 while (index <= end) {
1288 int i, nr_pages;
1289 nr_pages = pagevec_lookup_tag(&pvec, NODE_MAPPING(sbi), &index,
1290 PAGECACHE_TAG_DIRTY,
1291 min(end - index, (pgoff_t)PAGEVEC_SIZE-1) + 1);
1292 if (nr_pages == 0)
1293 break;
1294
1295 for (i = 0; i < nr_pages; i++) {
1296 struct page *page = pvec.pages[i];
1297
1298 if (unlikely(f2fs_cp_error(sbi))) {
1299 f2fs_put_page(last_page, 0);
1300 pagevec_release(&pvec);
1301 return ERR_PTR(-EIO);
1302 }
1303
1304 if (!IS_DNODE(page) || !is_cold_node(page))
1305 continue;
1306 if (ino_of_node(page) != ino)
1307 continue;
1308
1309 lock_page(page);
1310
1311 if (unlikely(page->mapping != NODE_MAPPING(sbi))) {
1312continue_unlock:
1313 unlock_page(page);
1314 continue;
1315 }
1316 if (ino_of_node(page) != ino)
1317 goto continue_unlock;
1318
1319 if (!PageDirty(page)) {
1320 /* someone wrote it for us */
1321 goto continue_unlock;
1322 }
1323
1324 if (last_page)
1325 f2fs_put_page(last_page, 0);
1326
1327 get_page(page);
1328 last_page = page;
1329 unlock_page(page);
1330 }
1331 pagevec_release(&pvec);
1332 cond_resched();
1333 }
1334 return last_page;
1335}
1336
1337int fsync_node_pages(struct f2fs_sb_info *sbi, nid_t ino,
1338 struct writeback_control *wbc, bool atomic)
1339{
1340 pgoff_t index, end;
1341 struct pagevec pvec;
1342 int ret = 0;
1343 struct page *last_page = NULL;
1344 bool marked = false;
1345
1346 if (atomic) {
1347 last_page = last_fsync_dnode(sbi, ino);
1348 if (IS_ERR_OR_NULL(last_page))
1349 return PTR_ERR_OR_ZERO(last_page);
1350 }
1351retry:
1352 pagevec_init(&pvec, 0);
1353 index = 0;
1354 end = ULONG_MAX;
1355
1356 while (index <= end) {
1357 int i, nr_pages;
1358 nr_pages = pagevec_lookup_tag(&pvec, NODE_MAPPING(sbi), &index,
1359 PAGECACHE_TAG_DIRTY,
1360 min(end - index, (pgoff_t)PAGEVEC_SIZE-1) + 1);
1361 if (nr_pages == 0)
1362 break;
1363
1364 for (i = 0; i < nr_pages; i++) {
1365 struct page *page = pvec.pages[i];
1366
1367 if (unlikely(f2fs_cp_error(sbi))) {
1368 f2fs_put_page(last_page, 0);
1369 pagevec_release(&pvec);
1370 return -EIO;
1371 }
1372
1373 if (!IS_DNODE(page) || !is_cold_node(page))
1374 continue;
1375 if (ino_of_node(page) != ino)
1376 continue;
1377
1378 lock_page(page);
1379
1380 if (unlikely(page->mapping != NODE_MAPPING(sbi))) {
1381continue_unlock:
1382 unlock_page(page);
1383 continue;
1384 }
1385 if (ino_of_node(page) != ino)
1386 goto continue_unlock;
1387
1388 if (!PageDirty(page) && page != last_page) {
1389 /* someone wrote it for us */
1390 goto continue_unlock;
1391 }
1392
1393 f2fs_wait_on_page_writeback(page, NODE, true);
1394 BUG_ON(PageWriteback(page));
1395
1396 if (!atomic || page == last_page) {
1397 set_fsync_mark(page, 1);
1398 if (IS_INODE(page))
1399 set_dentry_mark(page,
1400 need_dentry_mark(sbi, ino));
1401 /* may be written by other thread */
1402 if (!PageDirty(page))
1403 set_page_dirty(page);
1404 }
1405
1406 if (!clear_page_dirty_for_io(page))
1407 goto continue_unlock;
1408
1409 ret = NODE_MAPPING(sbi)->a_ops->writepage(page, wbc);
1410 if (ret) {
1411 unlock_page(page);
1412 f2fs_put_page(last_page, 0);
1413 break;
1414 }
1415 if (page == last_page) {
1416 f2fs_put_page(page, 0);
1417 marked = true;
1418 break;
1419 }
1420 }
1421 pagevec_release(&pvec);
1422 cond_resched();
1423
1424 if (ret || marked)
1425 break;
1426 }
1427 if (!ret && atomic && !marked) {
1428 f2fs_msg(sbi->sb, KERN_DEBUG,
1429 "Retry to write fsync mark: ino=%u, idx=%lx",
1430 ino, last_page->index);
1431 lock_page(last_page);
1432 set_page_dirty(last_page);
1433 unlock_page(last_page);
1434 goto retry;
1435 }
1436 return ret ? -EIO: 0;
1437}
1438
1439int sync_node_pages(struct f2fs_sb_info *sbi, struct writeback_control *wbc)
1440{
1441 pgoff_t index, end;
1442 struct pagevec pvec;
1443 int step = 0;
Matt Mower7d1db3b2016-05-23 11:34:02 -05001444 int nwritten = 0;
jrior00197c0eac2015-03-09 20:50:56 -04001445
1446 pagevec_init(&pvec, 0);
1447
1448next_step:
1449 index = 0;
Matt Mower7d1db3b2016-05-23 11:34:02 -05001450 end = ULONG_MAX;
jrior00197c0eac2015-03-09 20:50:56 -04001451
1452 while (index <= end) {
1453 int i, nr_pages;
1454 nr_pages = pagevec_lookup_tag(&pvec, NODE_MAPPING(sbi), &index,
1455 PAGECACHE_TAG_DIRTY,
1456 min(end - index, (pgoff_t)PAGEVEC_SIZE-1) + 1);
1457 if (nr_pages == 0)
1458 break;
1459
1460 for (i = 0; i < nr_pages; i++) {
1461 struct page *page = pvec.pages[i];
1462
Matt Mower7d1db3b2016-05-23 11:34:02 -05001463 if (unlikely(f2fs_cp_error(sbi))) {
1464 pagevec_release(&pvec);
1465 return -EIO;
1466 }
1467
jrior00197c0eac2015-03-09 20:50:56 -04001468 /*
1469 * flushing sequence with step:
1470 * 0. indirect nodes
1471 * 1. dentry dnodes
1472 * 2. file dnodes
1473 */
1474 if (step == 0 && IS_DNODE(page))
1475 continue;
1476 if (step == 1 && (!IS_DNODE(page) ||
1477 is_cold_node(page)))
1478 continue;
1479 if (step == 2 && (!IS_DNODE(page) ||
1480 !is_cold_node(page)))
1481 continue;
Matt Mower7d1db3b2016-05-23 11:34:02 -05001482lock_node:
Matt Mower6c846322016-06-03 11:26:48 -05001483 if (!trylock_page(page))
jrior00197c0eac2015-03-09 20:50:56 -04001484 continue;
1485
1486 if (unlikely(page->mapping != NODE_MAPPING(sbi))) {
1487continue_unlock:
1488 unlock_page(page);
1489 continue;
1490 }
jrior00197c0eac2015-03-09 20:50:56 -04001491
1492 if (!PageDirty(page)) {
1493 /* someone wrote it for us */
1494 goto continue_unlock;
1495 }
1496
Matt Mower7d1db3b2016-05-23 11:34:02 -05001497 /* flush inline_data */
Matt Mower6c846322016-06-03 11:26:48 -05001498 if (is_inline_node(page)) {
Matt Mower7d1db3b2016-05-23 11:34:02 -05001499 clear_inline_node(page);
1500 unlock_page(page);
1501 flush_inline_data(sbi, ino_of_node(page));
1502 goto lock_node;
1503 }
1504
1505 f2fs_wait_on_page_writeback(page, NODE, true);
1506
1507 BUG_ON(PageWriteback(page));
jrior00197c0eac2015-03-09 20:50:56 -04001508 if (!clear_page_dirty_for_io(page))
1509 goto continue_unlock;
1510
Matt Mower6c846322016-06-03 11:26:48 -05001511 set_fsync_mark(page, 0);
1512 set_dentry_mark(page, 0);
jrior00197c0eac2015-03-09 20:50:56 -04001513
1514 if (NODE_MAPPING(sbi)->a_ops->writepage(page, wbc))
1515 unlock_page(page);
jrior00197c0eac2015-03-09 20:50:56 -04001516
1517 if (--wbc->nr_to_write == 0)
1518 break;
1519 }
1520 pagevec_release(&pvec);
1521 cond_resched();
1522
1523 if (wbc->nr_to_write == 0) {
1524 step = 2;
1525 break;
1526 }
1527 }
1528
1529 if (step < 2) {
1530 step++;
1531 goto next_step;
1532 }
jrior00197c0eac2015-03-09 20:50:56 -04001533 return nwritten;
1534}
1535
1536int wait_on_node_pages_writeback(struct f2fs_sb_info *sbi, nid_t ino)
1537{
Matt Mower7d1db3b2016-05-23 11:34:02 -05001538 pgoff_t index = 0, end = ULONG_MAX;
jrior00197c0eac2015-03-09 20:50:56 -04001539 struct pagevec pvec;
1540 int ret2 = 0, ret = 0;
1541
1542 pagevec_init(&pvec, 0);
1543
1544 while (index <= end) {
1545 int i, nr_pages;
1546 nr_pages = pagevec_lookup_tag(&pvec, NODE_MAPPING(sbi), &index,
1547 PAGECACHE_TAG_WRITEBACK,
1548 min(end - index, (pgoff_t)PAGEVEC_SIZE-1) + 1);
1549 if (nr_pages == 0)
1550 break;
1551
1552 for (i = 0; i < nr_pages; i++) {
1553 struct page *page = pvec.pages[i];
1554
1555 /* until radix tree lookup accepts end_index */
1556 if (unlikely(page->index > end))
1557 continue;
1558
1559 if (ino && ino_of_node(page) == ino) {
Matt Mower7d1db3b2016-05-23 11:34:02 -05001560 f2fs_wait_on_page_writeback(page, NODE, true);
jrior00197c0eac2015-03-09 20:50:56 -04001561 if (TestClearPageError(page))
1562 ret = -EIO;
1563 }
1564 }
1565 pagevec_release(&pvec);
1566 cond_resched();
1567 }
1568
1569 if (unlikely(test_and_clear_bit(AS_ENOSPC, &NODE_MAPPING(sbi)->flags)))
1570 ret2 = -ENOSPC;
1571 if (unlikely(test_and_clear_bit(AS_EIO, &NODE_MAPPING(sbi)->flags)))
1572 ret2 = -EIO;
1573 if (!ret)
1574 ret = ret2;
1575 return ret;
1576}
1577
1578static int f2fs_write_node_page(struct page *page,
1579 struct writeback_control *wbc)
1580{
1581 struct f2fs_sb_info *sbi = F2FS_P_SB(page);
1582 nid_t nid;
1583 struct node_info ni;
1584 struct f2fs_io_info fio = {
Matt Mower7d1db3b2016-05-23 11:34:02 -05001585 .sbi = sbi,
jrior00197c0eac2015-03-09 20:50:56 -04001586 .type = NODE,
1587 .rw = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : WRITE,
Matt Mower7d1db3b2016-05-23 11:34:02 -05001588 .page = page,
1589 .encrypted_page = NULL,
jrior00197c0eac2015-03-09 20:50:56 -04001590 };
1591
1592 trace_f2fs_writepage(page, NODE);
1593
1594 if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
1595 goto redirty_out;
1596 if (unlikely(f2fs_cp_error(sbi)))
1597 goto redirty_out;
1598
jrior00197c0eac2015-03-09 20:50:56 -04001599 /* get old block addr of this node page */
1600 nid = nid_of_node(page);
1601 f2fs_bug_on(sbi, page->index != nid);
1602
jrior00197c0eac2015-03-09 20:50:56 -04001603 if (wbc->for_reclaim) {
1604 if (!down_read_trylock(&sbi->node_write))
1605 goto redirty_out;
1606 } else {
1607 down_read(&sbi->node_write);
1608 }
1609
Matt Mower7d1db3b2016-05-23 11:34:02 -05001610 get_node_info(sbi, nid, &ni);
1611
1612 /* This page is already truncated */
1613 if (unlikely(ni.blk_addr == NULL_ADDR)) {
1614 ClearPageUptodate(page);
1615 dec_page_count(sbi, F2FS_DIRTY_NODES);
1616 up_read(&sbi->node_write);
1617 unlock_page(page);
1618 return 0;
1619 }
1620
jrior00197c0eac2015-03-09 20:50:56 -04001621 set_page_writeback(page);
Matt Mower7d1db3b2016-05-23 11:34:02 -05001622 fio.old_blkaddr = ni.blk_addr;
1623 write_node_page(nid, &fio);
1624 set_node_addr(sbi, &ni, fio.new_blkaddr, is_fsync_dnode(page));
jrior00197c0eac2015-03-09 20:50:56 -04001625 dec_page_count(sbi, F2FS_DIRTY_NODES);
1626 up_read(&sbi->node_write);
jrior00197c0eac2015-03-09 20:50:56 -04001627
1628 if (wbc->for_reclaim)
Matt Mower7d1db3b2016-05-23 11:34:02 -05001629 f2fs_submit_merged_bio_cond(sbi, NULL, page, 0, NODE, WRITE);
1630
1631 unlock_page(page);
1632
1633 if (unlikely(f2fs_cp_error(sbi)))
jrior00197c0eac2015-03-09 20:50:56 -04001634 f2fs_submit_merged_bio(sbi, NODE, WRITE);
1635
1636 return 0;
1637
1638redirty_out:
1639 redirty_page_for_writepage(wbc, page);
1640 return AOP_WRITEPAGE_ACTIVATE;
1641}
1642
1643static int f2fs_write_node_pages(struct address_space *mapping,
1644 struct writeback_control *wbc)
1645{
1646 struct f2fs_sb_info *sbi = F2FS_M_SB(mapping);
1647 long diff;
1648
jrior00197c0eac2015-03-09 20:50:56 -04001649 /* balancing f2fs's metadata in background */
1650 f2fs_balance_fs_bg(sbi);
1651
1652 /* collect a number of dirty node pages and write together */
1653 if (get_pages(sbi, F2FS_DIRTY_NODES) < nr_pages_to_skip(sbi, NODE))
1654 goto skip_write;
1655
Matt Mower7d1db3b2016-05-23 11:34:02 -05001656 trace_f2fs_writepages(mapping->host, wbc, NODE);
1657
jrior00197c0eac2015-03-09 20:50:56 -04001658 diff = nr_pages_to_write(sbi, NODE, wbc);
1659 wbc->sync_mode = WB_SYNC_NONE;
Matt Mower6c846322016-06-03 11:26:48 -05001660 sync_node_pages(sbi, wbc);
jrior00197c0eac2015-03-09 20:50:56 -04001661 wbc->nr_to_write = max((long)0, wbc->nr_to_write - diff);
1662 return 0;
1663
1664skip_write:
1665 wbc->pages_skipped += get_pages(sbi, F2FS_DIRTY_NODES);
Matt Mower7d1db3b2016-05-23 11:34:02 -05001666 trace_f2fs_writepages(mapping->host, wbc, NODE);
jrior00197c0eac2015-03-09 20:50:56 -04001667 return 0;
1668}
1669
1670static int f2fs_set_node_page_dirty(struct page *page)
1671{
1672 trace_f2fs_set_page_dirty(page, NODE);
1673
1674 SetPageUptodate(page);
1675 if (!PageDirty(page)) {
1676 __set_page_dirty_nobuffers(page);
1677 inc_page_count(F2FS_P_SB(page), F2FS_DIRTY_NODES);
1678 SetPagePrivate(page);
1679 f2fs_trace_pid(page);
1680 return 1;
1681 }
1682 return 0;
1683}
1684
1685/*
1686 * Structure of the f2fs node operations
1687 */
1688const struct address_space_operations f2fs_node_aops = {
1689 .writepage = f2fs_write_node_page,
1690 .writepages = f2fs_write_node_pages,
1691 .set_page_dirty = f2fs_set_node_page_dirty,
1692 .invalidatepage = f2fs_invalidate_page,
1693 .releasepage = f2fs_release_page,
1694};
1695
1696static struct free_nid *__lookup_free_nid_list(struct f2fs_nm_info *nm_i,
1697 nid_t n)
1698{
1699 return radix_tree_lookup(&nm_i->free_nid_root, n);
1700}
1701
1702static void __del_from_free_nid_list(struct f2fs_nm_info *nm_i,
1703 struct free_nid *i)
1704{
1705 list_del(&i->list);
1706 radix_tree_delete(&nm_i->free_nid_root, i->nid);
1707}
1708
1709static int add_free_nid(struct f2fs_sb_info *sbi, nid_t nid, bool build)
1710{
1711 struct f2fs_nm_info *nm_i = NM_I(sbi);
1712 struct free_nid *i;
1713 struct nat_entry *ne;
jrior00197c0eac2015-03-09 20:50:56 -04001714
1715 if (!available_free_memory(sbi, FREE_NIDS))
1716 return -1;
1717
1718 /* 0 nid should not be used */
1719 if (unlikely(nid == 0))
1720 return 0;
1721
1722 if (build) {
1723 /* do not add allocated nids */
jrior00197c0eac2015-03-09 20:50:56 -04001724 ne = __lookup_nat_cache(nm_i, nid);
Matt Mower7d1db3b2016-05-23 11:34:02 -05001725 if (ne && (!get_nat_flag(ne, IS_CHECKPOINTED) ||
jrior00197c0eac2015-03-09 20:50:56 -04001726 nat_get_blkaddr(ne) != NULL_ADDR))
jrior00197c0eac2015-03-09 20:50:56 -04001727 return 0;
1728 }
1729
1730 i = f2fs_kmem_cache_alloc(free_nid_slab, GFP_NOFS);
1731 i->nid = nid;
1732 i->state = NID_NEW;
1733
1734 if (radix_tree_preload(GFP_NOFS)) {
1735 kmem_cache_free(free_nid_slab, i);
1736 return 0;
1737 }
1738
1739 spin_lock(&nm_i->free_nid_list_lock);
1740 if (radix_tree_insert(&nm_i->free_nid_root, i->nid, i)) {
1741 spin_unlock(&nm_i->free_nid_list_lock);
1742 radix_tree_preload_end();
1743 kmem_cache_free(free_nid_slab, i);
1744 return 0;
1745 }
1746 list_add_tail(&i->list, &nm_i->free_nid_list);
1747 nm_i->fcnt++;
1748 spin_unlock(&nm_i->free_nid_list_lock);
1749 radix_tree_preload_end();
1750 return 1;
1751}
1752
1753static void remove_free_nid(struct f2fs_nm_info *nm_i, nid_t nid)
1754{
1755 struct free_nid *i;
1756 bool need_free = false;
1757
1758 spin_lock(&nm_i->free_nid_list_lock);
1759 i = __lookup_free_nid_list(nm_i, nid);
1760 if (i && i->state == NID_NEW) {
1761 __del_from_free_nid_list(nm_i, i);
1762 nm_i->fcnt--;
1763 need_free = true;
1764 }
1765 spin_unlock(&nm_i->free_nid_list_lock);
1766
1767 if (need_free)
1768 kmem_cache_free(free_nid_slab, i);
1769}
1770
1771static void scan_nat_page(struct f2fs_sb_info *sbi,
1772 struct page *nat_page, nid_t start_nid)
1773{
1774 struct f2fs_nm_info *nm_i = NM_I(sbi);
1775 struct f2fs_nat_block *nat_blk = page_address(nat_page);
1776 block_t blk_addr;
1777 int i;
1778
1779 i = start_nid % NAT_ENTRY_PER_BLOCK;
1780
1781 for (; i < NAT_ENTRY_PER_BLOCK; i++, start_nid++) {
1782
1783 if (unlikely(start_nid >= nm_i->max_nid))
1784 break;
1785
1786 blk_addr = le32_to_cpu(nat_blk->entries[i].block_addr);
1787 f2fs_bug_on(sbi, blk_addr == NEW_ADDR);
1788 if (blk_addr == NULL_ADDR) {
1789 if (add_free_nid(sbi, start_nid, true) < 0)
1790 break;
1791 }
1792 }
1793}
1794
1795static void build_free_nids(struct f2fs_sb_info *sbi)
1796{
1797 struct f2fs_nm_info *nm_i = NM_I(sbi);
1798 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
Matt Mower7d1db3b2016-05-23 11:34:02 -05001799 struct f2fs_journal *journal = curseg->journal;
jrior00197c0eac2015-03-09 20:50:56 -04001800 int i = 0;
1801 nid_t nid = nm_i->next_scan_nid;
1802
1803 /* Enough entries */
1804 if (nm_i->fcnt > NAT_ENTRY_PER_BLOCK)
1805 return;
1806
1807 /* readahead nat pages to be scanned */
Matt Mower7d1db3b2016-05-23 11:34:02 -05001808 ra_meta_pages(sbi, NAT_BLOCK_OFFSET(nid), FREE_NID_PAGES,
1809 META_NAT, true);
1810
1811 down_read(&nm_i->nat_tree_lock);
jrior00197c0eac2015-03-09 20:50:56 -04001812
1813 while (1) {
1814 struct page *page = get_current_nat_page(sbi, nid);
1815
1816 scan_nat_page(sbi, page, nid);
1817 f2fs_put_page(page, 1);
1818
1819 nid += (NAT_ENTRY_PER_BLOCK - (nid % NAT_ENTRY_PER_BLOCK));
1820 if (unlikely(nid >= nm_i->max_nid))
1821 nid = 0;
1822
Matt Mower7d1db3b2016-05-23 11:34:02 -05001823 if (++i >= FREE_NID_PAGES)
jrior00197c0eac2015-03-09 20:50:56 -04001824 break;
1825 }
1826
1827 /* go to the next free nat pages to find free nids abundantly */
1828 nm_i->next_scan_nid = nid;
1829
1830 /* find free nids from current sum_pages */
Matt Mower7d1db3b2016-05-23 11:34:02 -05001831 down_read(&curseg->journal_rwsem);
1832 for (i = 0; i < nats_in_cursum(journal); i++) {
1833 block_t addr;
1834
1835 addr = le32_to_cpu(nat_in_journal(journal, i).block_addr);
1836 nid = le32_to_cpu(nid_in_journal(journal, i));
jrior00197c0eac2015-03-09 20:50:56 -04001837 if (addr == NULL_ADDR)
1838 add_free_nid(sbi, nid, true);
1839 else
1840 remove_free_nid(nm_i, nid);
1841 }
Matt Mower7d1db3b2016-05-23 11:34:02 -05001842 up_read(&curseg->journal_rwsem);
1843 up_read(&nm_i->nat_tree_lock);
1844
1845 ra_meta_pages(sbi, NAT_BLOCK_OFFSET(nm_i->next_scan_nid),
1846 nm_i->ra_nid_pages, META_NAT, false);
jrior00197c0eac2015-03-09 20:50:56 -04001847}
1848
1849/*
1850 * If this function returns success, caller can obtain a new nid
1851 * from second parameter of this function.
1852 * The returned nid could be used ino as well as nid when inode is created.
1853 */
1854bool alloc_nid(struct f2fs_sb_info *sbi, nid_t *nid)
1855{
1856 struct f2fs_nm_info *nm_i = NM_I(sbi);
1857 struct free_nid *i = NULL;
1858retry:
Matt Mower6c846322016-06-03 11:26:48 -05001859#ifdef CONFIG_F2FS_FAULT_INJECTION
1860 if (time_to_inject(FAULT_ALLOC_NID))
1861 return false;
1862#endif
jrior00197c0eac2015-03-09 20:50:56 -04001863 if (unlikely(sbi->total_valid_node_count + 1 > nm_i->available_nids))
1864 return false;
1865
1866 spin_lock(&nm_i->free_nid_list_lock);
1867
1868 /* We should not use stale free nids created by build_free_nids */
1869 if (nm_i->fcnt && !on_build_free_nids(nm_i)) {
1870 f2fs_bug_on(sbi, list_empty(&nm_i->free_nid_list));
1871 list_for_each_entry(i, &nm_i->free_nid_list, list)
1872 if (i->state == NID_NEW)
1873 break;
1874
1875 f2fs_bug_on(sbi, i->state != NID_NEW);
1876 *nid = i->nid;
1877 i->state = NID_ALLOC;
1878 nm_i->fcnt--;
1879 spin_unlock(&nm_i->free_nid_list_lock);
1880 return true;
1881 }
1882 spin_unlock(&nm_i->free_nid_list_lock);
1883
1884 /* Let's scan nat pages and its caches to get free nids */
1885 mutex_lock(&nm_i->build_lock);
1886 build_free_nids(sbi);
1887 mutex_unlock(&nm_i->build_lock);
1888 goto retry;
1889}
1890
1891/*
1892 * alloc_nid() should be called prior to this function.
1893 */
1894void alloc_nid_done(struct f2fs_sb_info *sbi, nid_t nid)
1895{
1896 struct f2fs_nm_info *nm_i = NM_I(sbi);
1897 struct free_nid *i;
1898
1899 spin_lock(&nm_i->free_nid_list_lock);
1900 i = __lookup_free_nid_list(nm_i, nid);
1901 f2fs_bug_on(sbi, !i || i->state != NID_ALLOC);
1902 __del_from_free_nid_list(nm_i, i);
1903 spin_unlock(&nm_i->free_nid_list_lock);
1904
1905 kmem_cache_free(free_nid_slab, i);
1906}
1907
1908/*
1909 * alloc_nid() should be called prior to this function.
1910 */
1911void alloc_nid_failed(struct f2fs_sb_info *sbi, nid_t nid)
1912{
1913 struct f2fs_nm_info *nm_i = NM_I(sbi);
1914 struct free_nid *i;
1915 bool need_free = false;
1916
1917 if (!nid)
1918 return;
1919
1920 spin_lock(&nm_i->free_nid_list_lock);
1921 i = __lookup_free_nid_list(nm_i, nid);
1922 f2fs_bug_on(sbi, !i || i->state != NID_ALLOC);
1923 if (!available_free_memory(sbi, FREE_NIDS)) {
1924 __del_from_free_nid_list(nm_i, i);
1925 need_free = true;
1926 } else {
1927 i->state = NID_NEW;
1928 nm_i->fcnt++;
1929 }
1930 spin_unlock(&nm_i->free_nid_list_lock);
1931
1932 if (need_free)
1933 kmem_cache_free(free_nid_slab, i);
1934}
1935
Matt Mower7d1db3b2016-05-23 11:34:02 -05001936int try_to_free_nids(struct f2fs_sb_info *sbi, int nr_shrink)
1937{
1938 struct f2fs_nm_info *nm_i = NM_I(sbi);
1939 struct free_nid *i, *next;
1940 int nr = nr_shrink;
1941
1942 if (!mutex_trylock(&nm_i->build_lock))
1943 return 0;
1944
1945 spin_lock(&nm_i->free_nid_list_lock);
1946 list_for_each_entry_safe(i, next, &nm_i->free_nid_list, list) {
1947 if (nr_shrink <= 0 || nm_i->fcnt <= NAT_ENTRY_PER_BLOCK)
1948 break;
1949 if (i->state == NID_ALLOC)
1950 continue;
1951 __del_from_free_nid_list(nm_i, i);
1952 kmem_cache_free(free_nid_slab, i);
1953 nm_i->fcnt--;
1954 nr_shrink--;
1955 }
1956 spin_unlock(&nm_i->free_nid_list_lock);
1957 mutex_unlock(&nm_i->build_lock);
1958
1959 return nr - nr_shrink;
1960}
1961
jrior00197c0eac2015-03-09 20:50:56 -04001962void recover_inline_xattr(struct inode *inode, struct page *page)
1963{
1964 void *src_addr, *dst_addr;
1965 size_t inline_size;
1966 struct page *ipage;
1967 struct f2fs_inode *ri;
1968
1969 ipage = get_node_page(F2FS_I_SB(inode), inode->i_ino);
1970 f2fs_bug_on(F2FS_I_SB(inode), IS_ERR(ipage));
1971
1972 ri = F2FS_INODE(page);
1973 if (!(ri->i_inline & F2FS_INLINE_XATTR)) {
1974 clear_inode_flag(F2FS_I(inode), FI_INLINE_XATTR);
1975 goto update_inode;
1976 }
1977
1978 dst_addr = inline_xattr_addr(ipage);
1979 src_addr = inline_xattr_addr(page);
1980 inline_size = inline_xattr_size(inode);
1981
Matt Mower7d1db3b2016-05-23 11:34:02 -05001982 f2fs_wait_on_page_writeback(ipage, NODE, true);
jrior00197c0eac2015-03-09 20:50:56 -04001983 memcpy(dst_addr, src_addr, inline_size);
1984update_inode:
1985 update_inode(inode, ipage);
1986 f2fs_put_page(ipage, 1);
1987}
1988
1989void recover_xattr_data(struct inode *inode, struct page *page, block_t blkaddr)
1990{
1991 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1992 nid_t prev_xnid = F2FS_I(inode)->i_xattr_nid;
1993 nid_t new_xnid = nid_of_node(page);
1994 struct node_info ni;
1995
1996 /* 1: invalidate the previous xattr nid */
1997 if (!prev_xnid)
1998 goto recover_xnid;
1999
2000 /* Deallocate node address */
2001 get_node_info(sbi, prev_xnid, &ni);
2002 f2fs_bug_on(sbi, ni.blk_addr == NULL_ADDR);
2003 invalidate_blocks(sbi, ni.blk_addr);
2004 dec_valid_node_count(sbi, inode);
2005 set_node_addr(sbi, &ni, NULL_ADDR, false);
2006
2007recover_xnid:
2008 /* 2: allocate new xattr nid */
2009 if (unlikely(!inc_valid_node_count(sbi, inode)))
2010 f2fs_bug_on(sbi, 1);
2011
2012 remove_free_nid(NM_I(sbi), new_xnid);
2013 get_node_info(sbi, new_xnid, &ni);
2014 ni.ino = inode->i_ino;
2015 set_node_addr(sbi, &ni, NEW_ADDR, false);
2016 F2FS_I(inode)->i_xattr_nid = new_xnid;
2017
2018 /* 3: update xattr blkaddr */
2019 refresh_sit_entry(sbi, NEW_ADDR, blkaddr);
2020 set_node_addr(sbi, &ni, blkaddr, false);
2021
2022 update_inode_page(inode);
2023}
2024
2025int recover_inode_page(struct f2fs_sb_info *sbi, struct page *page)
2026{
2027 struct f2fs_inode *src, *dst;
2028 nid_t ino = ino_of_node(page);
2029 struct node_info old_ni, new_ni;
2030 struct page *ipage;
2031
2032 get_node_info(sbi, ino, &old_ni);
2033
2034 if (unlikely(old_ni.blk_addr != NULL_ADDR))
2035 return -EINVAL;
2036
Matt Mower6c846322016-06-03 11:26:48 -05002037 ipage = f2fs_grab_cache_page(NODE_MAPPING(sbi), ino, false);
jrior00197c0eac2015-03-09 20:50:56 -04002038 if (!ipage)
2039 return -ENOMEM;
2040
2041 /* Should not use this inode from free nid list */
2042 remove_free_nid(NM_I(sbi), ino);
2043
2044 SetPageUptodate(ipage);
2045 fill_node_footer(ipage, ino, ino, 0, true);
2046
2047 src = F2FS_INODE(page);
2048 dst = F2FS_INODE(ipage);
2049
2050 memcpy(dst, src, (unsigned long)&src->i_ext - (unsigned long)src);
2051 dst->i_size = 0;
2052 dst->i_blocks = cpu_to_le64(1);
2053 dst->i_links = cpu_to_le32(1);
2054 dst->i_xattr_nid = 0;
2055 dst->i_inline = src->i_inline & F2FS_INLINE_XATTR;
2056
2057 new_ni = old_ni;
2058 new_ni.ino = ino;
2059
2060 if (unlikely(!inc_valid_node_count(sbi, NULL)))
2061 WARN_ON(1);
2062 set_node_addr(sbi, &new_ni, NEW_ADDR, false);
2063 inc_valid_inode_count(sbi);
2064 set_page_dirty(ipage);
2065 f2fs_put_page(ipage, 1);
2066 return 0;
2067}
2068
2069int restore_node_summary(struct f2fs_sb_info *sbi,
2070 unsigned int segno, struct f2fs_summary_block *sum)
2071{
2072 struct f2fs_node *rn;
2073 struct f2fs_summary *sum_entry;
2074 block_t addr;
2075 int bio_blocks = MAX_BIO_BLOCKS(sbi);
2076 int i, idx, last_offset, nrpages;
2077
2078 /* scan the node segment */
2079 last_offset = sbi->blocks_per_seg;
2080 addr = START_BLOCK(sbi, segno);
2081 sum_entry = &sum->entries[0];
2082
2083 for (i = 0; i < last_offset; i += nrpages, addr += nrpages) {
2084 nrpages = min(last_offset - i, bio_blocks);
2085
2086 /* readahead node pages */
Matt Mower7d1db3b2016-05-23 11:34:02 -05002087 ra_meta_pages(sbi, addr, nrpages, META_POR, true);
jrior00197c0eac2015-03-09 20:50:56 -04002088
2089 for (idx = addr; idx < addr + nrpages; idx++) {
Matt Mower7d1db3b2016-05-23 11:34:02 -05002090 struct page *page = get_tmp_page(sbi, idx);
jrior00197c0eac2015-03-09 20:50:56 -04002091
2092 rn = F2FS_NODE(page);
2093 sum_entry->nid = rn->footer.nid;
2094 sum_entry->version = 0;
2095 sum_entry->ofs_in_node = 0;
2096 sum_entry++;
2097 f2fs_put_page(page, 1);
2098 }
2099
2100 invalidate_mapping_pages(META_MAPPING(sbi), addr,
2101 addr + nrpages);
2102 }
2103 return 0;
2104}
2105
2106static void remove_nats_in_journal(struct f2fs_sb_info *sbi)
2107{
2108 struct f2fs_nm_info *nm_i = NM_I(sbi);
2109 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
Matt Mower7d1db3b2016-05-23 11:34:02 -05002110 struct f2fs_journal *journal = curseg->journal;
jrior00197c0eac2015-03-09 20:50:56 -04002111 int i;
2112
Matt Mower7d1db3b2016-05-23 11:34:02 -05002113 down_write(&curseg->journal_rwsem);
2114 for (i = 0; i < nats_in_cursum(journal); i++) {
jrior00197c0eac2015-03-09 20:50:56 -04002115 struct nat_entry *ne;
2116 struct f2fs_nat_entry raw_ne;
Matt Mower7d1db3b2016-05-23 11:34:02 -05002117 nid_t nid = le32_to_cpu(nid_in_journal(journal, i));
jrior00197c0eac2015-03-09 20:50:56 -04002118
Matt Mower7d1db3b2016-05-23 11:34:02 -05002119 raw_ne = nat_in_journal(journal, i);
jrior00197c0eac2015-03-09 20:50:56 -04002120
jrior00197c0eac2015-03-09 20:50:56 -04002121 ne = __lookup_nat_cache(nm_i, nid);
2122 if (!ne) {
2123 ne = grab_nat_entry(nm_i, nid);
2124 node_info_from_raw_nat(&ne->ni, &raw_ne);
2125 }
2126 __set_nat_cache_dirty(nm_i, ne);
jrior00197c0eac2015-03-09 20:50:56 -04002127 }
Matt Mower7d1db3b2016-05-23 11:34:02 -05002128 update_nats_in_cursum(journal, -i);
2129 up_write(&curseg->journal_rwsem);
jrior00197c0eac2015-03-09 20:50:56 -04002130}
2131
2132static void __adjust_nat_entry_set(struct nat_entry_set *nes,
2133 struct list_head *head, int max)
2134{
2135 struct nat_entry_set *cur;
2136
2137 if (nes->entry_cnt >= max)
2138 goto add_out;
2139
2140 list_for_each_entry(cur, head, set_list) {
2141 if (cur->entry_cnt >= nes->entry_cnt) {
2142 list_add(&nes->set_list, cur->set_list.prev);
2143 return;
2144 }
2145 }
2146add_out:
2147 list_add_tail(&nes->set_list, head);
2148}
2149
2150static void __flush_nat_entry_set(struct f2fs_sb_info *sbi,
2151 struct nat_entry_set *set)
2152{
2153 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
Matt Mower7d1db3b2016-05-23 11:34:02 -05002154 struct f2fs_journal *journal = curseg->journal;
jrior00197c0eac2015-03-09 20:50:56 -04002155 nid_t start_nid = set->set * NAT_ENTRY_PER_BLOCK;
2156 bool to_journal = true;
2157 struct f2fs_nat_block *nat_blk;
2158 struct nat_entry *ne, *cur;
2159 struct page *page = NULL;
2160
2161 /*
2162 * there are two steps to flush nat entries:
2163 * #1, flush nat entries to journal in current hot data summary block.
2164 * #2, flush nat entries to nat page.
2165 */
Matt Mower7d1db3b2016-05-23 11:34:02 -05002166 if (!__has_cursum_space(journal, set->entry_cnt, NAT_JOURNAL))
jrior00197c0eac2015-03-09 20:50:56 -04002167 to_journal = false;
2168
2169 if (to_journal) {
Matt Mower7d1db3b2016-05-23 11:34:02 -05002170 down_write(&curseg->journal_rwsem);
jrior00197c0eac2015-03-09 20:50:56 -04002171 } else {
2172 page = get_next_nat_page(sbi, start_nid);
2173 nat_blk = page_address(page);
2174 f2fs_bug_on(sbi, !nat_blk);
2175 }
2176
2177 /* flush dirty nats in nat entry set */
2178 list_for_each_entry_safe(ne, cur, &set->entry_list, list) {
2179 struct f2fs_nat_entry *raw_ne;
2180 nid_t nid = nat_get_nid(ne);
2181 int offset;
2182
2183 if (nat_get_blkaddr(ne) == NEW_ADDR)
2184 continue;
2185
2186 if (to_journal) {
Matt Mower7d1db3b2016-05-23 11:34:02 -05002187 offset = lookup_journal_in_cursum(journal,
jrior00197c0eac2015-03-09 20:50:56 -04002188 NAT_JOURNAL, nid, 1);
2189 f2fs_bug_on(sbi, offset < 0);
Matt Mower7d1db3b2016-05-23 11:34:02 -05002190 raw_ne = &nat_in_journal(journal, offset);
2191 nid_in_journal(journal, offset) = cpu_to_le32(nid);
jrior00197c0eac2015-03-09 20:50:56 -04002192 } else {
2193 raw_ne = &nat_blk->entries[nid - start_nid];
2194 }
2195 raw_nat_from_node_info(raw_ne, &ne->ni);
jrior00197c0eac2015-03-09 20:50:56 -04002196 nat_reset_flag(ne);
2197 __clear_nat_cache_dirty(NM_I(sbi), ne);
jrior00197c0eac2015-03-09 20:50:56 -04002198 if (nat_get_blkaddr(ne) == NULL_ADDR)
2199 add_free_nid(sbi, nid, false);
2200 }
2201
2202 if (to_journal)
Matt Mower7d1db3b2016-05-23 11:34:02 -05002203 up_write(&curseg->journal_rwsem);
jrior00197c0eac2015-03-09 20:50:56 -04002204 else
2205 f2fs_put_page(page, 1);
2206
2207 f2fs_bug_on(sbi, set->entry_cnt);
2208
2209 radix_tree_delete(&NM_I(sbi)->nat_set_root, set->set);
2210 kmem_cache_free(nat_entry_set_slab, set);
2211}
2212
2213/*
2214 * This function is called during the checkpointing process.
2215 */
2216void flush_nat_entries(struct f2fs_sb_info *sbi)
2217{
2218 struct f2fs_nm_info *nm_i = NM_I(sbi);
2219 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
Matt Mower7d1db3b2016-05-23 11:34:02 -05002220 struct f2fs_journal *journal = curseg->journal;
jrior00197c0eac2015-03-09 20:50:56 -04002221 struct nat_entry_set *setvec[SETVEC_SIZE];
2222 struct nat_entry_set *set, *tmp;
2223 unsigned int found;
2224 nid_t set_idx = 0;
2225 LIST_HEAD(sets);
2226
2227 if (!nm_i->dirty_nat_cnt)
2228 return;
Matt Mower7d1db3b2016-05-23 11:34:02 -05002229
2230 down_write(&nm_i->nat_tree_lock);
2231
jrior00197c0eac2015-03-09 20:50:56 -04002232 /*
2233 * if there are no enough space in journal to store dirty nat
2234 * entries, remove all entries from journal and merge them
2235 * into nat entry set.
2236 */
Matt Mower7d1db3b2016-05-23 11:34:02 -05002237 if (!__has_cursum_space(journal, nm_i->dirty_nat_cnt, NAT_JOURNAL))
jrior00197c0eac2015-03-09 20:50:56 -04002238 remove_nats_in_journal(sbi);
2239
2240 while ((found = __gang_lookup_nat_set(nm_i,
2241 set_idx, SETVEC_SIZE, setvec))) {
2242 unsigned idx;
2243 set_idx = setvec[found - 1]->set + 1;
2244 for (idx = 0; idx < found; idx++)
2245 __adjust_nat_entry_set(setvec[idx], &sets,
Matt Mower7d1db3b2016-05-23 11:34:02 -05002246 MAX_NAT_JENTRIES(journal));
jrior00197c0eac2015-03-09 20:50:56 -04002247 }
2248
2249 /* flush dirty nats in nat entry set */
2250 list_for_each_entry_safe(set, tmp, &sets, set_list)
2251 __flush_nat_entry_set(sbi, set);
2252
Matt Mower7d1db3b2016-05-23 11:34:02 -05002253 up_write(&nm_i->nat_tree_lock);
2254
jrior00197c0eac2015-03-09 20:50:56 -04002255 f2fs_bug_on(sbi, nm_i->dirty_nat_cnt);
2256}
2257
2258static int init_node_manager(struct f2fs_sb_info *sbi)
2259{
2260 struct f2fs_super_block *sb_raw = F2FS_RAW_SUPER(sbi);
2261 struct f2fs_nm_info *nm_i = NM_I(sbi);
2262 unsigned char *version_bitmap;
2263 unsigned int nat_segs, nat_blocks;
2264
2265 nm_i->nat_blkaddr = le32_to_cpu(sb_raw->nat_blkaddr);
2266
2267 /* segment_count_nat includes pair segment so divide to 2. */
2268 nat_segs = le32_to_cpu(sb_raw->segment_count_nat) >> 1;
2269 nat_blocks = nat_segs << le32_to_cpu(sb_raw->log_blocks_per_seg);
2270
2271 nm_i->max_nid = NAT_ENTRY_PER_BLOCK * nat_blocks;
2272
2273 /* not used nids: 0, node, meta, (and root counted as valid node) */
2274 nm_i->available_nids = nm_i->max_nid - F2FS_RESERVED_NODE_NUM;
2275 nm_i->fcnt = 0;
2276 nm_i->nat_cnt = 0;
2277 nm_i->ram_thresh = DEF_RAM_THRESHOLD;
Matt Mower7d1db3b2016-05-23 11:34:02 -05002278 nm_i->ra_nid_pages = DEF_RA_NID_PAGES;
2279 nm_i->dirty_nats_ratio = DEF_DIRTY_NAT_RATIO_THRESHOLD;
jrior00197c0eac2015-03-09 20:50:56 -04002280
2281 INIT_RADIX_TREE(&nm_i->free_nid_root, GFP_ATOMIC);
2282 INIT_LIST_HEAD(&nm_i->free_nid_list);
2283 INIT_RADIX_TREE(&nm_i->nat_root, GFP_NOIO);
2284 INIT_RADIX_TREE(&nm_i->nat_set_root, GFP_NOIO);
2285 INIT_LIST_HEAD(&nm_i->nat_entries);
2286
2287 mutex_init(&nm_i->build_lock);
2288 spin_lock_init(&nm_i->free_nid_list_lock);
2289 init_rwsem(&nm_i->nat_tree_lock);
2290
2291 nm_i->next_scan_nid = le32_to_cpu(sbi->ckpt->next_free_nid);
2292 nm_i->bitmap_size = __bitmap_size(sbi, NAT_BITMAP);
2293 version_bitmap = __bitmap_ptr(sbi, NAT_BITMAP);
2294 if (!version_bitmap)
2295 return -EFAULT;
2296
2297 nm_i->nat_bitmap = kmemdup(version_bitmap, nm_i->bitmap_size,
2298 GFP_KERNEL);
2299 if (!nm_i->nat_bitmap)
2300 return -ENOMEM;
2301 return 0;
2302}
2303
2304int build_node_manager(struct f2fs_sb_info *sbi)
2305{
2306 int err;
2307
2308 sbi->nm_info = kzalloc(sizeof(struct f2fs_nm_info), GFP_KERNEL);
2309 if (!sbi->nm_info)
2310 return -ENOMEM;
2311
2312 err = init_node_manager(sbi);
2313 if (err)
2314 return err;
2315
2316 build_free_nids(sbi);
2317 return 0;
2318}
2319
2320void destroy_node_manager(struct f2fs_sb_info *sbi)
2321{
2322 struct f2fs_nm_info *nm_i = NM_I(sbi);
2323 struct free_nid *i, *next_i;
2324 struct nat_entry *natvec[NATVEC_SIZE];
2325 struct nat_entry_set *setvec[SETVEC_SIZE];
2326 nid_t nid = 0;
2327 unsigned int found;
2328
2329 if (!nm_i)
2330 return;
2331
2332 /* destroy free nid list */
2333 spin_lock(&nm_i->free_nid_list_lock);
2334 list_for_each_entry_safe(i, next_i, &nm_i->free_nid_list, list) {
2335 f2fs_bug_on(sbi, i->state == NID_ALLOC);
2336 __del_from_free_nid_list(nm_i, i);
2337 nm_i->fcnt--;
2338 spin_unlock(&nm_i->free_nid_list_lock);
2339 kmem_cache_free(free_nid_slab, i);
2340 spin_lock(&nm_i->free_nid_list_lock);
2341 }
2342 f2fs_bug_on(sbi, nm_i->fcnt);
2343 spin_unlock(&nm_i->free_nid_list_lock);
2344
2345 /* destroy nat cache */
2346 down_write(&nm_i->nat_tree_lock);
2347 while ((found = __gang_lookup_nat_cache(nm_i,
2348 nid, NATVEC_SIZE, natvec))) {
2349 unsigned idx;
2350
2351 nid = nat_get_nid(natvec[found - 1]) + 1;
2352 for (idx = 0; idx < found; idx++)
2353 __del_from_nat_cache(nm_i, natvec[idx]);
2354 }
2355 f2fs_bug_on(sbi, nm_i->nat_cnt);
2356
2357 /* destroy nat set cache */
2358 nid = 0;
2359 while ((found = __gang_lookup_nat_set(nm_i,
2360 nid, SETVEC_SIZE, setvec))) {
2361 unsigned idx;
2362
2363 nid = setvec[found - 1]->set + 1;
2364 for (idx = 0; idx < found; idx++) {
2365 /* entry_cnt is not zero, when cp_error was occurred */
2366 f2fs_bug_on(sbi, !list_empty(&setvec[idx]->entry_list));
2367 radix_tree_delete(&nm_i->nat_set_root, setvec[idx]->set);
2368 kmem_cache_free(nat_entry_set_slab, setvec[idx]);
2369 }
2370 }
2371 up_write(&nm_i->nat_tree_lock);
2372
2373 kfree(nm_i->nat_bitmap);
2374 sbi->nm_info = NULL;
2375 kfree(nm_i);
2376}
2377
2378int __init create_node_manager_caches(void)
2379{
2380 nat_entry_slab = f2fs_kmem_cache_create("nat_entry",
2381 sizeof(struct nat_entry));
2382 if (!nat_entry_slab)
2383 goto fail;
2384
2385 free_nid_slab = f2fs_kmem_cache_create("free_nid",
2386 sizeof(struct free_nid));
2387 if (!free_nid_slab)
2388 goto destroy_nat_entry;
2389
2390 nat_entry_set_slab = f2fs_kmem_cache_create("nat_entry_set",
2391 sizeof(struct nat_entry_set));
2392 if (!nat_entry_set_slab)
2393 goto destroy_free_nid;
2394 return 0;
2395
2396destroy_free_nid:
2397 kmem_cache_destroy(free_nid_slab);
2398destroy_nat_entry:
2399 kmem_cache_destroy(nat_entry_slab);
2400fail:
2401 return -ENOMEM;
2402}
2403
2404void destroy_node_manager_caches(void)
2405{
2406 kmem_cache_destroy(nat_entry_set_slab);
2407 kmem_cache_destroy(free_nid_slab);
2408 kmem_cache_destroy(nat_entry_slab);
2409}