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