1
2
3
4
5
6
7
8
9
10
11#include <linux/fs.h>
12#include <linux/f2fs_fs.h>
13#include <linux/bio.h>
14#include <linux/blkdev.h>
15#include <linux/prefetch.h>
16#include <linux/kthread.h>
17#include <linux/swap.h>
18#include <linux/timer.h>
19#include <linux/freezer.h>
20#include <linux/sched/signal.h>
21
22#include "f2fs.h"
23#include "segment.h"
24#include "node.h"
25#include "gc.h"
26#include "trace.h"
27#include <trace/events/f2fs.h>
28
29#define __reverse_ffz(x) __reverse_ffs(~(x))
30
31static struct kmem_cache *discard_entry_slab;
32static struct kmem_cache *discard_cmd_slab;
33static struct kmem_cache *sit_entry_set_slab;
34static struct kmem_cache *inmem_entry_slab;
35
36static unsigned long __reverse_ulong(unsigned char *str)
37{
38 unsigned long tmp = 0;
39 int shift = 24, idx = 0;
40
41#if BITS_PER_LONG == 64
42 shift = 56;
43#endif
44 while (shift >= 0) {
45 tmp |= (unsigned long)str[idx++] << shift;
46 shift -= BITS_PER_BYTE;
47 }
48 return tmp;
49}
50
51
52
53
54
55static inline unsigned long __reverse_ffs(unsigned long word)
56{
57 int num = 0;
58
59#if BITS_PER_LONG == 64
60 if ((word & 0xffffffff00000000UL) == 0)
61 num += 32;
62 else
63 word >>= 32;
64#endif
65 if ((word & 0xffff0000) == 0)
66 num += 16;
67 else
68 word >>= 16;
69
70 if ((word & 0xff00) == 0)
71 num += 8;
72 else
73 word >>= 8;
74
75 if ((word & 0xf0) == 0)
76 num += 4;
77 else
78 word >>= 4;
79
80 if ((word & 0xc) == 0)
81 num += 2;
82 else
83 word >>= 2;
84
85 if ((word & 0x2) == 0)
86 num += 1;
87 return num;
88}
89
90
91
92
93
94
95
96
97
98
99static unsigned long __find_rev_next_bit(const unsigned long *addr,
100 unsigned long size, unsigned long offset)
101{
102 const unsigned long *p = addr + BIT_WORD(offset);
103 unsigned long result = size;
104 unsigned long tmp;
105
106 if (offset >= size)
107 return size;
108
109 size -= (offset & ~(BITS_PER_LONG - 1));
110 offset %= BITS_PER_LONG;
111
112 while (1) {
113 if (*p == 0)
114 goto pass;
115
116 tmp = __reverse_ulong((unsigned char *)p);
117
118 tmp &= ~0UL >> offset;
119 if (size < BITS_PER_LONG)
120 tmp &= (~0UL << (BITS_PER_LONG - size));
121 if (tmp)
122 goto found;
123pass:
124 if (size <= BITS_PER_LONG)
125 break;
126 size -= BITS_PER_LONG;
127 offset = 0;
128 p++;
129 }
130 return result;
131found:
132 return result - size + __reverse_ffs(tmp);
133}
134
135static unsigned long __find_rev_next_zero_bit(const unsigned long *addr,
136 unsigned long size, unsigned long offset)
137{
138 const unsigned long *p = addr + BIT_WORD(offset);
139 unsigned long result = size;
140 unsigned long tmp;
141
142 if (offset >= size)
143 return size;
144
145 size -= (offset & ~(BITS_PER_LONG - 1));
146 offset %= BITS_PER_LONG;
147
148 while (1) {
149 if (*p == ~0UL)
150 goto pass;
151
152 tmp = __reverse_ulong((unsigned char *)p);
153
154 if (offset)
155 tmp |= ~0UL << (BITS_PER_LONG - offset);
156 if (size < BITS_PER_LONG)
157 tmp |= ~0UL >> size;
158 if (tmp != ~0UL)
159 goto found;
160pass:
161 if (size <= BITS_PER_LONG)
162 break;
163 size -= BITS_PER_LONG;
164 offset = 0;
165 p++;
166 }
167 return result;
168found:
169 return result - size + __reverse_ffz(tmp);
170}
171
172bool f2fs_need_SSR(struct f2fs_sb_info *sbi)
173{
174 int node_secs = get_blocktype_secs(sbi, F2FS_DIRTY_NODES);
175 int dent_secs = get_blocktype_secs(sbi, F2FS_DIRTY_DENTS);
176 int imeta_secs = get_blocktype_secs(sbi, F2FS_DIRTY_IMETA);
177
178 if (test_opt(sbi, LFS))
179 return false;
180 if (sbi->gc_mode == GC_URGENT)
181 return true;
182
183 return free_sections(sbi) <= (node_secs + 2 * dent_secs + imeta_secs +
184 SM_I(sbi)->min_ssr_sections + reserved_sections(sbi));
185}
186
187void f2fs_register_inmem_page(struct inode *inode, struct page *page)
188{
189 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
190 struct f2fs_inode_info *fi = F2FS_I(inode);
191 struct inmem_pages *new;
192
193 f2fs_trace_pid(page);
194
195 set_page_private(page, (unsigned long)ATOMIC_WRITTEN_PAGE);
196 SetPagePrivate(page);
197
198 new = f2fs_kmem_cache_alloc(inmem_entry_slab, GFP_NOFS);
199
200
201 new->page = page;
202 INIT_LIST_HEAD(&new->list);
203
204
205 mutex_lock(&fi->inmem_lock);
206 get_page(page);
207 list_add_tail(&new->list, &fi->inmem_pages);
208 spin_lock(&sbi->inode_lock[ATOMIC_FILE]);
209 if (list_empty(&fi->inmem_ilist))
210 list_add_tail(&fi->inmem_ilist, &sbi->inode_list[ATOMIC_FILE]);
211 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]);
212 inc_page_count(F2FS_I_SB(inode), F2FS_INMEM_PAGES);
213 mutex_unlock(&fi->inmem_lock);
214
215 trace_f2fs_register_inmem_page(page, INMEM);
216}
217
218static int __revoke_inmem_pages(struct inode *inode,
219 struct list_head *head, bool drop, bool recover)
220{
221 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
222 struct inmem_pages *cur, *tmp;
223 int err = 0;
224
225 list_for_each_entry_safe(cur, tmp, head, list) {
226 struct page *page = cur->page;
227
228 if (drop)
229 trace_f2fs_commit_inmem_page(page, INMEM_DROP);
230
231 lock_page(page);
232
233 f2fs_wait_on_page_writeback(page, DATA, true);
234
235 if (recover) {
236 struct dnode_of_data dn;
237 struct node_info ni;
238
239 trace_f2fs_commit_inmem_page(page, INMEM_REVOKE);
240retry:
241 set_new_dnode(&dn, inode, NULL, NULL, 0);
242 err = f2fs_get_dnode_of_data(&dn, page->index,
243 LOOKUP_NODE);
244 if (err) {
245 if (err == -ENOMEM) {
246 congestion_wait(BLK_RW_ASYNC, HZ/50);
247 cond_resched();
248 goto retry;
249 }
250 err = -EAGAIN;
251 goto next;
252 }
253 f2fs_get_node_info(sbi, dn.nid, &ni);
254 if (cur->old_addr == NEW_ADDR) {
255 f2fs_invalidate_blocks(sbi, dn.data_blkaddr);
256 f2fs_update_data_blkaddr(&dn, NEW_ADDR);
257 } else
258 f2fs_replace_block(sbi, &dn, dn.data_blkaddr,
259 cur->old_addr, ni.version, true, true);
260 f2fs_put_dnode(&dn);
261 }
262next:
263
264 if (drop || recover)
265 ClearPageUptodate(page);
266 set_page_private(page, 0);
267 ClearPagePrivate(page);
268 f2fs_put_page(page, 1);
269
270 list_del(&cur->list);
271 kmem_cache_free(inmem_entry_slab, cur);
272 dec_page_count(F2FS_I_SB(inode), F2FS_INMEM_PAGES);
273 }
274 return err;
275}
276
277void f2fs_drop_inmem_pages_all(struct f2fs_sb_info *sbi, bool gc_failure)
278{
279 struct list_head *head = &sbi->inode_list[ATOMIC_FILE];
280 struct inode *inode;
281 struct f2fs_inode_info *fi;
282next:
283 spin_lock(&sbi->inode_lock[ATOMIC_FILE]);
284 if (list_empty(head)) {
285 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]);
286 return;
287 }
288 fi = list_first_entry(head, struct f2fs_inode_info, inmem_ilist);
289 inode = igrab(&fi->vfs_inode);
290 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]);
291
292 if (inode) {
293 if (gc_failure) {
294 if (fi->i_gc_failures[GC_FAILURE_ATOMIC])
295 goto drop;
296 goto skip;
297 }
298drop:
299 set_inode_flag(inode, FI_ATOMIC_REVOKE_REQUEST);
300 f2fs_drop_inmem_pages(inode);
301 iput(inode);
302 }
303skip:
304 congestion_wait(BLK_RW_ASYNC, HZ/50);
305 cond_resched();
306 goto next;
307}
308
309void f2fs_drop_inmem_pages(struct inode *inode)
310{
311 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
312 struct f2fs_inode_info *fi = F2FS_I(inode);
313
314 mutex_lock(&fi->inmem_lock);
315 __revoke_inmem_pages(inode, &fi->inmem_pages, true, false);
316 spin_lock(&sbi->inode_lock[ATOMIC_FILE]);
317 if (!list_empty(&fi->inmem_ilist))
318 list_del_init(&fi->inmem_ilist);
319 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]);
320 mutex_unlock(&fi->inmem_lock);
321
322 clear_inode_flag(inode, FI_ATOMIC_FILE);
323 fi->i_gc_failures[GC_FAILURE_ATOMIC] = 0;
324 stat_dec_atomic_write(inode);
325}
326
327void f2fs_drop_inmem_page(struct inode *inode, struct page *page)
328{
329 struct f2fs_inode_info *fi = F2FS_I(inode);
330 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
331 struct list_head *head = &fi->inmem_pages;
332 struct inmem_pages *cur = NULL;
333
334 f2fs_bug_on(sbi, !IS_ATOMIC_WRITTEN_PAGE(page));
335
336 mutex_lock(&fi->inmem_lock);
337 list_for_each_entry(cur, head, list) {
338 if (cur->page == page)
339 break;
340 }
341
342 f2fs_bug_on(sbi, list_empty(head) || cur->page != page);
343 list_del(&cur->list);
344 mutex_unlock(&fi->inmem_lock);
345
346 dec_page_count(sbi, F2FS_INMEM_PAGES);
347 kmem_cache_free(inmem_entry_slab, cur);
348
349 ClearPageUptodate(page);
350 set_page_private(page, 0);
351 ClearPagePrivate(page);
352 f2fs_put_page(page, 0);
353
354 trace_f2fs_commit_inmem_page(page, INMEM_INVALIDATE);
355}
356
357static int __f2fs_commit_inmem_pages(struct inode *inode)
358{
359 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
360 struct f2fs_inode_info *fi = F2FS_I(inode);
361 struct inmem_pages *cur, *tmp;
362 struct f2fs_io_info fio = {
363 .sbi = sbi,
364 .ino = inode->i_ino,
365 .type = DATA,
366 .op = REQ_OP_WRITE,
367 .op_flags = REQ_SYNC | REQ_PRIO,
368 .io_type = FS_DATA_IO,
369 };
370 struct list_head revoke_list;
371 pgoff_t last_idx = ULONG_MAX;
372 int err = 0;
373
374 INIT_LIST_HEAD(&revoke_list);
375
376 list_for_each_entry_safe(cur, tmp, &fi->inmem_pages, list) {
377 struct page *page = cur->page;
378
379 lock_page(page);
380 if (page->mapping == inode->i_mapping) {
381 trace_f2fs_commit_inmem_page(page, INMEM);
382
383 set_page_dirty(page);
384 f2fs_wait_on_page_writeback(page, DATA, true);
385 if (clear_page_dirty_for_io(page)) {
386 inode_dec_dirty_pages(inode);
387 f2fs_remove_dirty_inode(inode);
388 }
389retry:
390 fio.page = page;
391 fio.old_blkaddr = NULL_ADDR;
392 fio.encrypted_page = NULL;
393 fio.need_lock = LOCK_DONE;
394 err = f2fs_do_write_data_page(&fio);
395 if (err) {
396 if (err == -ENOMEM) {
397 congestion_wait(BLK_RW_ASYNC, HZ/50);
398 cond_resched();
399 goto retry;
400 }
401 unlock_page(page);
402 break;
403 }
404
405 cur->old_addr = fio.old_blkaddr;
406 last_idx = page->index;
407 }
408 unlock_page(page);
409 list_move_tail(&cur->list, &revoke_list);
410 }
411
412 if (last_idx != ULONG_MAX)
413 f2fs_submit_merged_write_cond(sbi, inode, 0, last_idx, DATA);
414
415 if (err) {
416
417
418
419
420
421
422
423
424 err = __revoke_inmem_pages(inode, &revoke_list, false, true);
425
426
427 __revoke_inmem_pages(inode, &fi->inmem_pages, true, false);
428 } else {
429 __revoke_inmem_pages(inode, &revoke_list, false, false);
430 }
431
432 return err;
433}
434
435int f2fs_commit_inmem_pages(struct inode *inode)
436{
437 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
438 struct f2fs_inode_info *fi = F2FS_I(inode);
439 int err;
440
441 f2fs_balance_fs(sbi, true);
442 f2fs_lock_op(sbi);
443
444 set_inode_flag(inode, FI_ATOMIC_COMMIT);
445
446 mutex_lock(&fi->inmem_lock);
447 err = __f2fs_commit_inmem_pages(inode);
448
449 spin_lock(&sbi->inode_lock[ATOMIC_FILE]);
450 if (!list_empty(&fi->inmem_ilist))
451 list_del_init(&fi->inmem_ilist);
452 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]);
453 mutex_unlock(&fi->inmem_lock);
454
455 clear_inode_flag(inode, FI_ATOMIC_COMMIT);
456
457 f2fs_unlock_op(sbi);
458 return err;
459}
460
461
462
463
464
465void f2fs_balance_fs(struct f2fs_sb_info *sbi, bool need)
466{
467#ifdef CONFIG_F2FS_FAULT_INJECTION
468 if (time_to_inject(sbi, FAULT_CHECKPOINT)) {
469 f2fs_show_injection_info(FAULT_CHECKPOINT);
470 f2fs_stop_checkpoint(sbi, false);
471 }
472#endif
473
474
475 if (need && excess_cached_nats(sbi))
476 f2fs_balance_fs_bg(sbi);
477
478
479
480
481
482 if (has_not_enough_free_secs(sbi, 0, 0)) {
483 mutex_lock(&sbi->gc_mutex);
484 f2fs_gc(sbi, false, false, NULL_SEGNO);
485 }
486}
487
488void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi)
489{
490 if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
491 return;
492
493
494 if (!f2fs_available_free_memory(sbi, EXTENT_CACHE))
495 f2fs_shrink_extent_tree(sbi, EXTENT_CACHE_SHRINK_NUMBER);
496
497
498 if (!f2fs_available_free_memory(sbi, NAT_ENTRIES))
499 f2fs_try_to_free_nats(sbi, NAT_ENTRY_PER_BLOCK);
500
501 if (!f2fs_available_free_memory(sbi, FREE_NIDS))
502 f2fs_try_to_free_nids(sbi, MAX_FREE_NIDS);
503 else
504 f2fs_build_free_nids(sbi, false, false);
505
506 if (!is_idle(sbi) && !excess_dirty_nats(sbi))
507 return;
508
509
510 if (!f2fs_available_free_memory(sbi, NAT_ENTRIES) ||
511 !f2fs_available_free_memory(sbi, INO_ENTRIES) ||
512 excess_prefree_segs(sbi) ||
513 excess_dirty_nats(sbi) ||
514 f2fs_time_over(sbi, CP_TIME)) {
515 if (test_opt(sbi, DATA_FLUSH)) {
516 struct blk_plug plug;
517
518 blk_start_plug(&plug);
519 f2fs_sync_dirty_inodes(sbi, FILE_INODE);
520 blk_finish_plug(&plug);
521 }
522 f2fs_sync_fs(sbi->sb, true);
523 stat_inc_bg_cp_count(sbi->stat_info);
524 }
525}
526
527static int __submit_flush_wait(struct f2fs_sb_info *sbi,
528 struct block_device *bdev)
529{
530 struct bio *bio = f2fs_bio_alloc(sbi, 0, true);
531 int ret;
532
533 bio->bi_opf = REQ_OP_WRITE | REQ_SYNC | REQ_PREFLUSH;
534 bio_set_dev(bio, bdev);
535 ret = submit_bio_wait(bio);
536 bio_put(bio);
537
538 trace_f2fs_issue_flush(bdev, test_opt(sbi, NOBARRIER),
539 test_opt(sbi, FLUSH_MERGE), ret);
540 return ret;
541}
542
543static int submit_flush_wait(struct f2fs_sb_info *sbi, nid_t ino)
544{
545 int ret = 0;
546 int i;
547
548 if (!sbi->s_ndevs)
549 return __submit_flush_wait(sbi, sbi->sb->s_bdev);
550
551 for (i = 0; i < sbi->s_ndevs; i++) {
552 if (!f2fs_is_dirty_device(sbi, ino, i, FLUSH_INO))
553 continue;
554 ret = __submit_flush_wait(sbi, FDEV(i).bdev);
555 if (ret)
556 break;
557 }
558 return ret;
559}
560
561static int issue_flush_thread(void *data)
562{
563 struct f2fs_sb_info *sbi = data;
564 struct flush_cmd_control *fcc = SM_I(sbi)->fcc_info;
565 wait_queue_head_t *q = &fcc->flush_wait_queue;
566repeat:
567 if (kthread_should_stop())
568 return 0;
569
570 sb_start_intwrite(sbi->sb);
571
572 if (!llist_empty(&fcc->issue_list)) {
573 struct flush_cmd *cmd, *next;
574 int ret;
575
576 fcc->dispatch_list = llist_del_all(&fcc->issue_list);
577 fcc->dispatch_list = llist_reverse_order(fcc->dispatch_list);
578
579 cmd = llist_entry(fcc->dispatch_list, struct flush_cmd, llnode);
580
581 ret = submit_flush_wait(sbi, cmd->ino);
582 atomic_inc(&fcc->issued_flush);
583
584 llist_for_each_entry_safe(cmd, next,
585 fcc->dispatch_list, llnode) {
586 cmd->ret = ret;
587 complete(&cmd->wait);
588 }
589 fcc->dispatch_list = NULL;
590 }
591
592 sb_end_intwrite(sbi->sb);
593
594 wait_event_interruptible(*q,
595 kthread_should_stop() || !llist_empty(&fcc->issue_list));
596 goto repeat;
597}
598
599int f2fs_issue_flush(struct f2fs_sb_info *sbi, nid_t ino)
600{
601 struct flush_cmd_control *fcc = SM_I(sbi)->fcc_info;
602 struct flush_cmd cmd;
603 int ret;
604
605 if (test_opt(sbi, NOBARRIER))
606 return 0;
607
608 if (!test_opt(sbi, FLUSH_MERGE)) {
609 ret = submit_flush_wait(sbi, ino);
610 atomic_inc(&fcc->issued_flush);
611 return ret;
612 }
613
614 if (atomic_inc_return(&fcc->issing_flush) == 1 || sbi->s_ndevs > 1) {
615 ret = submit_flush_wait(sbi, ino);
616 atomic_dec(&fcc->issing_flush);
617
618 atomic_inc(&fcc->issued_flush);
619 return ret;
620 }
621
622 cmd.ino = ino;
623 init_completion(&cmd.wait);
624
625 llist_add(&cmd.llnode, &fcc->issue_list);
626
627
628 smp_mb();
629
630 if (waitqueue_active(&fcc->flush_wait_queue))
631 wake_up(&fcc->flush_wait_queue);
632
633 if (fcc->f2fs_issue_flush) {
634 wait_for_completion(&cmd.wait);
635 atomic_dec(&fcc->issing_flush);
636 } else {
637 struct llist_node *list;
638
639 list = llist_del_all(&fcc->issue_list);
640 if (!list) {
641 wait_for_completion(&cmd.wait);
642 atomic_dec(&fcc->issing_flush);
643 } else {
644 struct flush_cmd *tmp, *next;
645
646 ret = submit_flush_wait(sbi, ino);
647
648 llist_for_each_entry_safe(tmp, next, list, llnode) {
649 if (tmp == &cmd) {
650 cmd.ret = ret;
651 atomic_dec(&fcc->issing_flush);
652 continue;
653 }
654 tmp->ret = ret;
655 complete(&tmp->wait);
656 }
657 }
658 }
659
660 return cmd.ret;
661}
662
663int f2fs_create_flush_cmd_control(struct f2fs_sb_info *sbi)
664{
665 dev_t dev = sbi->sb->s_bdev->bd_dev;
666 struct flush_cmd_control *fcc;
667 int err = 0;
668
669 if (SM_I(sbi)->fcc_info) {
670 fcc = SM_I(sbi)->fcc_info;
671 if (fcc->f2fs_issue_flush)
672 return err;
673 goto init_thread;
674 }
675
676 fcc = f2fs_kzalloc(sbi, sizeof(struct flush_cmd_control), GFP_KERNEL);
677 if (!fcc)
678 return -ENOMEM;
679 atomic_set(&fcc->issued_flush, 0);
680 atomic_set(&fcc->issing_flush, 0);
681 init_waitqueue_head(&fcc->flush_wait_queue);
682 init_llist_head(&fcc->issue_list);
683 SM_I(sbi)->fcc_info = fcc;
684 if (!test_opt(sbi, FLUSH_MERGE))
685 return err;
686
687init_thread:
688 fcc->f2fs_issue_flush = kthread_run(issue_flush_thread, sbi,
689 "f2fs_flush-%u:%u", MAJOR(dev), MINOR(dev));
690 if (IS_ERR(fcc->f2fs_issue_flush)) {
691 err = PTR_ERR(fcc->f2fs_issue_flush);
692 kfree(fcc);
693 SM_I(sbi)->fcc_info = NULL;
694 return err;
695 }
696
697 return err;
698}
699
700void f2fs_destroy_flush_cmd_control(struct f2fs_sb_info *sbi, bool free)
701{
702 struct flush_cmd_control *fcc = SM_I(sbi)->fcc_info;
703
704 if (fcc && fcc->f2fs_issue_flush) {
705 struct task_struct *flush_thread = fcc->f2fs_issue_flush;
706
707 fcc->f2fs_issue_flush = NULL;
708 kthread_stop(flush_thread);
709 }
710 if (free) {
711 kfree(fcc);
712 SM_I(sbi)->fcc_info = NULL;
713 }
714}
715
716int f2fs_flush_device_cache(struct f2fs_sb_info *sbi)
717{
718 int ret = 0, i;
719
720 if (!sbi->s_ndevs)
721 return 0;
722
723 for (i = 1; i < sbi->s_ndevs; i++) {
724 if (!f2fs_test_bit(i, (char *)&sbi->dirty_device))
725 continue;
726 ret = __submit_flush_wait(sbi, FDEV(i).bdev);
727 if (ret)
728 break;
729
730 spin_lock(&sbi->dev_lock);
731 f2fs_clear_bit(i, (char *)&sbi->dirty_device);
732 spin_unlock(&sbi->dev_lock);
733 }
734
735 return ret;
736}
737
738static void __locate_dirty_segment(struct f2fs_sb_info *sbi, unsigned int segno,
739 enum dirty_type dirty_type)
740{
741 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
742
743
744 if (IS_CURSEG(sbi, segno))
745 return;
746
747 if (!test_and_set_bit(segno, dirty_i->dirty_segmap[dirty_type]))
748 dirty_i->nr_dirty[dirty_type]++;
749
750 if (dirty_type == DIRTY) {
751 struct seg_entry *sentry = get_seg_entry(sbi, segno);
752 enum dirty_type t = sentry->type;
753
754 if (unlikely(t >= DIRTY)) {
755 f2fs_bug_on(sbi, 1);
756 return;
757 }
758 if (!test_and_set_bit(segno, dirty_i->dirty_segmap[t]))
759 dirty_i->nr_dirty[t]++;
760 }
761}
762
763static void __remove_dirty_segment(struct f2fs_sb_info *sbi, unsigned int segno,
764 enum dirty_type dirty_type)
765{
766 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
767
768 if (test_and_clear_bit(segno, dirty_i->dirty_segmap[dirty_type]))
769 dirty_i->nr_dirty[dirty_type]--;
770
771 if (dirty_type == DIRTY) {
772 struct seg_entry *sentry = get_seg_entry(sbi, segno);
773 enum dirty_type t = sentry->type;
774
775 if (test_and_clear_bit(segno, dirty_i->dirty_segmap[t]))
776 dirty_i->nr_dirty[t]--;
777
778 if (get_valid_blocks(sbi, segno, true) == 0)
779 clear_bit(GET_SEC_FROM_SEG(sbi, segno),
780 dirty_i->victim_secmap);
781 }
782}
783
784
785
786
787
788
789static void locate_dirty_segment(struct f2fs_sb_info *sbi, unsigned int segno)
790{
791 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
792 unsigned short valid_blocks;
793
794 if (segno == NULL_SEGNO || IS_CURSEG(sbi, segno))
795 return;
796
797 mutex_lock(&dirty_i->seglist_lock);
798
799 valid_blocks = get_valid_blocks(sbi, segno, false);
800
801 if (valid_blocks == 0) {
802 __locate_dirty_segment(sbi, segno, PRE);
803 __remove_dirty_segment(sbi, segno, DIRTY);
804 } else if (valid_blocks < sbi->blocks_per_seg) {
805 __locate_dirty_segment(sbi, segno, DIRTY);
806 } else {
807
808 __remove_dirty_segment(sbi, segno, DIRTY);
809 }
810
811 mutex_unlock(&dirty_i->seglist_lock);
812}
813
814static struct discard_cmd *__create_discard_cmd(struct f2fs_sb_info *sbi,
815 struct block_device *bdev, block_t lstart,
816 block_t start, block_t len)
817{
818 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
819 struct list_head *pend_list;
820 struct discard_cmd *dc;
821
822 f2fs_bug_on(sbi, !len);
823
824 pend_list = &dcc->pend_list[plist_idx(len)];
825
826 dc = f2fs_kmem_cache_alloc(discard_cmd_slab, GFP_NOFS);
827 INIT_LIST_HEAD(&dc->list);
828 dc->bdev = bdev;
829 dc->lstart = lstart;
830 dc->start = start;
831 dc->len = len;
832 dc->ref = 0;
833 dc->state = D_PREP;
834 dc->error = 0;
835 init_completion(&dc->wait);
836 list_add_tail(&dc->list, pend_list);
837 atomic_inc(&dcc->discard_cmd_cnt);
838 dcc->undiscard_blks += len;
839
840 return dc;
841}
842
843static struct discard_cmd *__attach_discard_cmd(struct f2fs_sb_info *sbi,
844 struct block_device *bdev, block_t lstart,
845 block_t start, block_t len,
846 struct rb_node *parent, struct rb_node **p)
847{
848 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
849 struct discard_cmd *dc;
850
851 dc = __create_discard_cmd(sbi, bdev, lstart, start, len);
852
853 rb_link_node(&dc->rb_node, parent, p);
854 rb_insert_color(&dc->rb_node, &dcc->root);
855
856 return dc;
857}
858
859static void __detach_discard_cmd(struct discard_cmd_control *dcc,
860 struct discard_cmd *dc)
861{
862 if (dc->state == D_DONE)
863 atomic_dec(&dcc->issing_discard);
864
865 list_del(&dc->list);
866 rb_erase(&dc->rb_node, &dcc->root);
867 dcc->undiscard_blks -= dc->len;
868
869 kmem_cache_free(discard_cmd_slab, dc);
870
871 atomic_dec(&dcc->discard_cmd_cnt);
872}
873
874static void __remove_discard_cmd(struct f2fs_sb_info *sbi,
875 struct discard_cmd *dc)
876{
877 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
878
879 trace_f2fs_remove_discard(dc->bdev, dc->start, dc->len);
880
881 f2fs_bug_on(sbi, dc->ref);
882
883 if (dc->error == -EOPNOTSUPP)
884 dc->error = 0;
885
886 if (dc->error)
887 f2fs_msg(sbi->sb, KERN_INFO,
888 "Issue discard(%u, %u, %u) failed, ret: %d",
889 dc->lstart, dc->start, dc->len, dc->error);
890 __detach_discard_cmd(dcc, dc);
891}
892
893static void f2fs_submit_discard_endio(struct bio *bio)
894{
895 struct discard_cmd *dc = (struct discard_cmd *)bio->bi_private;
896
897 dc->error = blk_status_to_errno(bio->bi_status);
898 dc->state = D_DONE;
899 complete_all(&dc->wait);
900 bio_put(bio);
901}
902
903static void __check_sit_bitmap(struct f2fs_sb_info *sbi,
904 block_t start, block_t end)
905{
906#ifdef CONFIG_F2FS_CHECK_FS
907 struct seg_entry *sentry;
908 unsigned int segno;
909 block_t blk = start;
910 unsigned long offset, size, max_blocks = sbi->blocks_per_seg;
911 unsigned long *map;
912
913 while (blk < end) {
914 segno = GET_SEGNO(sbi, blk);
915 sentry = get_seg_entry(sbi, segno);
916 offset = GET_BLKOFF_FROM_SEG0(sbi, blk);
917
918 if (end < START_BLOCK(sbi, segno + 1))
919 size = GET_BLKOFF_FROM_SEG0(sbi, end);
920 else
921 size = max_blocks;
922 map = (unsigned long *)(sentry->cur_valid_map);
923 offset = __find_rev_next_bit(map, size, offset);
924 f2fs_bug_on(sbi, offset != size);
925 blk = START_BLOCK(sbi, segno + 1);
926 }
927#endif
928}
929
930static void __init_discard_policy(struct f2fs_sb_info *sbi,
931 struct discard_policy *dpolicy,
932 int discard_type, unsigned int granularity)
933{
934
935 dpolicy->type = discard_type;
936 dpolicy->sync = true;
937 dpolicy->granularity = granularity;
938
939 dpolicy->max_requests = DEF_MAX_DISCARD_REQUEST;
940 dpolicy->io_aware_gran = MAX_PLIST_NUM;
941
942 if (discard_type == DPOLICY_BG) {
943 dpolicy->min_interval = DEF_MIN_DISCARD_ISSUE_TIME;
944 dpolicy->mid_interval = DEF_MID_DISCARD_ISSUE_TIME;
945 dpolicy->max_interval = DEF_MAX_DISCARD_ISSUE_TIME;
946 dpolicy->io_aware = true;
947 dpolicy->sync = false;
948 if (utilization(sbi) > DEF_DISCARD_URGENT_UTIL) {
949 dpolicy->granularity = 1;
950 dpolicy->max_interval = DEF_MIN_DISCARD_ISSUE_TIME;
951 }
952 } else if (discard_type == DPOLICY_FORCE) {
953 dpolicy->min_interval = DEF_MIN_DISCARD_ISSUE_TIME;
954 dpolicy->mid_interval = DEF_MID_DISCARD_ISSUE_TIME;
955 dpolicy->max_interval = DEF_MAX_DISCARD_ISSUE_TIME;
956 dpolicy->io_aware = false;
957 } else if (discard_type == DPOLICY_FSTRIM) {
958 dpolicy->io_aware = false;
959 } else if (discard_type == DPOLICY_UMOUNT) {
960 dpolicy->max_requests = UINT_MAX;
961 dpolicy->io_aware = false;
962 }
963}
964
965
966
967static void __submit_discard_cmd(struct f2fs_sb_info *sbi,
968 struct discard_policy *dpolicy,
969 struct discard_cmd *dc)
970{
971 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
972 struct list_head *wait_list = (dpolicy->type == DPOLICY_FSTRIM) ?
973 &(dcc->fstrim_list) : &(dcc->wait_list);
974 struct bio *bio = NULL;
975 int flag = dpolicy->sync ? REQ_SYNC : 0;
976
977 if (dc->state != D_PREP)
978 return;
979
980 if (is_sbi_flag_set(sbi, SBI_NEED_FSCK))
981 return;
982
983 trace_f2fs_issue_discard(dc->bdev, dc->start, dc->len);
984
985 dc->error = __blkdev_issue_discard(dc->bdev,
986 SECTOR_FROM_BLOCK(dc->start),
987 SECTOR_FROM_BLOCK(dc->len),
988 GFP_NOFS, 0, &bio);
989 if (!dc->error) {
990
991 dc->state = D_SUBMIT;
992 atomic_inc(&dcc->issued_discard);
993 atomic_inc(&dcc->issing_discard);
994 if (bio) {
995 bio->bi_private = dc;
996 bio->bi_end_io = f2fs_submit_discard_endio;
997 bio->bi_opf |= flag;
998 submit_bio(bio);
999 list_move_tail(&dc->list, wait_list);
1000 __check_sit_bitmap(sbi, dc->start, dc->start + dc->len);
1001
1002 f2fs_update_iostat(sbi, FS_DISCARD, 1);
1003 }
1004 } else {
1005 __remove_discard_cmd(sbi, dc);
1006 }
1007}
1008
1009static struct discard_cmd *__insert_discard_tree(struct f2fs_sb_info *sbi,
1010 struct block_device *bdev, block_t lstart,
1011 block_t start, block_t len,
1012 struct rb_node **insert_p,
1013 struct rb_node *insert_parent)
1014{
1015 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
1016 struct rb_node **p;
1017 struct rb_node *parent = NULL;
1018 struct discard_cmd *dc = NULL;
1019
1020 if (insert_p && insert_parent) {
1021 parent = insert_parent;
1022 p = insert_p;
1023 goto do_insert;
1024 }
1025
1026 p = f2fs_lookup_rb_tree_for_insert(sbi, &dcc->root, &parent, lstart);
1027do_insert:
1028 dc = __attach_discard_cmd(sbi, bdev, lstart, start, len, parent, p);
1029 if (!dc)
1030 return NULL;
1031
1032 return dc;
1033}
1034
1035static void __relocate_discard_cmd(struct discard_cmd_control *dcc,
1036 struct discard_cmd *dc)
1037{
1038 list_move_tail(&dc->list, &dcc->pend_list[plist_idx(dc->len)]);
1039}
1040
1041static void __punch_discard_cmd(struct f2fs_sb_info *sbi,
1042 struct discard_cmd *dc, block_t blkaddr)
1043{
1044 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
1045 struct discard_info di = dc->di;
1046 bool modified = false;
1047
1048 if (dc->state == D_DONE || dc->len == 1) {
1049 __remove_discard_cmd(sbi, dc);
1050 return;
1051 }
1052
1053 dcc->undiscard_blks -= di.len;
1054
1055 if (blkaddr > di.lstart) {
1056 dc->len = blkaddr - dc->lstart;
1057 dcc->undiscard_blks += dc->len;
1058 __relocate_discard_cmd(dcc, dc);
1059 modified = true;
1060 }
1061
1062 if (blkaddr < di.lstart + di.len - 1) {
1063 if (modified) {
1064 __insert_discard_tree(sbi, dc->bdev, blkaddr + 1,
1065 di.start + blkaddr + 1 - di.lstart,
1066 di.lstart + di.len - 1 - blkaddr,
1067 NULL, NULL);
1068 } else {
1069 dc->lstart++;
1070 dc->len--;
1071 dc->start++;
1072 dcc->undiscard_blks += dc->len;
1073 __relocate_discard_cmd(dcc, dc);
1074 }
1075 }
1076}
1077
1078static void __update_discard_tree_range(struct f2fs_sb_info *sbi,
1079 struct block_device *bdev, block_t lstart,
1080 block_t start, block_t len)
1081{
1082 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
1083 struct discard_cmd *prev_dc = NULL, *next_dc = NULL;
1084 struct discard_cmd *dc;
1085 struct discard_info di = {0};
1086 struct rb_node **insert_p = NULL, *insert_parent = NULL;
1087 block_t end = lstart + len;
1088
1089 mutex_lock(&dcc->cmd_lock);
1090
1091 dc = (struct discard_cmd *)f2fs_lookup_rb_tree_ret(&dcc->root,
1092 NULL, lstart,
1093 (struct rb_entry **)&prev_dc,
1094 (struct rb_entry **)&next_dc,
1095 &insert_p, &insert_parent, true);
1096 if (dc)
1097 prev_dc = dc;
1098
1099 if (!prev_dc) {
1100 di.lstart = lstart;
1101 di.len = next_dc ? next_dc->lstart - lstart : len;
1102 di.len = min(di.len, len);
1103 di.start = start;
1104 }
1105
1106 while (1) {
1107 struct rb_node *node;
1108 bool merged = false;
1109 struct discard_cmd *tdc = NULL;
1110
1111 if (prev_dc) {
1112 di.lstart = prev_dc->lstart + prev_dc->len;
1113 if (di.lstart < lstart)
1114 di.lstart = lstart;
1115 if (di.lstart >= end)
1116 break;
1117
1118 if (!next_dc || next_dc->lstart > end)
1119 di.len = end - di.lstart;
1120 else
1121 di.len = next_dc->lstart - di.lstart;
1122 di.start = start + di.lstart - lstart;
1123 }
1124
1125 if (!di.len)
1126 goto next;
1127
1128 if (prev_dc && prev_dc->state == D_PREP &&
1129 prev_dc->bdev == bdev &&
1130 __is_discard_back_mergeable(&di, &prev_dc->di)) {
1131 prev_dc->di.len += di.len;
1132 dcc->undiscard_blks += di.len;
1133 __relocate_discard_cmd(dcc, prev_dc);
1134 di = prev_dc->di;
1135 tdc = prev_dc;
1136 merged = true;
1137 }
1138
1139 if (next_dc && next_dc->state == D_PREP &&
1140 next_dc->bdev == bdev &&
1141 __is_discard_front_mergeable(&di, &next_dc->di)) {
1142 next_dc->di.lstart = di.lstart;
1143 next_dc->di.len += di.len;
1144 next_dc->di.start = di.start;
1145 dcc->undiscard_blks += di.len;
1146 __relocate_discard_cmd(dcc, next_dc);
1147 if (tdc)
1148 __remove_discard_cmd(sbi, tdc);
1149 merged = true;
1150 }
1151
1152 if (!merged) {
1153 __insert_discard_tree(sbi, bdev, di.lstart, di.start,
1154 di.len, NULL, NULL);
1155 }
1156 next:
1157 prev_dc = next_dc;
1158 if (!prev_dc)
1159 break;
1160
1161 node = rb_next(&prev_dc->rb_node);
1162 next_dc = rb_entry_safe(node, struct discard_cmd, rb_node);
1163 }
1164
1165 mutex_unlock(&dcc->cmd_lock);
1166}
1167
1168static int __queue_discard_cmd(struct f2fs_sb_info *sbi,
1169 struct block_device *bdev, block_t blkstart, block_t blklen)
1170{
1171 block_t lblkstart = blkstart;
1172
1173 trace_f2fs_queue_discard(bdev, blkstart, blklen);
1174
1175 if (sbi->s_ndevs) {
1176 int devi = f2fs_target_device_index(sbi, blkstart);
1177
1178 blkstart -= FDEV(devi).start_blk;
1179 }
1180 __update_discard_tree_range(sbi, bdev, lblkstart, blkstart, blklen);
1181 return 0;
1182}
1183
1184static int __issue_discard_cmd(struct f2fs_sb_info *sbi,
1185 struct discard_policy *dpolicy)
1186{
1187 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
1188 struct list_head *pend_list;
1189 struct discard_cmd *dc, *tmp;
1190 struct blk_plug plug;
1191 int i, iter = 0, issued = 0;
1192 bool io_interrupted = false;
1193
1194 for (i = MAX_PLIST_NUM - 1; i >= 0; i--) {
1195 if (i + 1 < dpolicy->granularity)
1196 break;
1197 pend_list = &dcc->pend_list[i];
1198
1199 mutex_lock(&dcc->cmd_lock);
1200 if (list_empty(pend_list))
1201 goto next;
1202 f2fs_bug_on(sbi,
1203 !f2fs_check_rb_tree_consistence(sbi, &dcc->root));
1204 blk_start_plug(&plug);
1205 list_for_each_entry_safe(dc, tmp, pend_list, list) {
1206 f2fs_bug_on(sbi, dc->state != D_PREP);
1207
1208 if (dpolicy->io_aware && i < dpolicy->io_aware_gran &&
1209 !is_idle(sbi)) {
1210 io_interrupted = true;
1211 goto skip;
1212 }
1213
1214 __submit_discard_cmd(sbi, dpolicy, dc);
1215 issued++;
1216skip:
1217 if (++iter >= dpolicy->max_requests)
1218 break;
1219 }
1220 blk_finish_plug(&plug);
1221next:
1222 mutex_unlock(&dcc->cmd_lock);
1223
1224 if (iter >= dpolicy->max_requests)
1225 break;
1226 }
1227
1228 if (!issued && io_interrupted)
1229 issued = -1;
1230
1231 return issued;
1232}
1233
1234static bool __drop_discard_cmd(struct f2fs_sb_info *sbi)
1235{
1236 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
1237 struct list_head *pend_list;
1238 struct discard_cmd *dc, *tmp;
1239 int i;
1240 bool dropped = false;
1241
1242 mutex_lock(&dcc->cmd_lock);
1243 for (i = MAX_PLIST_NUM - 1; i >= 0; i--) {
1244 pend_list = &dcc->pend_list[i];
1245 list_for_each_entry_safe(dc, tmp, pend_list, list) {
1246 f2fs_bug_on(sbi, dc->state != D_PREP);
1247 __remove_discard_cmd(sbi, dc);
1248 dropped = true;
1249 }
1250 }
1251 mutex_unlock(&dcc->cmd_lock);
1252
1253 return dropped;
1254}
1255
1256void f2fs_drop_discard_cmd(struct f2fs_sb_info *sbi)
1257{
1258 __drop_discard_cmd(sbi);
1259}
1260
1261static unsigned int __wait_one_discard_bio(struct f2fs_sb_info *sbi,
1262 struct discard_cmd *dc)
1263{
1264 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
1265 unsigned int len = 0;
1266
1267 wait_for_completion_io(&dc->wait);
1268 mutex_lock(&dcc->cmd_lock);
1269 f2fs_bug_on(sbi, dc->state != D_DONE);
1270 dc->ref--;
1271 if (!dc->ref) {
1272 if (!dc->error)
1273 len = dc->len;
1274 __remove_discard_cmd(sbi, dc);
1275 }
1276 mutex_unlock(&dcc->cmd_lock);
1277
1278 return len;
1279}
1280
1281static unsigned int __wait_discard_cmd_range(struct f2fs_sb_info *sbi,
1282 struct discard_policy *dpolicy,
1283 block_t start, block_t end)
1284{
1285 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
1286 struct list_head *wait_list = (dpolicy->type == DPOLICY_FSTRIM) ?
1287 &(dcc->fstrim_list) : &(dcc->wait_list);
1288 struct discard_cmd *dc, *tmp;
1289 bool need_wait;
1290 unsigned int trimmed = 0;
1291
1292next:
1293 need_wait = false;
1294
1295 mutex_lock(&dcc->cmd_lock);
1296 list_for_each_entry_safe(dc, tmp, wait_list, list) {
1297 if (dc->lstart + dc->len <= start || end <= dc->lstart)
1298 continue;
1299 if (dc->len < dpolicy->granularity)
1300 continue;
1301 if (dc->state == D_DONE && !dc->ref) {
1302 wait_for_completion_io(&dc->wait);
1303 if (!dc->error)
1304 trimmed += dc->len;
1305 __remove_discard_cmd(sbi, dc);
1306 } else {
1307 dc->ref++;
1308 need_wait = true;
1309 break;
1310 }
1311 }
1312 mutex_unlock(&dcc->cmd_lock);
1313
1314 if (need_wait) {
1315 trimmed += __wait_one_discard_bio(sbi, dc);
1316 goto next;
1317 }
1318
1319 return trimmed;
1320}
1321
1322static void __wait_all_discard_cmd(struct f2fs_sb_info *sbi,
1323 struct discard_policy *dpolicy)
1324{
1325 struct discard_policy dp;
1326
1327 if (dpolicy) {
1328 __wait_discard_cmd_range(sbi, dpolicy, 0, UINT_MAX);
1329 return;
1330 }
1331
1332
1333 __init_discard_policy(sbi, &dp, DPOLICY_FSTRIM, 1);
1334 __wait_discard_cmd_range(sbi, &dp, 0, UINT_MAX);
1335 __init_discard_policy(sbi, &dp, DPOLICY_UMOUNT, 1);
1336 __wait_discard_cmd_range(sbi, &dp, 0, UINT_MAX);
1337}
1338
1339
1340static void f2fs_wait_discard_bio(struct f2fs_sb_info *sbi, block_t blkaddr)
1341{
1342 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
1343 struct discard_cmd *dc;
1344 bool need_wait = false;
1345
1346 mutex_lock(&dcc->cmd_lock);
1347 dc = (struct discard_cmd *)f2fs_lookup_rb_tree(&dcc->root,
1348 NULL, blkaddr);
1349 if (dc) {
1350 if (dc->state == D_PREP) {
1351 __punch_discard_cmd(sbi, dc, blkaddr);
1352 } else {
1353 dc->ref++;
1354 need_wait = true;
1355 }
1356 }
1357 mutex_unlock(&dcc->cmd_lock);
1358
1359 if (need_wait)
1360 __wait_one_discard_bio(sbi, dc);
1361}
1362
1363void f2fs_stop_discard_thread(struct f2fs_sb_info *sbi)
1364{
1365 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
1366
1367 if (dcc && dcc->f2fs_issue_discard) {
1368 struct task_struct *discard_thread = dcc->f2fs_issue_discard;
1369
1370 dcc->f2fs_issue_discard = NULL;
1371 kthread_stop(discard_thread);
1372 }
1373}
1374
1375
1376bool f2fs_wait_discard_bios(struct f2fs_sb_info *sbi)
1377{
1378 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
1379 struct discard_policy dpolicy;
1380 bool dropped;
1381
1382 __init_discard_policy(sbi, &dpolicy, DPOLICY_UMOUNT,
1383 dcc->discard_granularity);
1384 __issue_discard_cmd(sbi, &dpolicy);
1385 dropped = __drop_discard_cmd(sbi);
1386
1387
1388 __wait_all_discard_cmd(sbi, NULL);
1389 return dropped;
1390}
1391
1392static int issue_discard_thread(void *data)
1393{
1394 struct f2fs_sb_info *sbi = data;
1395 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
1396 wait_queue_head_t *q = &dcc->discard_wait_queue;
1397 struct discard_policy dpolicy;
1398 unsigned int wait_ms = DEF_MIN_DISCARD_ISSUE_TIME;
1399 int issued;
1400
1401 set_freezable();
1402
1403 do {
1404 __init_discard_policy(sbi, &dpolicy, DPOLICY_BG,
1405 dcc->discard_granularity);
1406
1407 wait_event_interruptible_timeout(*q,
1408 kthread_should_stop() || freezing(current) ||
1409 dcc->discard_wake,
1410 msecs_to_jiffies(wait_ms));
1411
1412 if (dcc->discard_wake)
1413 dcc->discard_wake = 0;
1414
1415 if (try_to_freeze())
1416 continue;
1417 if (f2fs_readonly(sbi->sb))
1418 continue;
1419 if (kthread_should_stop())
1420 return 0;
1421 if (is_sbi_flag_set(sbi, SBI_NEED_FSCK)) {
1422 wait_ms = dpolicy.max_interval;
1423 continue;
1424 }
1425
1426 if (sbi->gc_mode == GC_URGENT)
1427 __init_discard_policy(sbi, &dpolicy, DPOLICY_FORCE, 1);
1428
1429 sb_start_intwrite(sbi->sb);
1430
1431 issued = __issue_discard_cmd(sbi, &dpolicy);
1432 if (issued > 0) {
1433 __wait_all_discard_cmd(sbi, &dpolicy);
1434 wait_ms = dpolicy.min_interval;
1435 } else if (issued == -1){
1436 wait_ms = dpolicy.mid_interval;
1437 } else {
1438 wait_ms = dpolicy.max_interval;
1439 }
1440
1441 sb_end_intwrite(sbi->sb);
1442
1443 } while (!kthread_should_stop());
1444 return 0;
1445}
1446
1447#ifdef CONFIG_BLK_DEV_ZONED
1448static int __f2fs_issue_discard_zone(struct f2fs_sb_info *sbi,
1449 struct block_device *bdev, block_t blkstart, block_t blklen)
1450{
1451 sector_t sector, nr_sects;
1452 block_t lblkstart = blkstart;
1453 int devi = 0;
1454
1455 if (sbi->s_ndevs) {
1456 devi = f2fs_target_device_index(sbi, blkstart);
1457 blkstart -= FDEV(devi).start_blk;
1458 }
1459
1460
1461
1462
1463
1464
1465 switch (get_blkz_type(sbi, bdev, blkstart)) {
1466
1467 case BLK_ZONE_TYPE_CONVENTIONAL:
1468 if (!blk_queue_discard(bdev_get_queue(bdev)))
1469 return 0;
1470 return __queue_discard_cmd(sbi, bdev, lblkstart, blklen);
1471 case BLK_ZONE_TYPE_SEQWRITE_REQ:
1472 case BLK_ZONE_TYPE_SEQWRITE_PREF:
1473 sector = SECTOR_FROM_BLOCK(blkstart);
1474 nr_sects = SECTOR_FROM_BLOCK(blklen);
1475
1476 if (sector & (bdev_zone_sectors(bdev) - 1) ||
1477 nr_sects != bdev_zone_sectors(bdev)) {
1478 f2fs_msg(sbi->sb, KERN_INFO,
1479 "(%d) %s: Unaligned discard attempted (block %x + %x)",
1480 devi, sbi->s_ndevs ? FDEV(devi).path: "",
1481 blkstart, blklen);
1482 return -EIO;
1483 }
1484 trace_f2fs_issue_reset_zone(bdev, blkstart);
1485 return blkdev_reset_zones(bdev, sector,
1486 nr_sects, GFP_NOFS);
1487 default:
1488
1489 return -EIO;
1490 }
1491}
1492#endif
1493
1494static int __issue_discard_async(struct f2fs_sb_info *sbi,
1495 struct block_device *bdev, block_t blkstart, block_t blklen)
1496{
1497#ifdef CONFIG_BLK_DEV_ZONED
1498 if (f2fs_sb_has_blkzoned(sbi->sb) &&
1499 bdev_zoned_model(bdev) != BLK_ZONED_NONE)
1500 return __f2fs_issue_discard_zone(sbi, bdev, blkstart, blklen);
1501#endif
1502 return __queue_discard_cmd(sbi, bdev, blkstart, blklen);
1503}
1504
1505static int f2fs_issue_discard(struct f2fs_sb_info *sbi,
1506 block_t blkstart, block_t blklen)
1507{
1508 sector_t start = blkstart, len = 0;
1509 struct block_device *bdev;
1510 struct seg_entry *se;
1511 unsigned int offset;
1512 block_t i;
1513 int err = 0;
1514
1515 bdev = f2fs_target_device(sbi, blkstart, NULL);
1516
1517 for (i = blkstart; i < blkstart + blklen; i++, len++) {
1518 if (i != start) {
1519 struct block_device *bdev2 =
1520 f2fs_target_device(sbi, i, NULL);
1521
1522 if (bdev2 != bdev) {
1523 err = __issue_discard_async(sbi, bdev,
1524 start, len);
1525 if (err)
1526 return err;
1527 bdev = bdev2;
1528 start = i;
1529 len = 0;
1530 }
1531 }
1532
1533 se = get_seg_entry(sbi, GET_SEGNO(sbi, i));
1534 offset = GET_BLKOFF_FROM_SEG0(sbi, i);
1535
1536 if (!f2fs_test_and_set_bit(offset, se->discard_map))
1537 sbi->discard_blks--;
1538 }
1539
1540 if (len)
1541 err = __issue_discard_async(sbi, bdev, start, len);
1542 return err;
1543}
1544
1545static bool add_discard_addrs(struct f2fs_sb_info *sbi, struct cp_control *cpc,
1546 bool check_only)
1547{
1548 int entries = SIT_VBLOCK_MAP_SIZE / sizeof(unsigned long);
1549 int max_blocks = sbi->blocks_per_seg;
1550 struct seg_entry *se = get_seg_entry(sbi, cpc->trim_start);
1551 unsigned long *cur_map = (unsigned long *)se->cur_valid_map;
1552 unsigned long *ckpt_map = (unsigned long *)se->ckpt_valid_map;
1553 unsigned long *discard_map = (unsigned long *)se->discard_map;
1554 unsigned long *dmap = SIT_I(sbi)->tmp_map;
1555 unsigned int start = 0, end = -1;
1556 bool force = (cpc->reason & CP_DISCARD);
1557 struct discard_entry *de = NULL;
1558 struct list_head *head = &SM_I(sbi)->dcc_info->entry_list;
1559 int i;
1560
1561 if (se->valid_blocks == max_blocks || !f2fs_discard_en(sbi))
1562 return false;
1563
1564 if (!force) {
1565 if (!test_opt(sbi, DISCARD) || !se->valid_blocks ||
1566 SM_I(sbi)->dcc_info->nr_discards >=
1567 SM_I(sbi)->dcc_info->max_discards)
1568 return false;
1569 }
1570
1571
1572 for (i = 0; i < entries; i++)
1573 dmap[i] = force ? ~ckpt_map[i] & ~discard_map[i] :
1574 (cur_map[i] ^ ckpt_map[i]) & ckpt_map[i];
1575
1576 while (force || SM_I(sbi)->dcc_info->nr_discards <=
1577 SM_I(sbi)->dcc_info->max_discards) {
1578 start = __find_rev_next_bit(dmap, max_blocks, end + 1);
1579 if (start >= max_blocks)
1580 break;
1581
1582 end = __find_rev_next_zero_bit(dmap, max_blocks, start + 1);
1583 if (force && start && end != max_blocks
1584 && (end - start) < cpc->trim_minlen)
1585 continue;
1586
1587 if (check_only)
1588 return true;
1589
1590 if (!de) {
1591 de = f2fs_kmem_cache_alloc(discard_entry_slab,
1592 GFP_F2FS_ZERO);
1593 de->start_blkaddr = START_BLOCK(sbi, cpc->trim_start);
1594 list_add_tail(&de->list, head);
1595 }
1596
1597 for (i = start; i < end; i++)
1598 __set_bit_le(i, (void *)de->discard_map);
1599
1600 SM_I(sbi)->dcc_info->nr_discards += end - start;
1601 }
1602 return false;
1603}
1604
1605static void release_discard_addr(struct discard_entry *entry)
1606{
1607 list_del(&entry->list);
1608 kmem_cache_free(discard_entry_slab, entry);
1609}
1610
1611void f2fs_release_discard_addrs(struct f2fs_sb_info *sbi)
1612{
1613 struct list_head *head = &(SM_I(sbi)->dcc_info->entry_list);
1614 struct discard_entry *entry, *this;
1615
1616
1617 list_for_each_entry_safe(entry, this, head, list)
1618 release_discard_addr(entry);
1619}
1620
1621
1622
1623
1624static void set_prefree_as_free_segments(struct f2fs_sb_info *sbi)
1625{
1626 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
1627 unsigned int segno;
1628
1629 mutex_lock(&dirty_i->seglist_lock);
1630 for_each_set_bit(segno, dirty_i->dirty_segmap[PRE], MAIN_SEGS(sbi))
1631 __set_test_and_free(sbi, segno);
1632 mutex_unlock(&dirty_i->seglist_lock);
1633}
1634
1635void f2fs_clear_prefree_segments(struct f2fs_sb_info *sbi,
1636 struct cp_control *cpc)
1637{
1638 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
1639 struct list_head *head = &dcc->entry_list;
1640 struct discard_entry *entry, *this;
1641 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
1642 unsigned long *prefree_map = dirty_i->dirty_segmap[PRE];
1643 unsigned int start = 0, end = -1;
1644 unsigned int secno, start_segno;
1645 bool force = (cpc->reason & CP_DISCARD);
1646
1647 mutex_lock(&dirty_i->seglist_lock);
1648
1649 while (1) {
1650 int i;
1651 start = find_next_bit(prefree_map, MAIN_SEGS(sbi), end + 1);
1652 if (start >= MAIN_SEGS(sbi))
1653 break;
1654 end = find_next_zero_bit(prefree_map, MAIN_SEGS(sbi),
1655 start + 1);
1656
1657 for (i = start; i < end; i++)
1658 clear_bit(i, prefree_map);
1659
1660 dirty_i->nr_dirty[PRE] -= end - start;
1661
1662 if (!test_opt(sbi, DISCARD))
1663 continue;
1664
1665 if (force && start >= cpc->trim_start &&
1666 (end - 1) <= cpc->trim_end)
1667 continue;
1668
1669 if (!test_opt(sbi, LFS) || sbi->segs_per_sec == 1) {
1670 f2fs_issue_discard(sbi, START_BLOCK(sbi, start),
1671 (end - start) << sbi->log_blocks_per_seg);
1672 continue;
1673 }
1674next:
1675 secno = GET_SEC_FROM_SEG(sbi, start);
1676 start_segno = GET_SEG_FROM_SEC(sbi, secno);
1677 if (!IS_CURSEC(sbi, secno) &&
1678 !get_valid_blocks(sbi, start, true))
1679 f2fs_issue_discard(sbi, START_BLOCK(sbi, start_segno),
1680 sbi->segs_per_sec << sbi->log_blocks_per_seg);
1681
1682 start = start_segno + sbi->segs_per_sec;
1683 if (start < end)
1684 goto next;
1685 else
1686 end = start - 1;
1687 }
1688 mutex_unlock(&dirty_i->seglist_lock);
1689
1690
1691 list_for_each_entry_safe(entry, this, head, list) {
1692 unsigned int cur_pos = 0, next_pos, len, total_len = 0;
1693 bool is_valid = test_bit_le(0, entry->discard_map);
1694
1695find_next:
1696 if (is_valid) {
1697 next_pos = find_next_zero_bit_le(entry->discard_map,
1698 sbi->blocks_per_seg, cur_pos);
1699 len = next_pos - cur_pos;
1700
1701 if (f2fs_sb_has_blkzoned(sbi->sb) ||
1702 (force && len < cpc->trim_minlen))
1703 goto skip;
1704
1705 f2fs_issue_discard(sbi, entry->start_blkaddr + cur_pos,
1706 len);
1707 total_len += len;
1708 } else {
1709 next_pos = find_next_bit_le(entry->discard_map,
1710 sbi->blocks_per_seg, cur_pos);
1711 }
1712skip:
1713 cur_pos = next_pos;
1714 is_valid = !is_valid;
1715
1716 if (cur_pos < sbi->blocks_per_seg)
1717 goto find_next;
1718
1719 release_discard_addr(entry);
1720 dcc->nr_discards -= total_len;
1721 }
1722
1723 wake_up_discard_thread(sbi, false);
1724}
1725
1726static int create_discard_cmd_control(struct f2fs_sb_info *sbi)
1727{
1728 dev_t dev = sbi->sb->s_bdev->bd_dev;
1729 struct discard_cmd_control *dcc;
1730 int err = 0, i;
1731
1732 if (SM_I(sbi)->dcc_info) {
1733 dcc = SM_I(sbi)->dcc_info;
1734 goto init_thread;
1735 }
1736
1737 dcc = f2fs_kzalloc(sbi, sizeof(struct discard_cmd_control), GFP_KERNEL);
1738 if (!dcc)
1739 return -ENOMEM;
1740
1741 dcc->discard_granularity = DEFAULT_DISCARD_GRANULARITY;
1742 INIT_LIST_HEAD(&dcc->entry_list);
1743 for (i = 0; i < MAX_PLIST_NUM; i++)
1744 INIT_LIST_HEAD(&dcc->pend_list[i]);
1745 INIT_LIST_HEAD(&dcc->wait_list);
1746 INIT_LIST_HEAD(&dcc->fstrim_list);
1747 mutex_init(&dcc->cmd_lock);
1748 atomic_set(&dcc->issued_discard, 0);
1749 atomic_set(&dcc->issing_discard, 0);
1750 atomic_set(&dcc->discard_cmd_cnt, 0);
1751 dcc->nr_discards = 0;
1752 dcc->max_discards = MAIN_SEGS(sbi) << sbi->log_blocks_per_seg;
1753 dcc->undiscard_blks = 0;
1754 dcc->root = RB_ROOT;
1755
1756 init_waitqueue_head(&dcc->discard_wait_queue);
1757 SM_I(sbi)->dcc_info = dcc;
1758init_thread:
1759 dcc->f2fs_issue_discard = kthread_run(issue_discard_thread, sbi,
1760 "f2fs_discard-%u:%u", MAJOR(dev), MINOR(dev));
1761 if (IS_ERR(dcc->f2fs_issue_discard)) {
1762 err = PTR_ERR(dcc->f2fs_issue_discard);
1763 kfree(dcc);
1764 SM_I(sbi)->dcc_info = NULL;
1765 return err;
1766 }
1767
1768 return err;
1769}
1770
1771static void destroy_discard_cmd_control(struct f2fs_sb_info *sbi)
1772{
1773 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
1774
1775 if (!dcc)
1776 return;
1777
1778 f2fs_stop_discard_thread(sbi);
1779
1780 kfree(dcc);
1781 SM_I(sbi)->dcc_info = NULL;
1782}
1783
1784static bool __mark_sit_entry_dirty(struct f2fs_sb_info *sbi, unsigned int segno)
1785{
1786 struct sit_info *sit_i = SIT_I(sbi);
1787
1788 if (!__test_and_set_bit(segno, sit_i->dirty_sentries_bitmap)) {
1789 sit_i->dirty_sentries++;
1790 return false;
1791 }
1792
1793 return true;
1794}
1795
1796static void __set_sit_entry_type(struct f2fs_sb_info *sbi, int type,
1797 unsigned int segno, int modified)
1798{
1799 struct seg_entry *se = get_seg_entry(sbi, segno);
1800 se->type = type;
1801 if (modified)
1802 __mark_sit_entry_dirty(sbi, segno);
1803}
1804
1805static void update_sit_entry(struct f2fs_sb_info *sbi, block_t blkaddr, int del)
1806{
1807 struct seg_entry *se;
1808 unsigned int segno, offset;
1809 long int new_vblocks;
1810 bool exist;
1811#ifdef CONFIG_F2FS_CHECK_FS
1812 bool mir_exist;
1813#endif
1814
1815 segno = GET_SEGNO(sbi, blkaddr);
1816
1817 se = get_seg_entry(sbi, segno);
1818 new_vblocks = se->valid_blocks + del;
1819 offset = GET_BLKOFF_FROM_SEG0(sbi, blkaddr);
1820
1821 f2fs_bug_on(sbi, (new_vblocks >> (sizeof(unsigned short) << 3) ||
1822 (new_vblocks > sbi->blocks_per_seg)));
1823
1824 se->valid_blocks = new_vblocks;
1825 se->mtime = get_mtime(sbi, false);
1826 if (se->mtime > SIT_I(sbi)->max_mtime)
1827 SIT_I(sbi)->max_mtime = se->mtime;
1828
1829
1830 if (del > 0) {
1831 exist = f2fs_test_and_set_bit(offset, se->cur_valid_map);
1832#ifdef CONFIG_F2FS_CHECK_FS
1833 mir_exist = f2fs_test_and_set_bit(offset,
1834 se->cur_valid_map_mir);
1835 if (unlikely(exist != mir_exist)) {
1836 f2fs_msg(sbi->sb, KERN_ERR, "Inconsistent error "
1837 "when setting bitmap, blk:%u, old bit:%d",
1838 blkaddr, exist);
1839 f2fs_bug_on(sbi, 1);
1840 }
1841#endif
1842 if (unlikely(exist)) {
1843 f2fs_msg(sbi->sb, KERN_ERR,
1844 "Bitmap was wrongly set, blk:%u", blkaddr);
1845 f2fs_bug_on(sbi, 1);
1846 se->valid_blocks--;
1847 del = 0;
1848 }
1849
1850 if (f2fs_discard_en(sbi) &&
1851 !f2fs_test_and_set_bit(offset, se->discard_map))
1852 sbi->discard_blks--;
1853
1854
1855 if (IS_NODESEG(se->type)) {
1856 if (!f2fs_test_and_set_bit(offset, se->ckpt_valid_map))
1857 se->ckpt_valid_blocks++;
1858 }
1859 } else {
1860 exist = f2fs_test_and_clear_bit(offset, se->cur_valid_map);
1861#ifdef CONFIG_F2FS_CHECK_FS
1862 mir_exist = f2fs_test_and_clear_bit(offset,
1863 se->cur_valid_map_mir);
1864 if (unlikely(exist != mir_exist)) {
1865 f2fs_msg(sbi->sb, KERN_ERR, "Inconsistent error "
1866 "when clearing bitmap, blk:%u, old bit:%d",
1867 blkaddr, exist);
1868 f2fs_bug_on(sbi, 1);
1869 }
1870#endif
1871 if (unlikely(!exist)) {
1872 f2fs_msg(sbi->sb, KERN_ERR,
1873 "Bitmap was wrongly cleared, blk:%u", blkaddr);
1874 f2fs_bug_on(sbi, 1);
1875 se->valid_blocks++;
1876 del = 0;
1877 }
1878
1879 if (f2fs_discard_en(sbi) &&
1880 f2fs_test_and_clear_bit(offset, se->discard_map))
1881 sbi->discard_blks++;
1882 }
1883 if (!f2fs_test_bit(offset, se->ckpt_valid_map))
1884 se->ckpt_valid_blocks += del;
1885
1886 __mark_sit_entry_dirty(sbi, segno);
1887
1888
1889 SIT_I(sbi)->written_valid_blocks += del;
1890
1891 if (sbi->segs_per_sec > 1)
1892 get_sec_entry(sbi, segno)->valid_blocks += del;
1893}
1894
1895void f2fs_invalidate_blocks(struct f2fs_sb_info *sbi, block_t addr)
1896{
1897 unsigned int segno = GET_SEGNO(sbi, addr);
1898 struct sit_info *sit_i = SIT_I(sbi);
1899
1900 f2fs_bug_on(sbi, addr == NULL_ADDR);
1901 if (addr == NEW_ADDR)
1902 return;
1903
1904
1905 down_write(&sit_i->sentry_lock);
1906
1907 update_sit_entry(sbi, addr, -1);
1908
1909
1910 locate_dirty_segment(sbi, segno);
1911
1912 up_write(&sit_i->sentry_lock);
1913}
1914
1915bool f2fs_is_checkpointed_data(struct f2fs_sb_info *sbi, block_t blkaddr)
1916{
1917 struct sit_info *sit_i = SIT_I(sbi);
1918 unsigned int segno, offset;
1919 struct seg_entry *se;
1920 bool is_cp = false;
1921
1922 if (!is_valid_blkaddr(blkaddr))
1923 return true;
1924
1925 down_read(&sit_i->sentry_lock);
1926
1927 segno = GET_SEGNO(sbi, blkaddr);
1928 se = get_seg_entry(sbi, segno);
1929 offset = GET_BLKOFF_FROM_SEG0(sbi, blkaddr);
1930
1931 if (f2fs_test_bit(offset, se->ckpt_valid_map))
1932 is_cp = true;
1933
1934 up_read(&sit_i->sentry_lock);
1935
1936 return is_cp;
1937}
1938
1939
1940
1941
1942static void __add_sum_entry(struct f2fs_sb_info *sbi, int type,
1943 struct f2fs_summary *sum)
1944{
1945 struct curseg_info *curseg = CURSEG_I(sbi, type);
1946 void *addr = curseg->sum_blk;
1947 addr += curseg->next_blkoff * sizeof(struct f2fs_summary);
1948 memcpy(addr, sum, sizeof(struct f2fs_summary));
1949}
1950
1951
1952
1953
1954int f2fs_npages_for_summary_flush(struct f2fs_sb_info *sbi, bool for_ra)
1955{
1956 int valid_sum_count = 0;
1957 int i, sum_in_page;
1958
1959 for (i = CURSEG_HOT_DATA; i <= CURSEG_COLD_DATA; i++) {
1960 if (sbi->ckpt->alloc_type[i] == SSR)
1961 valid_sum_count += sbi->blocks_per_seg;
1962 else {
1963 if (for_ra)
1964 valid_sum_count += le16_to_cpu(
1965 F2FS_CKPT(sbi)->cur_data_blkoff[i]);
1966 else
1967 valid_sum_count += curseg_blkoff(sbi, i);
1968 }
1969 }
1970
1971 sum_in_page = (PAGE_SIZE - 2 * SUM_JOURNAL_SIZE -
1972 SUM_FOOTER_SIZE) / SUMMARY_SIZE;
1973 if (valid_sum_count <= sum_in_page)
1974 return 1;
1975 else if ((valid_sum_count - sum_in_page) <=
1976 (PAGE_SIZE - SUM_FOOTER_SIZE) / SUMMARY_SIZE)
1977 return 2;
1978 return 3;
1979}
1980
1981
1982
1983
1984struct page *f2fs_get_sum_page(struct f2fs_sb_info *sbi, unsigned int segno)
1985{
1986 return f2fs_get_meta_page(sbi, GET_SUM_BLOCK(sbi, segno));
1987}
1988
1989void f2fs_update_meta_page(struct f2fs_sb_info *sbi,
1990 void *src, block_t blk_addr)
1991{
1992 struct page *page = f2fs_grab_meta_page(sbi, blk_addr);
1993
1994 memcpy(page_address(page), src, PAGE_SIZE);
1995 set_page_dirty(page);
1996 f2fs_put_page(page, 1);
1997}
1998
1999static void write_sum_page(struct f2fs_sb_info *sbi,
2000 struct f2fs_summary_block *sum_blk, block_t blk_addr)
2001{
2002 f2fs_update_meta_page(sbi, (void *)sum_blk, blk_addr);
2003}
2004
2005static void write_current_sum_page(struct f2fs_sb_info *sbi,
2006 int type, block_t blk_addr)
2007{
2008 struct curseg_info *curseg = CURSEG_I(sbi, type);
2009 struct page *page = f2fs_grab_meta_page(sbi, blk_addr);
2010 struct f2fs_summary_block *src = curseg->sum_blk;
2011 struct f2fs_summary_block *dst;
2012
2013 dst = (struct f2fs_summary_block *)page_address(page);
2014 memset(dst, 0, PAGE_SIZE);
2015
2016 mutex_lock(&curseg->curseg_mutex);
2017
2018 down_read(&curseg->journal_rwsem);
2019 memcpy(&dst->journal, curseg->journal, SUM_JOURNAL_SIZE);
2020 up_read(&curseg->journal_rwsem);
2021
2022 memcpy(dst->entries, src->entries, SUM_ENTRY_SIZE);
2023 memcpy(&dst->footer, &src->footer, SUM_FOOTER_SIZE);
2024
2025 mutex_unlock(&curseg->curseg_mutex);
2026
2027 set_page_dirty(page);
2028 f2fs_put_page(page, 1);
2029}
2030
2031static int is_next_segment_free(struct f2fs_sb_info *sbi, int type)
2032{
2033 struct curseg_info *curseg = CURSEG_I(sbi, type);
2034 unsigned int segno = curseg->segno + 1;
2035 struct free_segmap_info *free_i = FREE_I(sbi);
2036
2037 if (segno < MAIN_SEGS(sbi) && segno % sbi->segs_per_sec)
2038 return !test_bit(segno, free_i->free_segmap);
2039 return 0;
2040}
2041
2042
2043
2044
2045
2046static void get_new_segment(struct f2fs_sb_info *sbi,
2047 unsigned int *newseg, bool new_sec, int dir)
2048{
2049 struct free_segmap_info *free_i = FREE_I(sbi);
2050 unsigned int segno, secno, zoneno;
2051 unsigned int total_zones = MAIN_SECS(sbi) / sbi->secs_per_zone;
2052 unsigned int hint = GET_SEC_FROM_SEG(sbi, *newseg);
2053 unsigned int old_zoneno = GET_ZONE_FROM_SEG(sbi, *newseg);
2054 unsigned int left_start = hint;
2055 bool init = true;
2056 int go_left = 0;
2057 int i;
2058
2059 spin_lock(&free_i->segmap_lock);
2060
2061 if (!new_sec && ((*newseg + 1) % sbi->segs_per_sec)) {
2062 segno = find_next_zero_bit(free_i->free_segmap,
2063 GET_SEG_FROM_SEC(sbi, hint + 1), *newseg + 1);
2064 if (segno < GET_SEG_FROM_SEC(sbi, hint + 1))
2065 goto got_it;
2066 }
2067find_other_zone:
2068 secno = find_next_zero_bit(free_i->free_secmap, MAIN_SECS(sbi), hint);
2069 if (secno >= MAIN_SECS(sbi)) {
2070 if (dir == ALLOC_RIGHT) {
2071 secno = find_next_zero_bit(free_i->free_secmap,
2072 MAIN_SECS(sbi), 0);
2073 f2fs_bug_on(sbi, secno >= MAIN_SECS(sbi));
2074 } else {
2075 go_left = 1;
2076 left_start = hint - 1;
2077 }
2078 }
2079 if (go_left == 0)
2080 goto skip_left;
2081
2082 while (test_bit(left_start, free_i->free_secmap)) {
2083 if (left_start > 0) {
2084 left_start--;
2085 continue;
2086 }
2087 left_start = find_next_zero_bit(free_i->free_secmap,
2088 MAIN_SECS(sbi), 0);
2089 f2fs_bug_on(sbi, left_start >= MAIN_SECS(sbi));
2090 break;
2091 }
2092 secno = left_start;
2093skip_left:
2094 segno = GET_SEG_FROM_SEC(sbi, secno);
2095 zoneno = GET_ZONE_FROM_SEC(sbi, secno);
2096
2097
2098 if (!init)
2099 goto got_it;
2100 if (sbi->secs_per_zone == 1)
2101 goto got_it;
2102 if (zoneno == old_zoneno)
2103 goto got_it;
2104 if (dir == ALLOC_LEFT) {
2105 if (!go_left && zoneno + 1 >= total_zones)
2106 goto got_it;
2107 if (go_left && zoneno == 0)
2108 goto got_it;
2109 }
2110 for (i = 0; i < NR_CURSEG_TYPE; i++)
2111 if (CURSEG_I(sbi, i)->zone == zoneno)
2112 break;
2113
2114 if (i < NR_CURSEG_TYPE) {
2115
2116 if (go_left)
2117 hint = zoneno * sbi->secs_per_zone - 1;
2118 else if (zoneno + 1 >= total_zones)
2119 hint = 0;
2120 else
2121 hint = (zoneno + 1) * sbi->secs_per_zone;
2122 init = false;
2123 goto find_other_zone;
2124 }
2125got_it:
2126
2127 f2fs_bug_on(sbi, test_bit(segno, free_i->free_segmap));
2128 __set_inuse(sbi, segno);
2129 *newseg = segno;
2130 spin_unlock(&free_i->segmap_lock);
2131}
2132
2133static void reset_curseg(struct f2fs_sb_info *sbi, int type, int modified)
2134{
2135 struct curseg_info *curseg = CURSEG_I(sbi, type);
2136 struct summary_footer *sum_footer;
2137
2138 curseg->segno = curseg->next_segno;
2139 curseg->zone = GET_ZONE_FROM_SEG(sbi, curseg->segno);
2140 curseg->next_blkoff = 0;
2141 curseg->next_segno = NULL_SEGNO;
2142
2143 sum_footer = &(curseg->sum_blk->footer);
2144 memset(sum_footer, 0, sizeof(struct summary_footer));
2145 if (IS_DATASEG(type))
2146 SET_SUM_TYPE(sum_footer, SUM_TYPE_DATA);
2147 if (IS_NODESEG(type))
2148 SET_SUM_TYPE(sum_footer, SUM_TYPE_NODE);
2149 __set_sit_entry_type(sbi, type, curseg->segno, modified);
2150}
2151
2152static unsigned int __get_next_segno(struct f2fs_sb_info *sbi, int type)
2153{
2154
2155 if (sbi->segs_per_sec != 1)
2156 return CURSEG_I(sbi, type)->segno;
2157
2158 if (test_opt(sbi, NOHEAP) &&
2159 (type == CURSEG_HOT_DATA || IS_NODESEG(type)))
2160 return 0;
2161
2162 if (SIT_I(sbi)->last_victim[ALLOC_NEXT])
2163 return SIT_I(sbi)->last_victim[ALLOC_NEXT];
2164
2165
2166 if (F2FS_OPTION(sbi).alloc_mode == ALLOC_MODE_REUSE)
2167 return 0;
2168
2169 return CURSEG_I(sbi, type)->segno;
2170}
2171
2172
2173
2174
2175
2176static void new_curseg(struct f2fs_sb_info *sbi, int type, bool new_sec)
2177{
2178 struct curseg_info *curseg = CURSEG_I(sbi, type);
2179 unsigned int segno = curseg->segno;
2180 int dir = ALLOC_LEFT;
2181
2182 write_sum_page(sbi, curseg->sum_blk,
2183 GET_SUM_BLOCK(sbi, segno));
2184 if (type == CURSEG_WARM_DATA || type == CURSEG_COLD_DATA)
2185 dir = ALLOC_RIGHT;
2186
2187 if (test_opt(sbi, NOHEAP))
2188 dir = ALLOC_RIGHT;
2189
2190 segno = __get_next_segno(sbi, type);
2191 get_new_segment(sbi, &segno, new_sec, dir);
2192 curseg->next_segno = segno;
2193 reset_curseg(sbi, type, 1);
2194 curseg->alloc_type = LFS;
2195}
2196
2197static void __next_free_blkoff(struct f2fs_sb_info *sbi,
2198 struct curseg_info *seg, block_t start)
2199{
2200 struct seg_entry *se = get_seg_entry(sbi, seg->segno);
2201 int entries = SIT_VBLOCK_MAP_SIZE / sizeof(unsigned long);
2202 unsigned long *target_map = SIT_I(sbi)->tmp_map;
2203 unsigned long *ckpt_map = (unsigned long *)se->ckpt_valid_map;
2204 unsigned long *cur_map = (unsigned long *)se->cur_valid_map;
2205 int i, pos;
2206
2207 for (i = 0; i < entries; i++)
2208 target_map[i] = ckpt_map[i] | cur_map[i];
2209
2210 pos = __find_rev_next_zero_bit(target_map, sbi->blocks_per_seg, start);
2211
2212 seg->next_blkoff = pos;
2213}
2214
2215
2216
2217
2218
2219
2220static void __refresh_next_blkoff(struct f2fs_sb_info *sbi,
2221 struct curseg_info *seg)
2222{
2223 if (seg->alloc_type == SSR)
2224 __next_free_blkoff(sbi, seg, seg->next_blkoff + 1);
2225 else
2226 seg->next_blkoff++;
2227}
2228
2229
2230
2231
2232
2233static void change_curseg(struct f2fs_sb_info *sbi, int type)
2234{
2235 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
2236 struct curseg_info *curseg = CURSEG_I(sbi, type);
2237 unsigned int new_segno = curseg->next_segno;
2238 struct f2fs_summary_block *sum_node;
2239 struct page *sum_page;
2240
2241 write_sum_page(sbi, curseg->sum_blk,
2242 GET_SUM_BLOCK(sbi, curseg->segno));
2243 __set_test_and_inuse(sbi, new_segno);
2244
2245 mutex_lock(&dirty_i->seglist_lock);
2246 __remove_dirty_segment(sbi, new_segno, PRE);
2247 __remove_dirty_segment(sbi, new_segno, DIRTY);
2248 mutex_unlock(&dirty_i->seglist_lock);
2249
2250 reset_curseg(sbi, type, 1);
2251 curseg->alloc_type = SSR;
2252 __next_free_blkoff(sbi, curseg, 0);
2253
2254 sum_page = f2fs_get_sum_page(sbi, new_segno);
2255 sum_node = (struct f2fs_summary_block *)page_address(sum_page);
2256 memcpy(curseg->sum_blk, sum_node, SUM_ENTRY_SIZE);
2257 f2fs_put_page(sum_page, 1);
2258}
2259
2260static int get_ssr_segment(struct f2fs_sb_info *sbi, int type)
2261{
2262 struct curseg_info *curseg = CURSEG_I(sbi, type);
2263 const struct victim_selection *v_ops = DIRTY_I(sbi)->v_ops;
2264 unsigned segno = NULL_SEGNO;
2265 int i, cnt;
2266 bool reversed = false;
2267
2268
2269 if (v_ops->get_victim(sbi, &segno, BG_GC, type, SSR)) {
2270 curseg->next_segno = segno;
2271 return 1;
2272 }
2273
2274
2275 if (IS_NODESEG(type)) {
2276 if (type >= CURSEG_WARM_NODE) {
2277 reversed = true;
2278 i = CURSEG_COLD_NODE;
2279 } else {
2280 i = CURSEG_HOT_NODE;
2281 }
2282 cnt = NR_CURSEG_NODE_TYPE;
2283 } else {
2284 if (type >= CURSEG_WARM_DATA) {
2285 reversed = true;
2286 i = CURSEG_COLD_DATA;
2287 } else {
2288 i = CURSEG_HOT_DATA;
2289 }
2290 cnt = NR_CURSEG_DATA_TYPE;
2291 }
2292
2293 for (; cnt-- > 0; reversed ? i-- : i++) {
2294 if (i == type)
2295 continue;
2296 if (v_ops->get_victim(sbi, &segno, BG_GC, i, SSR)) {
2297 curseg->next_segno = segno;
2298 return 1;
2299 }
2300 }
2301 return 0;
2302}
2303
2304
2305
2306
2307
2308static void allocate_segment_by_default(struct f2fs_sb_info *sbi,
2309 int type, bool force)
2310{
2311 struct curseg_info *curseg = CURSEG_I(sbi, type);
2312
2313 if (force)
2314 new_curseg(sbi, type, true);
2315 else if (!is_set_ckpt_flags(sbi, CP_CRC_RECOVERY_FLAG) &&
2316 type == CURSEG_WARM_NODE)
2317 new_curseg(sbi, type, false);
2318 else if (curseg->alloc_type == LFS && is_next_segment_free(sbi, type))
2319 new_curseg(sbi, type, false);
2320 else if (f2fs_need_SSR(sbi) && get_ssr_segment(sbi, type))
2321 change_curseg(sbi, type);
2322 else
2323 new_curseg(sbi, type, false);
2324
2325 stat_inc_seg_type(sbi, curseg);
2326}
2327
2328void f2fs_allocate_new_segments(struct f2fs_sb_info *sbi)
2329{
2330 struct curseg_info *curseg;
2331 unsigned int old_segno;
2332 int i;
2333
2334 down_write(&SIT_I(sbi)->sentry_lock);
2335
2336 for (i = CURSEG_HOT_DATA; i <= CURSEG_COLD_DATA; i++) {
2337 curseg = CURSEG_I(sbi, i);
2338 old_segno = curseg->segno;
2339 SIT_I(sbi)->s_ops->allocate_segment(sbi, i, true);
2340 locate_dirty_segment(sbi, old_segno);
2341 }
2342
2343 up_write(&SIT_I(sbi)->sentry_lock);
2344}
2345
2346static const struct segment_allocation default_salloc_ops = {
2347 .allocate_segment = allocate_segment_by_default,
2348};
2349
2350bool f2fs_exist_trim_candidates(struct f2fs_sb_info *sbi,
2351 struct cp_control *cpc)
2352{
2353 __u64 trim_start = cpc->trim_start;
2354 bool has_candidate = false;
2355
2356 down_write(&SIT_I(sbi)->sentry_lock);
2357 for (; cpc->trim_start <= cpc->trim_end; cpc->trim_start++) {
2358 if (add_discard_addrs(sbi, cpc, true)) {
2359 has_candidate = true;
2360 break;
2361 }
2362 }
2363 up_write(&SIT_I(sbi)->sentry_lock);
2364
2365 cpc->trim_start = trim_start;
2366 return has_candidate;
2367}
2368
2369static void __issue_discard_cmd_range(struct f2fs_sb_info *sbi,
2370 struct discard_policy *dpolicy,
2371 unsigned int start, unsigned int end)
2372{
2373 struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
2374 struct discard_cmd *prev_dc = NULL, *next_dc = NULL;
2375 struct rb_node **insert_p = NULL, *insert_parent = NULL;
2376 struct discard_cmd *dc;
2377 struct blk_plug plug;
2378 int issued;
2379
2380next:
2381 issued = 0;
2382
2383 mutex_lock(&dcc->cmd_lock);
2384 f2fs_bug_on(sbi, !f2fs_check_rb_tree_consistence(sbi, &dcc->root));
2385
2386 dc = (struct discard_cmd *)f2fs_lookup_rb_tree_ret(&dcc->root,
2387 NULL, start,
2388 (struct rb_entry **)&prev_dc,
2389 (struct rb_entry **)&next_dc,
2390 &insert_p, &insert_parent, true);
2391 if (!dc)
2392 dc = next_dc;
2393
2394 blk_start_plug(&plug);
2395
2396 while (dc && dc->lstart <= end) {
2397 struct rb_node *node;
2398
2399 if (dc->len < dpolicy->granularity)
2400 goto skip;
2401
2402 if (dc->state != D_PREP) {
2403 list_move_tail(&dc->list, &dcc->fstrim_list);
2404 goto skip;
2405 }
2406
2407 __submit_discard_cmd(sbi, dpolicy, dc);
2408
2409 if (++issued >= dpolicy->max_requests) {
2410 start = dc->lstart + dc->len;
2411
2412 blk_finish_plug(&plug);
2413 mutex_unlock(&dcc->cmd_lock);
2414 __wait_all_discard_cmd(sbi, NULL);
2415 congestion_wait(BLK_RW_ASYNC, HZ/50);
2416 goto next;
2417 }
2418skip:
2419 node = rb_next(&dc->rb_node);
2420 dc = rb_entry_safe(node, struct discard_cmd, rb_node);
2421
2422 if (fatal_signal_pending(current))
2423 break;
2424 }
2425
2426 blk_finish_plug(&plug);
2427 mutex_unlock(&dcc->cmd_lock);
2428}
2429
2430int f2fs_trim_fs(struct f2fs_sb_info *sbi, struct fstrim_range *range)
2431{
2432 __u64 start = F2FS_BYTES_TO_BLK(range->start);
2433 __u64 end = start + F2FS_BYTES_TO_BLK(range->len) - 1;
2434 unsigned int start_segno, end_segno;
2435 block_t start_block, end_block;
2436 struct cp_control cpc;
2437 struct discard_policy dpolicy;
2438 unsigned long long trimmed = 0;
2439 int err = 0;
2440
2441 if (start >= MAX_BLKADDR(sbi) || range->len < sbi->blocksize)
2442 return -EINVAL;
2443
2444 if (end <= MAIN_BLKADDR(sbi))
2445 return -EINVAL;
2446
2447 if (is_sbi_flag_set(sbi, SBI_NEED_FSCK)) {
2448 f2fs_msg(sbi->sb, KERN_WARNING,
2449 "Found FS corruption, run fsck to fix.");
2450 return -EIO;
2451 }
2452
2453
2454 start_segno = (start <= MAIN_BLKADDR(sbi)) ? 0 : GET_SEGNO(sbi, start);
2455 end_segno = (end >= MAX_BLKADDR(sbi)) ? MAIN_SEGS(sbi) - 1 :
2456 GET_SEGNO(sbi, end);
2457
2458 cpc.reason = CP_DISCARD;
2459 cpc.trim_minlen = max_t(__u64, 1, F2FS_BYTES_TO_BLK(range->minlen));
2460 cpc.trim_start = start_segno;
2461 cpc.trim_end = end_segno;
2462
2463 if (sbi->discard_blks == 0)
2464 goto out;
2465
2466 mutex_lock(&sbi->gc_mutex);
2467 err = f2fs_write_checkpoint(sbi, &cpc);
2468 mutex_unlock(&sbi->gc_mutex);
2469 if (err)
2470 goto out;
2471
2472 start_block = START_BLOCK(sbi, start_segno);
2473 end_block = START_BLOCK(sbi, end_segno + 1);
2474
2475 __init_discard_policy(sbi, &dpolicy, DPOLICY_FSTRIM, cpc.trim_minlen);
2476 __issue_discard_cmd_range(sbi, &dpolicy, start_block, end_block);
2477
2478
2479
2480
2481
2482
2483
2484 if (!test_opt(sbi, DISCARD)) {
2485 trimmed = __wait_discard_cmd_range(sbi, &dpolicy,
2486 start_block, end_block);
2487 range->len = F2FS_BLK_TO_BYTES(trimmed);
2488 }
2489out:
2490 return err;
2491}
2492
2493static bool __has_curseg_space(struct f2fs_sb_info *sbi, int type)
2494{
2495 struct curseg_info *curseg = CURSEG_I(sbi, type);
2496 if (curseg->next_blkoff < sbi->blocks_per_seg)
2497 return true;
2498 return false;
2499}
2500
2501int f2fs_rw_hint_to_seg_type(enum rw_hint hint)
2502{
2503 switch (hint) {
2504 case WRITE_LIFE_SHORT:
2505 return CURSEG_HOT_DATA;
2506 case WRITE_LIFE_EXTREME:
2507 return CURSEG_COLD_DATA;
2508 default:
2509 return CURSEG_WARM_DATA;
2510 }
2511}
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574enum rw_hint f2fs_io_type_to_rw_hint(struct f2fs_sb_info *sbi,
2575 enum page_type type, enum temp_type temp)
2576{
2577 if (F2FS_OPTION(sbi).whint_mode == WHINT_MODE_USER) {
2578 if (type == DATA) {
2579 if (temp == WARM)
2580 return WRITE_LIFE_NOT_SET;
2581 else if (temp == HOT)
2582 return WRITE_LIFE_SHORT;
2583 else if (temp == COLD)
2584 return WRITE_LIFE_EXTREME;
2585 } else {
2586 return WRITE_LIFE_NOT_SET;
2587 }
2588 } else if (F2FS_OPTION(sbi).whint_mode == WHINT_MODE_FS) {
2589 if (type == DATA) {
2590 if (temp == WARM)
2591 return WRITE_LIFE_LONG;
2592 else if (temp == HOT)
2593 return WRITE_LIFE_SHORT;
2594 else if (temp == COLD)
2595 return WRITE_LIFE_EXTREME;
2596 } else if (type == NODE) {
2597 if (temp == WARM || temp == HOT)
2598 return WRITE_LIFE_NOT_SET;
2599 else if (temp == COLD)
2600 return WRITE_LIFE_NONE;
2601 } else if (type == META) {
2602 return WRITE_LIFE_MEDIUM;
2603 }
2604 }
2605 return WRITE_LIFE_NOT_SET;
2606}
2607
2608static int __get_segment_type_2(struct f2fs_io_info *fio)
2609{
2610 if (fio->type == DATA)
2611 return CURSEG_HOT_DATA;
2612 else
2613 return CURSEG_HOT_NODE;
2614}
2615
2616static int __get_segment_type_4(struct f2fs_io_info *fio)
2617{
2618 if (fio->type == DATA) {
2619 struct inode *inode = fio->page->mapping->host;
2620
2621 if (S_ISDIR(inode->i_mode))
2622 return CURSEG_HOT_DATA;
2623 else
2624 return CURSEG_COLD_DATA;
2625 } else {
2626 if (IS_DNODE(fio->page) && is_cold_node(fio->page))
2627 return CURSEG_WARM_NODE;
2628 else
2629 return CURSEG_COLD_NODE;
2630 }
2631}
2632
2633static int __get_segment_type_6(struct f2fs_io_info *fio)
2634{
2635 if (fio->type == DATA) {
2636 struct inode *inode = fio->page->mapping->host;
2637
2638 if (is_cold_data(fio->page) || file_is_cold(inode))
2639 return CURSEG_COLD_DATA;
2640 if (file_is_hot(inode) ||
2641 is_inode_flag_set(inode, FI_HOT_DATA) ||
2642 is_inode_flag_set(inode, FI_ATOMIC_FILE) ||
2643 is_inode_flag_set(inode, FI_VOLATILE_FILE))
2644 return CURSEG_HOT_DATA;
2645 return f2fs_rw_hint_to_seg_type(inode->i_write_hint);
2646 } else {
2647 if (IS_DNODE(fio->page))
2648 return is_cold_node(fio->page) ? CURSEG_WARM_NODE :
2649 CURSEG_HOT_NODE;
2650 return CURSEG_COLD_NODE;
2651 }
2652}
2653
2654static int __get_segment_type(struct f2fs_io_info *fio)
2655{
2656 int type = 0;
2657
2658 switch (F2FS_OPTION(fio->sbi).active_logs) {
2659 case 2:
2660 type = __get_segment_type_2(fio);
2661 break;
2662 case 4:
2663 type = __get_segment_type_4(fio);
2664 break;
2665 case 6:
2666 type = __get_segment_type_6(fio);
2667 break;
2668 default:
2669 f2fs_bug_on(fio->sbi, true);
2670 }
2671
2672 if (IS_HOT(type))
2673 fio->temp = HOT;
2674 else if (IS_WARM(type))
2675 fio->temp = WARM;
2676 else
2677 fio->temp = COLD;
2678 return type;
2679}
2680
2681void f2fs_allocate_data_block(struct f2fs_sb_info *sbi, struct page *page,
2682 block_t old_blkaddr, block_t *new_blkaddr,
2683 struct f2fs_summary *sum, int type,
2684 struct f2fs_io_info *fio, bool add_list)
2685{
2686 struct sit_info *sit_i = SIT_I(sbi);
2687 struct curseg_info *curseg = CURSEG_I(sbi, type);
2688
2689 down_read(&SM_I(sbi)->curseg_lock);
2690
2691 mutex_lock(&curseg->curseg_mutex);
2692 down_write(&sit_i->sentry_lock);
2693
2694 *new_blkaddr = NEXT_FREE_BLKADDR(sbi, curseg);
2695
2696 f2fs_wait_discard_bio(sbi, *new_blkaddr);
2697
2698
2699
2700
2701
2702
2703 __add_sum_entry(sbi, type, sum);
2704
2705 __refresh_next_blkoff(sbi, curseg);
2706
2707 stat_inc_block_count(sbi, curseg);
2708
2709
2710
2711
2712
2713 update_sit_entry(sbi, *new_blkaddr, 1);
2714 if (GET_SEGNO(sbi, old_blkaddr) != NULL_SEGNO)
2715 update_sit_entry(sbi, old_blkaddr, -1);
2716
2717 if (!__has_curseg_space(sbi, type))
2718 sit_i->s_ops->allocate_segment(sbi, type, false);
2719
2720
2721
2722
2723
2724
2725 locate_dirty_segment(sbi, GET_SEGNO(sbi, old_blkaddr));
2726 locate_dirty_segment(sbi, GET_SEGNO(sbi, *new_blkaddr));
2727
2728 up_write(&sit_i->sentry_lock);
2729
2730 if (page && IS_NODESEG(type)) {
2731 fill_node_footer_blkaddr(page, NEXT_FREE_BLKADDR(sbi, curseg));
2732
2733 f2fs_inode_chksum_set(sbi, page);
2734 }
2735
2736 if (add_list) {
2737 struct f2fs_bio_info *io;
2738
2739 INIT_LIST_HEAD(&fio->list);
2740 fio->in_list = true;
2741 fio->retry = false;
2742 io = sbi->write_io[fio->type] + fio->temp;
2743 spin_lock(&io->io_lock);
2744 list_add_tail(&fio->list, &io->io_list);
2745 spin_unlock(&io->io_lock);
2746 }
2747
2748 mutex_unlock(&curseg->curseg_mutex);
2749
2750 up_read(&SM_I(sbi)->curseg_lock);
2751}
2752
2753static void update_device_state(struct f2fs_io_info *fio)
2754{
2755 struct f2fs_sb_info *sbi = fio->sbi;
2756 unsigned int devidx;
2757
2758 if (!sbi->s_ndevs)
2759 return;
2760
2761 devidx = f2fs_target_device_index(sbi, fio->new_blkaddr);
2762
2763
2764 f2fs_set_dirty_device(sbi, fio->ino, devidx, FLUSH_INO);
2765
2766
2767 if (!f2fs_test_bit(devidx, (char *)&sbi->dirty_device)) {
2768 spin_lock(&sbi->dev_lock);
2769 f2fs_set_bit(devidx, (char *)&sbi->dirty_device);
2770 spin_unlock(&sbi->dev_lock);
2771 }
2772}
2773
2774static void do_write_page(struct f2fs_summary *sum, struct f2fs_io_info *fio)
2775{
2776 int type = __get_segment_type(fio);
2777 bool keep_order = (test_opt(fio->sbi, LFS) && type == CURSEG_COLD_DATA);
2778
2779 if (keep_order)
2780 down_read(&fio->sbi->io_order_lock);
2781reallocate:
2782 f2fs_allocate_data_block(fio->sbi, fio->page, fio->old_blkaddr,
2783 &fio->new_blkaddr, sum, type, fio, true);
2784
2785
2786 f2fs_submit_page_write(fio);
2787 if (fio->retry) {
2788 fio->old_blkaddr = fio->new_blkaddr;
2789 goto reallocate;
2790 }
2791
2792 update_device_state(fio);
2793
2794 if (keep_order)
2795 up_read(&fio->sbi->io_order_lock);
2796}
2797
2798void f2fs_do_write_meta_page(struct f2fs_sb_info *sbi, struct page *page,
2799 enum iostat_type io_type)
2800{
2801 struct f2fs_io_info fio = {
2802 .sbi = sbi,
2803 .type = META,
2804 .temp = HOT,
2805 .op = REQ_OP_WRITE,
2806 .op_flags = REQ_SYNC | REQ_META | REQ_PRIO,
2807 .old_blkaddr = page->index,
2808 .new_blkaddr = page->index,
2809 .page = page,
2810 .encrypted_page = NULL,
2811 .in_list = false,
2812 };
2813
2814 if (unlikely(page->index >= MAIN_BLKADDR(sbi)))
2815 fio.op_flags &= ~REQ_META;
2816
2817 set_page_writeback(page);
2818 ClearPageError(page);
2819 f2fs_submit_page_write(&fio);
2820
2821 f2fs_update_iostat(sbi, io_type, F2FS_BLKSIZE);
2822}
2823
2824void f2fs_do_write_node_page(unsigned int nid, struct f2fs_io_info *fio)
2825{
2826 struct f2fs_summary sum;
2827
2828 set_summary(&sum, nid, 0, 0);
2829 do_write_page(&sum, fio);
2830
2831 f2fs_update_iostat(fio->sbi, fio->io_type, F2FS_BLKSIZE);
2832}
2833
2834void f2fs_outplace_write_data(struct dnode_of_data *dn,
2835 struct f2fs_io_info *fio)
2836{
2837 struct f2fs_sb_info *sbi = fio->sbi;
2838 struct f2fs_summary sum;
2839 struct node_info ni;
2840
2841 f2fs_bug_on(sbi, dn->data_blkaddr == NULL_ADDR);
2842 f2fs_get_node_info(sbi, dn->nid, &ni);
2843 set_summary(&sum, dn->nid, dn->ofs_in_node, ni.version);
2844 do_write_page(&sum, fio);
2845 f2fs_update_data_blkaddr(dn, fio->new_blkaddr);
2846
2847 f2fs_update_iostat(sbi, fio->io_type, F2FS_BLKSIZE);
2848}
2849
2850int f2fs_inplace_write_data(struct f2fs_io_info *fio)
2851{
2852 int err;
2853 struct f2fs_sb_info *sbi = fio->sbi;
2854
2855 fio->new_blkaddr = fio->old_blkaddr;
2856
2857 __get_segment_type(fio);
2858
2859 f2fs_bug_on(sbi, !IS_DATASEG(get_seg_entry(sbi,
2860 GET_SEGNO(sbi, fio->new_blkaddr))->type));
2861
2862 stat_inc_inplace_blocks(fio->sbi);
2863
2864 err = f2fs_submit_page_bio(fio);
2865 if (!err)
2866 update_device_state(fio);
2867
2868 f2fs_update_iostat(fio->sbi, fio->io_type, F2FS_BLKSIZE);
2869
2870 return err;
2871}
2872
2873static inline int __f2fs_get_curseg(struct f2fs_sb_info *sbi,
2874 unsigned int segno)
2875{
2876 int i;
2877
2878 for (i = CURSEG_HOT_DATA; i < NO_CHECK_TYPE; i++) {
2879 if (CURSEG_I(sbi, i)->segno == segno)
2880 break;
2881 }
2882 return i;
2883}
2884
2885void f2fs_do_replace_block(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,
2886 block_t old_blkaddr, block_t new_blkaddr,
2887 bool recover_curseg, bool recover_newaddr)
2888{
2889 struct sit_info *sit_i = SIT_I(sbi);
2890 struct curseg_info *curseg;
2891 unsigned int segno, old_cursegno;
2892 struct seg_entry *se;
2893 int type;
2894 unsigned short old_blkoff;
2895
2896 segno = GET_SEGNO(sbi, new_blkaddr);
2897 se = get_seg_entry(sbi, segno);
2898 type = se->type;
2899
2900 down_write(&SM_I(sbi)->curseg_lock);
2901
2902 if (!recover_curseg) {
2903
2904 if (se->valid_blocks == 0 && !IS_CURSEG(sbi, segno)) {
2905 if (old_blkaddr == NULL_ADDR)
2906 type = CURSEG_COLD_DATA;
2907 else
2908 type = CURSEG_WARM_DATA;
2909 }
2910 } else {
2911 if (IS_CURSEG(sbi, segno)) {
2912
2913 type = __f2fs_get_curseg(sbi, segno);
2914 f2fs_bug_on(sbi, type == NO_CHECK_TYPE);
2915 } else {
2916 type = CURSEG_WARM_DATA;
2917 }
2918 }
2919
2920 f2fs_bug_on(sbi, !IS_DATASEG(type));
2921 curseg = CURSEG_I(sbi, type);
2922
2923 mutex_lock(&curseg->curseg_mutex);
2924 down_write(&sit_i->sentry_lock);
2925
2926 old_cursegno = curseg->segno;
2927 old_blkoff = curseg->next_blkoff;
2928
2929
2930 if (segno != curseg->segno) {
2931 curseg->next_segno = segno;
2932 change_curseg(sbi, type);
2933 }
2934
2935 curseg->next_blkoff = GET_BLKOFF_FROM_SEG0(sbi, new_blkaddr);
2936 __add_sum_entry(sbi, type, sum);
2937
2938 if (!recover_curseg || recover_newaddr)
2939 update_sit_entry(sbi, new_blkaddr, 1);
2940 if (GET_SEGNO(sbi, old_blkaddr) != NULL_SEGNO)
2941 update_sit_entry(sbi, old_blkaddr, -1);
2942
2943 locate_dirty_segment(sbi, GET_SEGNO(sbi, old_blkaddr));
2944 locate_dirty_segment(sbi, GET_SEGNO(sbi, new_blkaddr));
2945
2946 locate_dirty_segment(sbi, old_cursegno);
2947
2948 if (recover_curseg) {
2949 if (old_cursegno != curseg->segno) {
2950 curseg->next_segno = old_cursegno;
2951 change_curseg(sbi, type);
2952 }
2953 curseg->next_blkoff = old_blkoff;
2954 }
2955
2956 up_write(&sit_i->sentry_lock);
2957 mutex_unlock(&curseg->curseg_mutex);
2958 up_write(&SM_I(sbi)->curseg_lock);
2959}
2960
2961void f2fs_replace_block(struct f2fs_sb_info *sbi, struct dnode_of_data *dn,
2962 block_t old_addr, block_t new_addr,
2963 unsigned char version, bool recover_curseg,
2964 bool recover_newaddr)
2965{
2966 struct f2fs_summary sum;
2967
2968 set_summary(&sum, dn->nid, dn->ofs_in_node, version);
2969
2970 f2fs_do_replace_block(sbi, &sum, old_addr, new_addr,
2971 recover_curseg, recover_newaddr);
2972
2973 f2fs_update_data_blkaddr(dn, new_addr);
2974}
2975
2976void f2fs_wait_on_page_writeback(struct page *page,
2977 enum page_type type, bool ordered)
2978{
2979 if (PageWriteback(page)) {
2980 struct f2fs_sb_info *sbi = F2FS_P_SB(page);
2981
2982 f2fs_submit_merged_write_cond(sbi, page->mapping->host,
2983 0, page->index, type);
2984 if (ordered)
2985 wait_on_page_writeback(page);
2986 else
2987 wait_for_stable_page(page);
2988 }
2989}
2990
2991void f2fs_wait_on_block_writeback(struct f2fs_sb_info *sbi, block_t blkaddr)
2992{
2993 struct page *cpage;
2994
2995 if (!is_valid_blkaddr(blkaddr))
2996 return;
2997
2998 cpage = find_lock_page(META_MAPPING(sbi), blkaddr);
2999 if (cpage) {
3000 f2fs_wait_on_page_writeback(cpage, DATA, true);
3001 f2fs_put_page(cpage, 1);
3002 }
3003}
3004
3005static void read_compacted_summaries(struct f2fs_sb_info *sbi)
3006{
3007 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
3008 struct curseg_info *seg_i;
3009 unsigned char *kaddr;
3010 struct page *page;
3011 block_t start;
3012 int i, j, offset;
3013
3014 start = start_sum_block(sbi);
3015
3016 page = f2fs_get_meta_page(sbi, start++);
3017 kaddr = (unsigned char *)page_address(page);
3018
3019
3020 seg_i = CURSEG_I(sbi, CURSEG_HOT_DATA);
3021 memcpy(seg_i->journal, kaddr, SUM_JOURNAL_SIZE);
3022
3023
3024 seg_i = CURSEG_I(sbi, CURSEG_COLD_DATA);
3025 memcpy(seg_i->journal, kaddr + SUM_JOURNAL_SIZE, SUM_JOURNAL_SIZE);
3026 offset = 2 * SUM_JOURNAL_SIZE;
3027
3028
3029 for (i = CURSEG_HOT_DATA; i <= CURSEG_COLD_DATA; i++) {
3030 unsigned short blk_off;
3031 unsigned int segno;
3032
3033 seg_i = CURSEG_I(sbi, i);
3034 segno = le32_to_cpu(ckpt->cur_data_segno[i]);
3035 blk_off = le16_to_cpu(ckpt->cur_data_blkoff[i]);
3036 seg_i->next_segno = segno;
3037 reset_curseg(sbi, i, 0);
3038 seg_i->alloc_type = ckpt->alloc_type[i];
3039 seg_i->next_blkoff = blk_off;
3040
3041 if (seg_i->alloc_type == SSR)
3042 blk_off = sbi->blocks_per_seg;
3043
3044 for (j = 0; j < blk_off; j++) {
3045 struct f2fs_summary *s;
3046 s = (struct f2fs_summary *)(kaddr + offset);
3047 seg_i->sum_blk->entries[j] = *s;
3048 offset += SUMMARY_SIZE;
3049 if (offset + SUMMARY_SIZE <= PAGE_SIZE -
3050 SUM_FOOTER_SIZE)
3051 continue;
3052
3053 f2fs_put_page(page, 1);
3054 page = NULL;
3055
3056 page = f2fs_get_meta_page(sbi, start++);
3057 kaddr = (unsigned char *)page_address(page);
3058 offset = 0;
3059 }
3060 }
3061 f2fs_put_page(page, 1);
3062}
3063
3064static int read_normal_summaries(struct f2fs_sb_info *sbi, int type)
3065{
3066 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
3067 struct f2fs_summary_block *sum;
3068 struct curseg_info *curseg;
3069 struct page *new;
3070 unsigned short blk_off;
3071 unsigned int segno = 0;
3072 block_t blk_addr = 0;
3073
3074
3075 if (IS_DATASEG(type)) {
3076 segno = le32_to_cpu(ckpt->cur_data_segno[type]);
3077 blk_off = le16_to_cpu(ckpt->cur_data_blkoff[type -
3078 CURSEG_HOT_DATA]);
3079 if (__exist_node_summaries(sbi))
3080 blk_addr = sum_blk_addr(sbi, NR_CURSEG_TYPE, type);
3081 else
3082 blk_addr = sum_blk_addr(sbi, NR_CURSEG_DATA_TYPE, type);
3083 } else {
3084 segno = le32_to_cpu(ckpt->cur_node_segno[type -
3085 CURSEG_HOT_NODE]);
3086 blk_off = le16_to_cpu(ckpt->cur_node_blkoff[type -
3087 CURSEG_HOT_NODE]);
3088 if (__exist_node_summaries(sbi))
3089 blk_addr = sum_blk_addr(sbi, NR_CURSEG_NODE_TYPE,
3090 type - CURSEG_HOT_NODE);
3091 else
3092 blk_addr = GET_SUM_BLOCK(sbi, segno);
3093 }
3094
3095 new = f2fs_get_meta_page(sbi, blk_addr);
3096 sum = (struct f2fs_summary_block *)page_address(new);
3097
3098 if (IS_NODESEG(type)) {
3099 if (__exist_node_summaries(sbi)) {
3100 struct f2fs_summary *ns = &sum->entries[0];
3101 int i;
3102 for (i = 0; i < sbi->blocks_per_seg; i++, ns++) {
3103 ns->version = 0;
3104 ns->ofs_in_node = 0;
3105 }
3106 } else {
3107 f2fs_restore_node_summary(sbi, segno, sum);
3108 }
3109 }
3110
3111
3112 curseg = CURSEG_I(sbi, type);
3113 mutex_lock(&curseg->curseg_mutex);
3114
3115
3116 down_write(&curseg->journal_rwsem);
3117 memcpy(curseg->journal, &sum->journal, SUM_JOURNAL_SIZE);
3118 up_write(&curseg->journal_rwsem);
3119
3120 memcpy(curseg->sum_blk->entries, sum->entries, SUM_ENTRY_SIZE);
3121 memcpy(&curseg->sum_blk->footer, &sum->footer, SUM_FOOTER_SIZE);
3122 curseg->next_segno = segno;
3123 reset_curseg(sbi, type, 0);
3124 curseg->alloc_type = ckpt->alloc_type[type];
3125 curseg->next_blkoff = blk_off;
3126 mutex_unlock(&curseg->curseg_mutex);
3127 f2fs_put_page(new, 1);
3128 return 0;
3129}
3130
3131static int restore_curseg_summaries(struct f2fs_sb_info *sbi)
3132{
3133 struct f2fs_journal *sit_j = CURSEG_I(sbi, CURSEG_COLD_DATA)->journal;
3134 struct f2fs_journal *nat_j = CURSEG_I(sbi, CURSEG_HOT_DATA)->journal;
3135 int type = CURSEG_HOT_DATA;
3136 int err;
3137
3138 if (is_set_ckpt_flags(sbi, CP_COMPACT_SUM_FLAG)) {
3139 int npages = f2fs_npages_for_summary_flush(sbi, true);
3140
3141 if (npages >= 2)
3142 f2fs_ra_meta_pages(sbi, start_sum_block(sbi), npages,
3143 META_CP, true);
3144
3145
3146 read_compacted_summaries(sbi);
3147 type = CURSEG_HOT_NODE;
3148 }
3149
3150 if (__exist_node_summaries(sbi))
3151 f2fs_ra_meta_pages(sbi, sum_blk_addr(sbi, NR_CURSEG_TYPE, type),
3152 NR_CURSEG_TYPE - type, META_CP, true);
3153
3154 for (; type <= CURSEG_COLD_NODE; type++) {
3155 err = read_normal_summaries(sbi, type);
3156 if (err)
3157 return err;
3158 }
3159
3160
3161 if (nats_in_cursum(nat_j) > NAT_JOURNAL_ENTRIES ||
3162 sits_in_cursum(sit_j) > SIT_JOURNAL_ENTRIES)
3163 return -EINVAL;
3164
3165 return 0;
3166}
3167
3168static void write_compacted_summaries(struct f2fs_sb_info *sbi, block_t blkaddr)
3169{
3170 struct page *page;
3171 unsigned char *kaddr;
3172 struct f2fs_summary *summary;
3173 struct curseg_info *seg_i;
3174 int written_size = 0;
3175 int i, j;
3176
3177 page = f2fs_grab_meta_page(sbi, blkaddr++);
3178 kaddr = (unsigned char *)page_address(page);
3179 memset(kaddr, 0, PAGE_SIZE);
3180
3181
3182 seg_i = CURSEG_I(sbi, CURSEG_HOT_DATA);
3183 memcpy(kaddr, seg_i->journal, SUM_JOURNAL_SIZE);
3184 written_size += SUM_JOURNAL_SIZE;
3185
3186
3187 seg_i = CURSEG_I(sbi, CURSEG_COLD_DATA);
3188 memcpy(kaddr + written_size, seg_i->journal, SUM_JOURNAL_SIZE);
3189 written_size += SUM_JOURNAL_SIZE;
3190
3191
3192 for (i = CURSEG_HOT_DATA; i <= CURSEG_COLD_DATA; i++) {
3193 unsigned short blkoff;
3194 seg_i = CURSEG_I(sbi, i);
3195 if (sbi->ckpt->alloc_type[i] == SSR)
3196 blkoff = sbi->blocks_per_seg;
3197 else
3198 blkoff = curseg_blkoff(sbi, i);
3199
3200 for (j = 0; j < blkoff; j++) {
3201 if (!page) {
3202 page = f2fs_grab_meta_page(sbi, blkaddr++);
3203 kaddr = (unsigned char *)page_address(page);
3204 memset(kaddr, 0, PAGE_SIZE);
3205 written_size = 0;
3206 }
3207 summary = (struct f2fs_summary *)(kaddr + written_size);
3208 *summary = seg_i->sum_blk->entries[j];
3209 written_size += SUMMARY_SIZE;
3210
3211 if (written_size + SUMMARY_SIZE <= PAGE_SIZE -
3212 SUM_FOOTER_SIZE)
3213 continue;
3214
3215 set_page_dirty(page);
3216 f2fs_put_page(page, 1);
3217 page = NULL;
3218 }
3219 }
3220 if (page) {
3221 set_page_dirty(page);
3222 f2fs_put_page(page, 1);
3223 }
3224}
3225
3226static void write_normal_summaries(struct f2fs_sb_info *sbi,
3227 block_t blkaddr, int type)
3228{
3229 int i, end;
3230 if (IS_DATASEG(type))
3231 end = type + NR_CURSEG_DATA_TYPE;
3232 else
3233 end = type + NR_CURSEG_NODE_TYPE;
3234
3235 for (i = type; i < end; i++)
3236 write_current_sum_page(sbi, i, blkaddr + (i - type));
3237}
3238
3239void f2fs_write_data_summaries(struct f2fs_sb_info *sbi, block_t start_blk)
3240{
3241 if (is_set_ckpt_flags(sbi, CP_COMPACT_SUM_FLAG))
3242 write_compacted_summaries(sbi, start_blk);
3243 else
3244 write_normal_summaries(sbi, start_blk, CURSEG_HOT_DATA);
3245}
3246
3247void f2fs_write_node_summaries(struct f2fs_sb_info *sbi, block_t start_blk)
3248{
3249 write_normal_summaries(sbi, start_blk, CURSEG_HOT_NODE);
3250}
3251
3252int f2fs_lookup_journal_in_cursum(struct f2fs_journal *journal, int type,
3253 unsigned int val, int alloc)
3254{
3255 int i;
3256
3257 if (type == NAT_JOURNAL) {
3258 for (i = 0; i < nats_in_cursum(journal); i++) {
3259 if (le32_to_cpu(nid_in_journal(journal, i)) == val)
3260 return i;
3261 }
3262 if (alloc && __has_cursum_space(journal, 1, NAT_JOURNAL))
3263 return update_nats_in_cursum(journal, 1);
3264 } else if (type == SIT_JOURNAL) {
3265 for (i = 0; i < sits_in_cursum(journal); i++)
3266 if (le32_to_cpu(segno_in_journal(journal, i)) == val)
3267 return i;
3268 if (alloc && __has_cursum_space(journal, 1, SIT_JOURNAL))
3269 return update_sits_in_cursum(journal, 1);
3270 }
3271 return -1;
3272}
3273
3274static struct page *get_current_sit_page(struct f2fs_sb_info *sbi,
3275 unsigned int segno)
3276{
3277 return f2fs_get_meta_page(sbi, current_sit_addr(sbi, segno));
3278}
3279
3280static struct page *get_next_sit_page(struct f2fs_sb_info *sbi,
3281 unsigned int start)
3282{
3283 struct sit_info *sit_i = SIT_I(sbi);
3284 struct page *page;
3285 pgoff_t src_off, dst_off;
3286
3287 src_off = current_sit_addr(sbi, start);
3288 dst_off = next_sit_addr(sbi, src_off);
3289
3290 page = f2fs_grab_meta_page(sbi, dst_off);
3291 seg_info_to_sit_page(sbi, page, start);
3292
3293 set_page_dirty(page);
3294 set_to_next_sit(sit_i, start);
3295
3296 return page;
3297}
3298
3299static struct sit_entry_set *grab_sit_entry_set(void)
3300{
3301 struct sit_entry_set *ses =
3302 f2fs_kmem_cache_alloc(sit_entry_set_slab, GFP_NOFS);
3303
3304 ses->entry_cnt = 0;
3305 INIT_LIST_HEAD(&ses->set_list);
3306 return ses;
3307}
3308
3309static void release_sit_entry_set(struct sit_entry_set *ses)
3310{
3311 list_del(&ses->set_list);
3312 kmem_cache_free(sit_entry_set_slab, ses);
3313}
3314
3315static void adjust_sit_entry_set(struct sit_entry_set *ses,
3316 struct list_head *head)
3317{
3318 struct sit_entry_set *next = ses;
3319
3320 if (list_is_last(&ses->set_list, head))
3321 return;
3322
3323 list_for_each_entry_continue(next, head, set_list)
3324 if (ses->entry_cnt <= next->entry_cnt)
3325 break;
3326
3327 list_move_tail(&ses->set_list, &next->set_list);
3328}
3329
3330static void add_sit_entry(unsigned int segno, struct list_head *head)
3331{
3332 struct sit_entry_set *ses;
3333 unsigned int start_segno = START_SEGNO(segno);
3334
3335 list_for_each_entry(ses, head, set_list) {
3336 if (ses->start_segno == start_segno) {
3337 ses->entry_cnt++;
3338 adjust_sit_entry_set(ses, head);
3339 return;
3340 }
3341 }
3342
3343 ses = grab_sit_entry_set();
3344
3345 ses->start_segno = start_segno;
3346 ses->entry_cnt++;
3347 list_add(&ses->set_list, head);
3348}
3349
3350static void add_sits_in_set(struct f2fs_sb_info *sbi)
3351{
3352 struct f2fs_sm_info *sm_info = SM_I(sbi);
3353 struct list_head *set_list = &sm_info->sit_entry_set;
3354 unsigned long *bitmap = SIT_I(sbi)->dirty_sentries_bitmap;
3355 unsigned int segno;
3356
3357 for_each_set_bit(segno, bitmap, MAIN_SEGS(sbi))
3358 add_sit_entry(segno, set_list);
3359}
3360
3361static void remove_sits_in_journal(struct f2fs_sb_info *sbi)
3362{
3363 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_COLD_DATA);
3364 struct f2fs_journal *journal = curseg->journal;
3365 int i;
3366
3367 down_write(&curseg->journal_rwsem);
3368 for (i = 0; i < sits_in_cursum(journal); i++) {
3369 unsigned int segno;
3370 bool dirtied;
3371
3372 segno = le32_to_cpu(segno_in_journal(journal, i));
3373 dirtied = __mark_sit_entry_dirty(sbi, segno);
3374
3375 if (!dirtied)
3376 add_sit_entry(segno, &SM_I(sbi)->sit_entry_set);
3377 }
3378 update_sits_in_cursum(journal, -i);
3379 up_write(&curseg->journal_rwsem);
3380}
3381
3382
3383
3384
3385
3386void f2fs_flush_sit_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc)
3387{
3388 struct sit_info *sit_i = SIT_I(sbi);
3389 unsigned long *bitmap = sit_i->dirty_sentries_bitmap;
3390 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_COLD_DATA);
3391 struct f2fs_journal *journal = curseg->journal;
3392 struct sit_entry_set *ses, *tmp;
3393 struct list_head *head = &SM_I(sbi)->sit_entry_set;
3394 bool to_journal = true;
3395 struct seg_entry *se;
3396
3397 down_write(&sit_i->sentry_lock);
3398
3399 if (!sit_i->dirty_sentries)
3400 goto out;
3401
3402
3403
3404
3405
3406 add_sits_in_set(sbi);
3407
3408
3409
3410
3411
3412
3413 if (!__has_cursum_space(journal, sit_i->dirty_sentries, SIT_JOURNAL))
3414 remove_sits_in_journal(sbi);
3415
3416
3417
3418
3419
3420
3421 list_for_each_entry_safe(ses, tmp, head, set_list) {
3422 struct page *page = NULL;
3423 struct f2fs_sit_block *raw_sit = NULL;
3424 unsigned int start_segno = ses->start_segno;
3425 unsigned int end = min(start_segno + SIT_ENTRY_PER_BLOCK,
3426 (unsigned long)MAIN_SEGS(sbi));
3427 unsigned int segno = start_segno;
3428
3429 if (to_journal &&
3430 !__has_cursum_space(journal, ses->entry_cnt, SIT_JOURNAL))
3431 to_journal = false;
3432
3433 if (to_journal) {
3434 down_write(&curseg->journal_rwsem);
3435 } else {
3436 page = get_next_sit_page(sbi, start_segno);
3437 raw_sit = page_address(page);
3438 }
3439
3440
3441 for_each_set_bit_from(segno, bitmap, end) {
3442 int offset, sit_offset;
3443
3444 se = get_seg_entry(sbi, segno);
3445#ifdef CONFIG_F2FS_CHECK_FS
3446 if (memcmp(se->cur_valid_map, se->cur_valid_map_mir,
3447 SIT_VBLOCK_MAP_SIZE))
3448 f2fs_bug_on(sbi, 1);
3449#endif
3450
3451
3452 if (!(cpc->reason & CP_DISCARD)) {
3453 cpc->trim_start = segno;
3454 add_discard_addrs(sbi, cpc, false);
3455 }
3456
3457 if (to_journal) {
3458 offset = f2fs_lookup_journal_in_cursum(journal,
3459 SIT_JOURNAL, segno, 1);
3460 f2fs_bug_on(sbi, offset < 0);
3461 segno_in_journal(journal, offset) =
3462 cpu_to_le32(segno);
3463 seg_info_to_raw_sit(se,
3464 &sit_in_journal(journal, offset));
3465 check_block_count(sbi, segno,
3466 &sit_in_journal(journal, offset));
3467 } else {
3468 sit_offset = SIT_ENTRY_OFFSET(sit_i, segno);
3469 seg_info_to_raw_sit(se,
3470 &raw_sit->entries[sit_offset]);
3471 check_block_count(sbi, segno,
3472 &raw_sit->entries[sit_offset]);
3473 }
3474
3475 __clear_bit(segno, bitmap);
3476 sit_i->dirty_sentries--;
3477 ses->entry_cnt--;
3478 }
3479
3480 if (to_journal)
3481 up_write(&curseg->journal_rwsem);
3482 else
3483 f2fs_put_page(page, 1);
3484
3485 f2fs_bug_on(sbi, ses->entry_cnt);
3486 release_sit_entry_set(ses);
3487 }
3488
3489 f2fs_bug_on(sbi, !list_empty(head));
3490 f2fs_bug_on(sbi, sit_i->dirty_sentries);
3491out:
3492 if (cpc->reason & CP_DISCARD) {
3493 __u64 trim_start = cpc->trim_start;
3494
3495 for (; cpc->trim_start <= cpc->trim_end; cpc->trim_start++)
3496 add_discard_addrs(sbi, cpc, false);
3497
3498 cpc->trim_start = trim_start;
3499 }
3500 up_write(&sit_i->sentry_lock);
3501
3502 set_prefree_as_free_segments(sbi);
3503}
3504
3505static int build_sit_info(struct f2fs_sb_info *sbi)
3506{
3507 struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
3508 struct sit_info *sit_i;
3509 unsigned int sit_segs, start;
3510 char *src_bitmap;
3511 unsigned int bitmap_size;
3512
3513
3514 sit_i = f2fs_kzalloc(sbi, sizeof(struct sit_info), GFP_KERNEL);
3515 if (!sit_i)
3516 return -ENOMEM;
3517
3518 SM_I(sbi)->sit_info = sit_i;
3519
3520 sit_i->sentries =
3521 f2fs_kvzalloc(sbi, array_size(sizeof(struct seg_entry),
3522 MAIN_SEGS(sbi)),
3523 GFP_KERNEL);
3524 if (!sit_i->sentries)
3525 return -ENOMEM;
3526
3527 bitmap_size = f2fs_bitmap_size(MAIN_SEGS(sbi));
3528 sit_i->dirty_sentries_bitmap = f2fs_kvzalloc(sbi, bitmap_size,
3529 GFP_KERNEL);
3530 if (!sit_i->dirty_sentries_bitmap)
3531 return -ENOMEM;
3532
3533 for (start = 0; start < MAIN_SEGS(sbi); start++) {
3534 sit_i->sentries[start].cur_valid_map
3535 = f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE, GFP_KERNEL);
3536 sit_i->sentries[start].ckpt_valid_map
3537 = f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE, GFP_KERNEL);
3538 if (!sit_i->sentries[start].cur_valid_map ||
3539 !sit_i->sentries[start].ckpt_valid_map)
3540 return -ENOMEM;
3541
3542#ifdef CONFIG_F2FS_CHECK_FS
3543 sit_i->sentries[start].cur_valid_map_mir
3544 = f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE, GFP_KERNEL);
3545 if (!sit_i->sentries[start].cur_valid_map_mir)
3546 return -ENOMEM;
3547#endif
3548
3549 if (f2fs_discard_en(sbi)) {
3550 sit_i->sentries[start].discard_map
3551 = f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE,
3552 GFP_KERNEL);
3553 if (!sit_i->sentries[start].discard_map)
3554 return -ENOMEM;
3555 }
3556 }
3557
3558 sit_i->tmp_map = f2fs_kzalloc(sbi, SIT_VBLOCK_MAP_SIZE, GFP_KERNEL);
3559 if (!sit_i->tmp_map)
3560 return -ENOMEM;
3561
3562 if (sbi->segs_per_sec > 1) {
3563 sit_i->sec_entries =
3564 f2fs_kvzalloc(sbi, array_size(sizeof(struct sec_entry),
3565 MAIN_SECS(sbi)),
3566 GFP_KERNEL);
3567 if (!sit_i->sec_entries)
3568 return -ENOMEM;
3569 }
3570
3571
3572 sit_segs = le32_to_cpu(raw_super->segment_count_sit) >> 1;
3573
3574
3575 bitmap_size = __bitmap_size(sbi, SIT_BITMAP);
3576 src_bitmap = __bitmap_ptr(sbi, SIT_BITMAP);
3577
3578 sit_i->sit_bitmap = kmemdup(src_bitmap, bitmap_size, GFP_KERNEL);
3579 if (!sit_i->sit_bitmap)
3580 return -ENOMEM;
3581
3582#ifdef CONFIG_F2FS_CHECK_FS
3583 sit_i->sit_bitmap_mir = kmemdup(src_bitmap, bitmap_size, GFP_KERNEL);
3584 if (!sit_i->sit_bitmap_mir)
3585 return -ENOMEM;
3586#endif
3587
3588
3589 sit_i->s_ops = &default_salloc_ops;
3590
3591 sit_i->sit_base_addr = le32_to_cpu(raw_super->sit_blkaddr);
3592 sit_i->sit_blocks = sit_segs << sbi->log_blocks_per_seg;
3593 sit_i->written_valid_blocks = 0;
3594 sit_i->bitmap_size = bitmap_size;
3595 sit_i->dirty_sentries = 0;
3596 sit_i->sents_per_block = SIT_ENTRY_PER_BLOCK;
3597 sit_i->elapsed_time = le64_to_cpu(sbi->ckpt->elapsed_time);
3598 sit_i->mounted_time = ktime_get_real_seconds();
3599 init_rwsem(&sit_i->sentry_lock);
3600 return 0;
3601}
3602
3603static int build_free_segmap(struct f2fs_sb_info *sbi)
3604{
3605 struct free_segmap_info *free_i;
3606 unsigned int bitmap_size, sec_bitmap_size;
3607
3608
3609 free_i = f2fs_kzalloc(sbi, sizeof(struct free_segmap_info), GFP_KERNEL);
3610 if (!free_i)
3611 return -ENOMEM;
3612
3613 SM_I(sbi)->free_info = free_i;
3614
3615 bitmap_size = f2fs_bitmap_size(MAIN_SEGS(sbi));
3616 free_i->free_segmap = f2fs_kvmalloc(sbi, bitmap_size, GFP_KERNEL);
3617 if (!free_i->free_segmap)
3618 return -ENOMEM;
3619
3620 sec_bitmap_size = f2fs_bitmap_size(MAIN_SECS(sbi));
3621 free_i->free_secmap = f2fs_kvmalloc(sbi, sec_bitmap_size, GFP_KERNEL);
3622 if (!free_i->free_secmap)
3623 return -ENOMEM;
3624
3625
3626 memset(free_i->free_segmap, 0xff, bitmap_size);
3627 memset(free_i->free_secmap, 0xff, sec_bitmap_size);
3628
3629
3630 free_i->start_segno = GET_SEGNO_FROM_SEG0(sbi, MAIN_BLKADDR(sbi));
3631 free_i->free_segments = 0;
3632 free_i->free_sections = 0;
3633 spin_lock_init(&free_i->segmap_lock);
3634 return 0;
3635}
3636
3637static int build_curseg(struct f2fs_sb_info *sbi)
3638{
3639 struct curseg_info *array;
3640 int i;
3641
3642 array = f2fs_kzalloc(sbi, array_size(NR_CURSEG_TYPE, sizeof(*array)),
3643 GFP_KERNEL);
3644 if (!array)
3645 return -ENOMEM;
3646
3647 SM_I(sbi)->curseg_array = array;
3648
3649 for (i = 0; i < NR_CURSEG_TYPE; i++) {
3650 mutex_init(&array[i].curseg_mutex);
3651 array[i].sum_blk = f2fs_kzalloc(sbi, PAGE_SIZE, GFP_KERNEL);
3652 if (!array[i].sum_blk)
3653 return -ENOMEM;
3654 init_rwsem(&array[i].journal_rwsem);
3655 array[i].journal = f2fs_kzalloc(sbi,
3656 sizeof(struct f2fs_journal), GFP_KERNEL);
3657 if (!array[i].journal)
3658 return -ENOMEM;
3659 array[i].segno = NULL_SEGNO;
3660 array[i].next_blkoff = 0;
3661 }
3662 return restore_curseg_summaries(sbi);
3663}
3664
3665static int build_sit_entries(struct f2fs_sb_info *sbi)
3666{
3667 struct sit_info *sit_i = SIT_I(sbi);
3668 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_COLD_DATA);
3669 struct f2fs_journal *journal = curseg->journal;
3670 struct seg_entry *se;
3671 struct f2fs_sit_entry sit;
3672 int sit_blk_cnt = SIT_BLK_CNT(sbi);
3673 unsigned int i, start, end;
3674 unsigned int readed, start_blk = 0;
3675 int err = 0;
3676 block_t total_node_blocks = 0;
3677
3678 do {
3679 readed = f2fs_ra_meta_pages(sbi, start_blk, BIO_MAX_PAGES,
3680 META_SIT, true);
3681
3682 start = start_blk * sit_i->sents_per_block;
3683 end = (start_blk + readed) * sit_i->sents_per_block;
3684
3685 for (; start < end && start < MAIN_SEGS(sbi); start++) {
3686 struct f2fs_sit_block *sit_blk;
3687 struct page *page;
3688
3689 se = &sit_i->sentries[start];
3690 page = get_current_sit_page(sbi, start);
3691 sit_blk = (struct f2fs_sit_block *)page_address(page);
3692 sit = sit_blk->entries[SIT_ENTRY_OFFSET(sit_i, start)];
3693 f2fs_put_page(page, 1);
3694
3695 err = check_block_count(sbi, start, &sit);
3696 if (err)
3697 return err;
3698 seg_info_from_raw_sit(se, &sit);
3699 if (IS_NODESEG(se->type))
3700 total_node_blocks += se->valid_blocks;
3701
3702
3703 if (f2fs_discard_en(sbi)) {
3704 if (is_set_ckpt_flags(sbi, CP_TRIMMED_FLAG)) {
3705 memset(se->discard_map, 0xff,
3706 SIT_VBLOCK_MAP_SIZE);
3707 } else {
3708 memcpy(se->discard_map,
3709 se->cur_valid_map,
3710 SIT_VBLOCK_MAP_SIZE);
3711 sbi->discard_blks +=
3712 sbi->blocks_per_seg -
3713 se->valid_blocks;
3714 }
3715 }
3716
3717 if (sbi->segs_per_sec > 1)
3718 get_sec_entry(sbi, start)->valid_blocks +=
3719 se->valid_blocks;
3720 }
3721 start_blk += readed;
3722 } while (start_blk < sit_blk_cnt);
3723
3724 down_read(&curseg->journal_rwsem);
3725 for (i = 0; i < sits_in_cursum(journal); i++) {
3726 unsigned int old_valid_blocks;
3727
3728 start = le32_to_cpu(segno_in_journal(journal, i));
3729 if (start >= MAIN_SEGS(sbi)) {
3730 f2fs_msg(sbi->sb, KERN_ERR,
3731 "Wrong journal entry on segno %u",
3732 start);
3733 set_sbi_flag(sbi, SBI_NEED_FSCK);
3734 err = -EINVAL;
3735 break;
3736 }
3737
3738 se = &sit_i->sentries[start];
3739 sit = sit_in_journal(journal, i);
3740
3741 old_valid_blocks = se->valid_blocks;
3742 if (IS_NODESEG(se->type))
3743 total_node_blocks -= old_valid_blocks;
3744
3745 err = check_block_count(sbi, start, &sit);
3746 if (err)
3747 break;
3748 seg_info_from_raw_sit(se, &sit);
3749 if (IS_NODESEG(se->type))
3750 total_node_blocks += se->valid_blocks;
3751
3752 if (f2fs_discard_en(sbi)) {
3753 if (is_set_ckpt_flags(sbi, CP_TRIMMED_FLAG)) {
3754 memset(se->discard_map, 0xff,
3755 SIT_VBLOCK_MAP_SIZE);
3756 } else {
3757 memcpy(se->discard_map, se->cur_valid_map,
3758 SIT_VBLOCK_MAP_SIZE);
3759 sbi->discard_blks += old_valid_blocks;
3760 sbi->discard_blks -= se->valid_blocks;
3761 }
3762 }
3763
3764 if (sbi->segs_per_sec > 1) {
3765 get_sec_entry(sbi, start)->valid_blocks +=
3766 se->valid_blocks;
3767 get_sec_entry(sbi, start)->valid_blocks -=
3768 old_valid_blocks;
3769 }
3770 }
3771 up_read(&curseg->journal_rwsem);
3772
3773 if (!err && total_node_blocks != valid_node_count(sbi)) {
3774 f2fs_msg(sbi->sb, KERN_ERR,
3775 "SIT is corrupted node# %u vs %u",
3776 total_node_blocks, valid_node_count(sbi));
3777 set_sbi_flag(sbi, SBI_NEED_FSCK);
3778 err = -EINVAL;
3779 }
3780
3781 return err;
3782}
3783
3784static void init_free_segmap(struct f2fs_sb_info *sbi)
3785{
3786 unsigned int start;
3787 int type;
3788
3789 for (start = 0; start < MAIN_SEGS(sbi); start++) {
3790 struct seg_entry *sentry = get_seg_entry(sbi, start);
3791 if (!sentry->valid_blocks)
3792 __set_free(sbi, start);
3793 else
3794 SIT_I(sbi)->written_valid_blocks +=
3795 sentry->valid_blocks;
3796 }
3797
3798
3799 for (type = CURSEG_HOT_DATA; type <= CURSEG_COLD_NODE; type++) {
3800 struct curseg_info *curseg_t = CURSEG_I(sbi, type);
3801 __set_test_and_inuse(sbi, curseg_t->segno);
3802 }
3803}
3804
3805static void init_dirty_segmap(struct f2fs_sb_info *sbi)
3806{
3807 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
3808 struct free_segmap_info *free_i = FREE_I(sbi);
3809 unsigned int segno = 0, offset = 0;
3810 unsigned short valid_blocks;
3811
3812 while (1) {
3813
3814 segno = find_next_inuse(free_i, MAIN_SEGS(sbi), offset);
3815 if (segno >= MAIN_SEGS(sbi))
3816 break;
3817 offset = segno + 1;
3818 valid_blocks = get_valid_blocks(sbi, segno, false);
3819 if (valid_blocks == sbi->blocks_per_seg || !valid_blocks)
3820 continue;
3821 if (valid_blocks > sbi->blocks_per_seg) {
3822 f2fs_bug_on(sbi, 1);
3823 continue;
3824 }
3825 mutex_lock(&dirty_i->seglist_lock);
3826 __locate_dirty_segment(sbi, segno, DIRTY);
3827 mutex_unlock(&dirty_i->seglist_lock);
3828 }
3829}
3830
3831static int init_victim_secmap(struct f2fs_sb_info *sbi)
3832{
3833 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
3834 unsigned int bitmap_size = f2fs_bitmap_size(MAIN_SECS(sbi));
3835
3836 dirty_i->victim_secmap = f2fs_kvzalloc(sbi, bitmap_size, GFP_KERNEL);
3837 if (!dirty_i->victim_secmap)
3838 return -ENOMEM;
3839 return 0;
3840}
3841
3842static int build_dirty_segmap(struct f2fs_sb_info *sbi)
3843{
3844 struct dirty_seglist_info *dirty_i;
3845 unsigned int bitmap_size, i;
3846
3847
3848 dirty_i = f2fs_kzalloc(sbi, sizeof(struct dirty_seglist_info),
3849 GFP_KERNEL);
3850 if (!dirty_i)
3851 return -ENOMEM;
3852
3853 SM_I(sbi)->dirty_info = dirty_i;
3854 mutex_init(&dirty_i->seglist_lock);
3855
3856 bitmap_size = f2fs_bitmap_size(MAIN_SEGS(sbi));
3857
3858 for (i = 0; i < NR_DIRTY_TYPE; i++) {
3859 dirty_i->dirty_segmap[i] = f2fs_kvzalloc(sbi, bitmap_size,
3860 GFP_KERNEL);
3861 if (!dirty_i->dirty_segmap[i])
3862 return -ENOMEM;
3863 }
3864
3865 init_dirty_segmap(sbi);
3866 return init_victim_secmap(sbi);
3867}
3868
3869
3870
3871
3872static void init_min_max_mtime(struct f2fs_sb_info *sbi)
3873{
3874 struct sit_info *sit_i = SIT_I(sbi);
3875 unsigned int segno;
3876
3877 down_write(&sit_i->sentry_lock);
3878
3879 sit_i->min_mtime = ULLONG_MAX;
3880
3881 for (segno = 0; segno < MAIN_SEGS(sbi); segno += sbi->segs_per_sec) {
3882 unsigned int i;
3883 unsigned long long mtime = 0;
3884
3885 for (i = 0; i < sbi->segs_per_sec; i++)
3886 mtime += get_seg_entry(sbi, segno + i)->mtime;
3887
3888 mtime = div_u64(mtime, sbi->segs_per_sec);
3889
3890 if (sit_i->min_mtime > mtime)
3891 sit_i->min_mtime = mtime;
3892 }
3893 sit_i->max_mtime = get_mtime(sbi, false);
3894 up_write(&sit_i->sentry_lock);
3895}
3896
3897int f2fs_build_segment_manager(struct f2fs_sb_info *sbi)
3898{
3899 struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
3900 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
3901 struct f2fs_sm_info *sm_info;
3902 int err;
3903
3904 sm_info = f2fs_kzalloc(sbi, sizeof(struct f2fs_sm_info), GFP_KERNEL);
3905 if (!sm_info)
3906 return -ENOMEM;
3907
3908
3909 sbi->sm_info = sm_info;
3910 sm_info->seg0_blkaddr = le32_to_cpu(raw_super->segment0_blkaddr);
3911 sm_info->main_blkaddr = le32_to_cpu(raw_super->main_blkaddr);
3912 sm_info->segment_count = le32_to_cpu(raw_super->segment_count);
3913 sm_info->reserved_segments = le32_to_cpu(ckpt->rsvd_segment_count);
3914 sm_info->ovp_segments = le32_to_cpu(ckpt->overprov_segment_count);
3915 sm_info->main_segments = le32_to_cpu(raw_super->segment_count_main);
3916 sm_info->ssa_blkaddr = le32_to_cpu(raw_super->ssa_blkaddr);
3917 sm_info->rec_prefree_segments = sm_info->main_segments *
3918 DEF_RECLAIM_PREFREE_SEGMENTS / 100;
3919 if (sm_info->rec_prefree_segments > DEF_MAX_RECLAIM_PREFREE_SEGMENTS)
3920 sm_info->rec_prefree_segments = DEF_MAX_RECLAIM_PREFREE_SEGMENTS;
3921
3922 if (!test_opt(sbi, LFS))
3923 sm_info->ipu_policy = 1 << F2FS_IPU_FSYNC;
3924 sm_info->min_ipu_util = DEF_MIN_IPU_UTIL;
3925 sm_info->min_fsync_blocks = DEF_MIN_FSYNC_BLOCKS;
3926 sm_info->min_hot_blocks = DEF_MIN_HOT_BLOCKS;
3927 sm_info->min_ssr_sections = reserved_sections(sbi);
3928
3929 INIT_LIST_HEAD(&sm_info->sit_entry_set);
3930
3931 init_rwsem(&sm_info->curseg_lock);
3932
3933 if (!f2fs_readonly(sbi->sb)) {
3934 err = f2fs_create_flush_cmd_control(sbi);
3935 if (err)
3936 return err;
3937 }
3938
3939 err = create_discard_cmd_control(sbi);
3940 if (err)
3941 return err;
3942
3943 err = build_sit_info(sbi);
3944 if (err)
3945 return err;
3946 err = build_free_segmap(sbi);
3947 if (err)
3948 return err;
3949 err = build_curseg(sbi);
3950 if (err)
3951 return err;
3952
3953
3954 err = build_sit_entries(sbi);
3955 if (err)
3956 return err;
3957
3958 init_free_segmap(sbi);
3959 err = build_dirty_segmap(sbi);
3960 if (err)
3961 return err;
3962
3963 init_min_max_mtime(sbi);
3964 return 0;
3965}
3966
3967static void discard_dirty_segmap(struct f2fs_sb_info *sbi,
3968 enum dirty_type dirty_type)
3969{
3970 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
3971
3972 mutex_lock(&dirty_i->seglist_lock);
3973 kvfree(dirty_i->dirty_segmap[dirty_type]);
3974 dirty_i->nr_dirty[dirty_type] = 0;
3975 mutex_unlock(&dirty_i->seglist_lock);
3976}
3977
3978static void destroy_victim_secmap(struct f2fs_sb_info *sbi)
3979{
3980 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
3981 kvfree(dirty_i->victim_secmap);
3982}
3983
3984static void destroy_dirty_segmap(struct f2fs_sb_info *sbi)
3985{
3986 struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
3987 int i;
3988
3989 if (!dirty_i)
3990 return;
3991
3992
3993 for (i = 0; i < NR_DIRTY_TYPE; i++)
3994 discard_dirty_segmap(sbi, i);
3995
3996 destroy_victim_secmap(sbi);
3997 SM_I(sbi)->dirty_info = NULL;
3998 kfree(dirty_i);
3999}
4000
4001static void destroy_curseg(struct f2fs_sb_info *sbi)
4002{
4003 struct curseg_info *array = SM_I(sbi)->curseg_array;
4004 int i;
4005
4006 if (!array)
4007 return;
4008 SM_I(sbi)->curseg_array = NULL;
4009 for (i = 0; i < NR_CURSEG_TYPE; i++) {
4010 kfree(array[i].sum_blk);
4011 kfree(array[i].journal);
4012 }
4013 kfree(array);
4014}
4015
4016static void destroy_free_segmap(struct f2fs_sb_info *sbi)
4017{
4018 struct free_segmap_info *free_i = SM_I(sbi)->free_info;
4019 if (!free_i)
4020 return;
4021 SM_I(sbi)->free_info = NULL;
4022 kvfree(free_i->free_segmap);
4023 kvfree(free_i->free_secmap);
4024 kfree(free_i);
4025}
4026
4027static void destroy_sit_info(struct f2fs_sb_info *sbi)
4028{
4029 struct sit_info *sit_i = SIT_I(sbi);
4030 unsigned int start;
4031
4032 if (!sit_i)
4033 return;
4034
4035 if (sit_i->sentries) {
4036 for (start = 0; start < MAIN_SEGS(sbi); start++) {
4037 kfree(sit_i->sentries[start].cur_valid_map);
4038#ifdef CONFIG_F2FS_CHECK_FS
4039 kfree(sit_i->sentries[start].cur_valid_map_mir);
4040#endif
4041 kfree(sit_i->sentries[start].ckpt_valid_map);
4042 kfree(sit_i->sentries[start].discard_map);
4043 }
4044 }
4045 kfree(sit_i->tmp_map);
4046
4047 kvfree(sit_i->sentries);
4048 kvfree(sit_i->sec_entries);
4049 kvfree(sit_i->dirty_sentries_bitmap);
4050
4051 SM_I(sbi)->sit_info = NULL;
4052 kfree(sit_i->sit_bitmap);
4053#ifdef CONFIG_F2FS_CHECK_FS
4054 kfree(sit_i->sit_bitmap_mir);
4055#endif
4056 kfree(sit_i);
4057}
4058
4059void f2fs_destroy_segment_manager(struct f2fs_sb_info *sbi)
4060{
4061 struct f2fs_sm_info *sm_info = SM_I(sbi);
4062
4063 if (!sm_info)
4064 return;
4065 f2fs_destroy_flush_cmd_control(sbi, true);
4066 destroy_discard_cmd_control(sbi);
4067 destroy_dirty_segmap(sbi);
4068 destroy_curseg(sbi);
4069 destroy_free_segmap(sbi);
4070 destroy_sit_info(sbi);
4071 sbi->sm_info = NULL;
4072 kfree(sm_info);
4073}
4074
4075int __init f2fs_create_segment_manager_caches(void)
4076{
4077 discard_entry_slab = f2fs_kmem_cache_create("discard_entry",
4078 sizeof(struct discard_entry));
4079 if (!discard_entry_slab)
4080 goto fail;
4081
4082 discard_cmd_slab = f2fs_kmem_cache_create("discard_cmd",
4083 sizeof(struct discard_cmd));
4084 if (!discard_cmd_slab)
4085 goto destroy_discard_entry;
4086
4087 sit_entry_set_slab = f2fs_kmem_cache_create("sit_entry_set",
4088 sizeof(struct sit_entry_set));
4089 if (!sit_entry_set_slab)
4090 goto destroy_discard_cmd;
4091
4092 inmem_entry_slab = f2fs_kmem_cache_create("inmem_page_entry",
4093 sizeof(struct inmem_pages));
4094 if (!inmem_entry_slab)
4095 goto destroy_sit_entry_set;
4096 return 0;
4097
4098destroy_sit_entry_set:
4099 kmem_cache_destroy(sit_entry_set_slab);
4100destroy_discard_cmd:
4101 kmem_cache_destroy(discard_cmd_slab);
4102destroy_discard_entry:
4103 kmem_cache_destroy(discard_entry_slab);
4104fail:
4105 return -ENOMEM;
4106}
4107
4108void f2fs_destroy_segment_manager_caches(void)
4109{
4110 kmem_cache_destroy(sit_entry_set_slab);
4111 kmem_cache_destroy(discard_cmd_slab);
4112 kmem_cache_destroy(discard_entry_slab);
4113 kmem_cache_destroy(inmem_entry_slab);
4114}
4115