block/fs/drivers: remove rw argument from submit_bio
[linux-2.6-block.git] / fs / f2fs / segment.c
1 /*
2  * fs/f2fs/segment.c
3  *
4  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5  *             http://www.samsung.com/
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  */
11 #include <linux/fs.h>
12 #include <linux/f2fs_fs.h>
13 #include <linux/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
20 #include "f2fs.h"
21 #include "segment.h"
22 #include "node.h"
23 #include "trace.h"
24 #include <trace/events/f2fs.h>
25
26 #define __reverse_ffz(x) __reverse_ffs(~(x))
27
28 static struct kmem_cache *discard_entry_slab;
29 static struct kmem_cache *sit_entry_set_slab;
30 static struct kmem_cache *inmem_entry_slab;
31
32 static unsigned long __reverse_ulong(unsigned char *str)
33 {
34         unsigned long tmp = 0;
35         int shift = 24, idx = 0;
36
37 #if BITS_PER_LONG == 64
38         shift = 56;
39 #endif
40         while (shift >= 0) {
41                 tmp |= (unsigned long)str[idx++] << shift;
42                 shift -= BITS_PER_BYTE;
43         }
44         return tmp;
45 }
46
47 /*
48  * __reverse_ffs is copied from include/asm-generic/bitops/__ffs.h since
49  * MSB and LSB are reversed in a byte by f2fs_set_bit.
50  */
51 static inline unsigned long __reverse_ffs(unsigned long word)
52 {
53         int num = 0;
54
55 #if BITS_PER_LONG == 64
56         if ((word & 0xffffffff00000000UL) == 0)
57                 num += 32;
58         else
59                 word >>= 32;
60 #endif
61         if ((word & 0xffff0000) == 0)
62                 num += 16;
63         else
64                 word >>= 16;
65
66         if ((word & 0xff00) == 0)
67                 num += 8;
68         else
69                 word >>= 8;
70
71         if ((word & 0xf0) == 0)
72                 num += 4;
73         else
74                 word >>= 4;
75
76         if ((word & 0xc) == 0)
77                 num += 2;
78         else
79                 word >>= 2;
80
81         if ((word & 0x2) == 0)
82                 num += 1;
83         return num;
84 }
85
86 /*
87  * __find_rev_next(_zero)_bit is copied from lib/find_next_bit.c because
88  * f2fs_set_bit makes MSB and LSB reversed in a byte.
89  * @size must be integral times of unsigned long.
90  * Example:
91  *                             MSB <--> LSB
92  *   f2fs_set_bit(0, bitmap) => 1000 0000
93  *   f2fs_set_bit(7, bitmap) => 0000 0001
94  */
95 static unsigned long __find_rev_next_bit(const unsigned long *addr,
96                         unsigned long size, unsigned long offset)
97 {
98         const unsigned long *p = addr + BIT_WORD(offset);
99         unsigned long result = size;
100         unsigned long tmp;
101
102         if (offset >= size)
103                 return size;
104
105         size -= (offset & ~(BITS_PER_LONG - 1));
106         offset %= BITS_PER_LONG;
107
108         while (1) {
109                 if (*p == 0)
110                         goto pass;
111
112                 tmp = __reverse_ulong((unsigned char *)p);
113
114                 tmp &= ~0UL >> offset;
115                 if (size < BITS_PER_LONG)
116                         tmp &= (~0UL << (BITS_PER_LONG - size));
117                 if (tmp)
118                         goto found;
119 pass:
120                 if (size <= BITS_PER_LONG)
121                         break;
122                 size -= BITS_PER_LONG;
123                 offset = 0;
124                 p++;
125         }
126         return result;
127 found:
128         return result - size + __reverse_ffs(tmp);
129 }
130
131 static unsigned long __find_rev_next_zero_bit(const unsigned long *addr,
132                         unsigned long size, unsigned long offset)
133 {
134         const unsigned long *p = addr + BIT_WORD(offset);
135         unsigned long result = size;
136         unsigned long tmp;
137
138         if (offset >= size)
139                 return size;
140
141         size -= (offset & ~(BITS_PER_LONG - 1));
142         offset %= BITS_PER_LONG;
143
144         while (1) {
145                 if (*p == ~0UL)
146                         goto pass;
147
148                 tmp = __reverse_ulong((unsigned char *)p);
149
150                 if (offset)
151                         tmp |= ~0UL << (BITS_PER_LONG - offset);
152                 if (size < BITS_PER_LONG)
153                         tmp |= ~0UL >> size;
154                 if (tmp != ~0UL)
155                         goto found;
156 pass:
157                 if (size <= BITS_PER_LONG)
158                         break;
159                 size -= BITS_PER_LONG;
160                 offset = 0;
161                 p++;
162         }
163         return result;
164 found:
165         return result - size + __reverse_ffz(tmp);
166 }
167
168 void register_inmem_page(struct inode *inode, struct page *page)
169 {
170         struct f2fs_inode_info *fi = F2FS_I(inode);
171         struct inmem_pages *new;
172
173         f2fs_trace_pid(page);
174
175         set_page_private(page, (unsigned long)ATOMIC_WRITTEN_PAGE);
176         SetPagePrivate(page);
177
178         new = f2fs_kmem_cache_alloc(inmem_entry_slab, GFP_NOFS);
179
180         /* add atomic page indices to the list */
181         new->page = page;
182         INIT_LIST_HEAD(&new->list);
183
184         /* increase reference count with clean state */
185         mutex_lock(&fi->inmem_lock);
186         get_page(page);
187         list_add_tail(&new->list, &fi->inmem_pages);
188         inc_page_count(F2FS_I_SB(inode), F2FS_INMEM_PAGES);
189         mutex_unlock(&fi->inmem_lock);
190
191         trace_f2fs_register_inmem_page(page, INMEM);
192 }
193
194 static int __revoke_inmem_pages(struct inode *inode,
195                                 struct list_head *head, bool drop, bool recover)
196 {
197         struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
198         struct inmem_pages *cur, *tmp;
199         int err = 0;
200
201         list_for_each_entry_safe(cur, tmp, head, list) {
202                 struct page *page = cur->page;
203
204                 if (drop)
205                         trace_f2fs_commit_inmem_page(page, INMEM_DROP);
206
207                 lock_page(page);
208
209                 if (recover) {
210                         struct dnode_of_data dn;
211                         struct node_info ni;
212
213                         trace_f2fs_commit_inmem_page(page, INMEM_REVOKE);
214
215                         set_new_dnode(&dn, inode, NULL, NULL, 0);
216                         if (get_dnode_of_data(&dn, page->index, LOOKUP_NODE)) {
217                                 err = -EAGAIN;
218                                 goto next;
219                         }
220                         get_node_info(sbi, dn.nid, &ni);
221                         f2fs_replace_block(sbi, &dn, dn.data_blkaddr,
222                                         cur->old_addr, ni.version, true, true);
223                         f2fs_put_dnode(&dn);
224                 }
225 next:
226                 /* we don't need to invalidate this in the sccessful status */
227                 if (drop || recover)
228                         ClearPageUptodate(page);
229                 set_page_private(page, 0);
230                 ClearPagePrivate(page);
231                 f2fs_put_page(page, 1);
232
233                 list_del(&cur->list);
234                 kmem_cache_free(inmem_entry_slab, cur);
235                 dec_page_count(F2FS_I_SB(inode), F2FS_INMEM_PAGES);
236         }
237         return err;
238 }
239
240 void drop_inmem_pages(struct inode *inode)
241 {
242         struct f2fs_inode_info *fi = F2FS_I(inode);
243
244         clear_inode_flag(F2FS_I(inode), FI_ATOMIC_FILE);
245
246         mutex_lock(&fi->inmem_lock);
247         __revoke_inmem_pages(inode, &fi->inmem_pages, true, false);
248         mutex_unlock(&fi->inmem_lock);
249 }
250
251 static int __commit_inmem_pages(struct inode *inode,
252                                         struct list_head *revoke_list)
253 {
254         struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
255         struct f2fs_inode_info *fi = F2FS_I(inode);
256         struct inmem_pages *cur, *tmp;
257         struct f2fs_io_info fio = {
258                 .sbi = sbi,
259                 .type = DATA,
260                 .rw = WRITE_SYNC | REQ_PRIO,
261                 .encrypted_page = NULL,
262         };
263         bool submit_bio = false;
264         int err = 0;
265
266         list_for_each_entry_safe(cur, tmp, &fi->inmem_pages, list) {
267                 struct page *page = cur->page;
268
269                 lock_page(page);
270                 if (page->mapping == inode->i_mapping) {
271                         trace_f2fs_commit_inmem_page(page, INMEM);
272
273                         set_page_dirty(page);
274                         f2fs_wait_on_page_writeback(page, DATA, true);
275                         if (clear_page_dirty_for_io(page))
276                                 inode_dec_dirty_pages(inode);
277
278                         fio.page = page;
279                         err = do_write_data_page(&fio);
280                         if (err) {
281                                 unlock_page(page);
282                                 break;
283                         }
284
285                         /* record old blkaddr for revoking */
286                         cur->old_addr = fio.old_blkaddr;
287
288                         clear_cold_data(page);
289                         submit_bio = true;
290                 }
291                 unlock_page(page);
292                 list_move_tail(&cur->list, revoke_list);
293         }
294
295         if (submit_bio)
296                 f2fs_submit_merged_bio_cond(sbi, inode, NULL, 0, DATA, WRITE);
297
298         if (!err)
299                 __revoke_inmem_pages(inode, revoke_list, false, false);
300
301         return err;
302 }
303
304 int commit_inmem_pages(struct inode *inode)
305 {
306         struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
307         struct f2fs_inode_info *fi = F2FS_I(inode);
308         struct list_head revoke_list;
309         int err;
310
311         INIT_LIST_HEAD(&revoke_list);
312         f2fs_balance_fs(sbi, true);
313         f2fs_lock_op(sbi);
314
315         mutex_lock(&fi->inmem_lock);
316         err = __commit_inmem_pages(inode, &revoke_list);
317         if (err) {
318                 int ret;
319                 /*
320                  * try to revoke all committed pages, but still we could fail
321                  * due to no memory or other reason, if that happened, EAGAIN
322                  * will be returned, which means in such case, transaction is
323                  * already not integrity, caller should use journal to do the
324                  * recovery or rewrite & commit last transaction. For other
325                  * error number, revoking was done by filesystem itself.
326                  */
327                 ret = __revoke_inmem_pages(inode, &revoke_list, false, true);
328                 if (ret)
329                         err = ret;
330
331                 /* drop all uncommitted pages */
332                 __revoke_inmem_pages(inode, &fi->inmem_pages, true, false);
333         }
334         mutex_unlock(&fi->inmem_lock);
335
336         f2fs_unlock_op(sbi);
337         return err;
338 }
339
340 /*
341  * This function balances dirty node and dentry pages.
342  * In addition, it controls garbage collection.
343  */
344 void f2fs_balance_fs(struct f2fs_sb_info *sbi, bool need)
345 {
346         if (!need)
347                 return;
348         /*
349          * We should do GC or end up with checkpoint, if there are so many dirty
350          * dir/node pages without enough free segments.
351          */
352         if (has_not_enough_free_secs(sbi, 0)) {
353                 mutex_lock(&sbi->gc_mutex);
354                 f2fs_gc(sbi, false);
355         }
356 }
357
358 void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi)
359 {
360         /* try to shrink extent cache when there is no enough memory */
361         if (!available_free_memory(sbi, EXTENT_CACHE))
362                 f2fs_shrink_extent_tree(sbi, EXTENT_CACHE_SHRINK_NUMBER);
363
364         /* check the # of cached NAT entries */
365         if (!available_free_memory(sbi, NAT_ENTRIES))
366                 try_to_free_nats(sbi, NAT_ENTRY_PER_BLOCK);
367
368         if (!available_free_memory(sbi, FREE_NIDS))
369                 try_to_free_nids(sbi, NAT_ENTRY_PER_BLOCK * FREE_NID_PAGES);
370
371         /* checkpoint is the only way to shrink partial cached entries */
372         if (!available_free_memory(sbi, NAT_ENTRIES) ||
373                         !available_free_memory(sbi, INO_ENTRIES) ||
374                         excess_prefree_segs(sbi) ||
375                         excess_dirty_nats(sbi) ||
376                         (is_idle(sbi) && f2fs_time_over(sbi, CP_TIME))) {
377                 if (test_opt(sbi, DATA_FLUSH)) {
378                         struct blk_plug plug;
379
380                         blk_start_plug(&plug);
381                         sync_dirty_inodes(sbi, FILE_INODE);
382                         blk_finish_plug(&plug);
383                 }
384                 f2fs_sync_fs(sbi->sb, true);
385                 stat_inc_bg_cp_count(sbi->stat_info);
386         }
387 }
388
389 static int issue_flush_thread(void *data)
390 {
391         struct f2fs_sb_info *sbi = data;
392         struct flush_cmd_control *fcc = SM_I(sbi)->cmd_control_info;
393         wait_queue_head_t *q = &fcc->flush_wait_queue;
394 repeat:
395         if (kthread_should_stop())
396                 return 0;
397
398         if (!llist_empty(&fcc->issue_list)) {
399                 struct bio *bio;
400                 struct flush_cmd *cmd, *next;
401                 int ret;
402
403                 bio = f2fs_bio_alloc(0);
404
405                 fcc->dispatch_list = llist_del_all(&fcc->issue_list);
406                 fcc->dispatch_list = llist_reverse_order(fcc->dispatch_list);
407
408                 bio->bi_bdev = sbi->sb->s_bdev;
409                 bio->bi_rw = WRITE_FLUSH;
410                 ret = submit_bio_wait(bio);
411
412                 llist_for_each_entry_safe(cmd, next,
413                                           fcc->dispatch_list, llnode) {
414                         cmd->ret = ret;
415                         complete(&cmd->wait);
416                 }
417                 bio_put(bio);
418                 fcc->dispatch_list = NULL;
419         }
420
421         wait_event_interruptible(*q,
422                 kthread_should_stop() || !llist_empty(&fcc->issue_list));
423         goto repeat;
424 }
425
426 int f2fs_issue_flush(struct f2fs_sb_info *sbi)
427 {
428         struct flush_cmd_control *fcc = SM_I(sbi)->cmd_control_info;
429         struct flush_cmd cmd;
430
431         trace_f2fs_issue_flush(sbi->sb, test_opt(sbi, NOBARRIER),
432                                         test_opt(sbi, FLUSH_MERGE));
433
434         if (test_opt(sbi, NOBARRIER))
435                 return 0;
436
437         if (!test_opt(sbi, FLUSH_MERGE)) {
438                 struct bio *bio = f2fs_bio_alloc(0);
439                 int ret;
440
441                 bio->bi_bdev = sbi->sb->s_bdev;
442                 bio->bi_rw = WRITE_FLUSH;
443                 ret = submit_bio_wait(bio);
444                 bio_put(bio);
445                 return ret;
446         }
447
448         init_completion(&cmd.wait);
449
450         llist_add(&cmd.llnode, &fcc->issue_list);
451
452         if (!fcc->dispatch_list)
453                 wake_up(&fcc->flush_wait_queue);
454
455         wait_for_completion(&cmd.wait);
456
457         return cmd.ret;
458 }
459
460 int create_flush_cmd_control(struct f2fs_sb_info *sbi)
461 {
462         dev_t dev = sbi->sb->s_bdev->bd_dev;
463         struct flush_cmd_control *fcc;
464         int err = 0;
465
466         fcc = kzalloc(sizeof(struct flush_cmd_control), GFP_KERNEL);
467         if (!fcc)
468                 return -ENOMEM;
469         init_waitqueue_head(&fcc->flush_wait_queue);
470         init_llist_head(&fcc->issue_list);
471         SM_I(sbi)->cmd_control_info = fcc;
472         fcc->f2fs_issue_flush = kthread_run(issue_flush_thread, sbi,
473                                 "f2fs_flush-%u:%u", MAJOR(dev), MINOR(dev));
474         if (IS_ERR(fcc->f2fs_issue_flush)) {
475                 err = PTR_ERR(fcc->f2fs_issue_flush);
476                 kfree(fcc);
477                 SM_I(sbi)->cmd_control_info = NULL;
478                 return err;
479         }
480
481         return err;
482 }
483
484 void destroy_flush_cmd_control(struct f2fs_sb_info *sbi)
485 {
486         struct flush_cmd_control *fcc = SM_I(sbi)->cmd_control_info;
487
488         if (fcc && fcc->f2fs_issue_flush)
489                 kthread_stop(fcc->f2fs_issue_flush);
490         kfree(fcc);
491         SM_I(sbi)->cmd_control_info = NULL;
492 }
493
494 static void __locate_dirty_segment(struct f2fs_sb_info *sbi, unsigned int segno,
495                 enum dirty_type dirty_type)
496 {
497         struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
498
499         /* need not be added */
500         if (IS_CURSEG(sbi, segno))
501                 return;
502
503         if (!test_and_set_bit(segno, dirty_i->dirty_segmap[dirty_type]))
504                 dirty_i->nr_dirty[dirty_type]++;
505
506         if (dirty_type == DIRTY) {
507                 struct seg_entry *sentry = get_seg_entry(sbi, segno);
508                 enum dirty_type t = sentry->type;
509
510                 if (unlikely(t >= DIRTY)) {
511                         f2fs_bug_on(sbi, 1);
512                         return;
513                 }
514                 if (!test_and_set_bit(segno, dirty_i->dirty_segmap[t]))
515                         dirty_i->nr_dirty[t]++;
516         }
517 }
518
519 static void __remove_dirty_segment(struct f2fs_sb_info *sbi, unsigned int segno,
520                 enum dirty_type dirty_type)
521 {
522         struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
523
524         if (test_and_clear_bit(segno, dirty_i->dirty_segmap[dirty_type]))
525                 dirty_i->nr_dirty[dirty_type]--;
526
527         if (dirty_type == DIRTY) {
528                 struct seg_entry *sentry = get_seg_entry(sbi, segno);
529                 enum dirty_type t = sentry->type;
530
531                 if (test_and_clear_bit(segno, dirty_i->dirty_segmap[t]))
532                         dirty_i->nr_dirty[t]--;
533
534                 if (get_valid_blocks(sbi, segno, sbi->segs_per_sec) == 0)
535                         clear_bit(GET_SECNO(sbi, segno),
536                                                 dirty_i->victim_secmap);
537         }
538 }
539
540 /*
541  * Should not occur error such as -ENOMEM.
542  * Adding dirty entry into seglist is not critical operation.
543  * If a given segment is one of current working segments, it won't be added.
544  */
545 static void locate_dirty_segment(struct f2fs_sb_info *sbi, unsigned int segno)
546 {
547         struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
548         unsigned short valid_blocks;
549
550         if (segno == NULL_SEGNO || IS_CURSEG(sbi, segno))
551                 return;
552
553         mutex_lock(&dirty_i->seglist_lock);
554
555         valid_blocks = get_valid_blocks(sbi, segno, 0);
556
557         if (valid_blocks == 0) {
558                 __locate_dirty_segment(sbi, segno, PRE);
559                 __remove_dirty_segment(sbi, segno, DIRTY);
560         } else if (valid_blocks < sbi->blocks_per_seg) {
561                 __locate_dirty_segment(sbi, segno, DIRTY);
562         } else {
563                 /* Recovery routine with SSR needs this */
564                 __remove_dirty_segment(sbi, segno, DIRTY);
565         }
566
567         mutex_unlock(&dirty_i->seglist_lock);
568 }
569
570 static int f2fs_issue_discard(struct f2fs_sb_info *sbi,
571                                 block_t blkstart, block_t blklen)
572 {
573         sector_t start = SECTOR_FROM_BLOCK(blkstart);
574         sector_t len = SECTOR_FROM_BLOCK(blklen);
575         struct seg_entry *se;
576         unsigned int offset;
577         block_t i;
578
579         for (i = blkstart; i < blkstart + blklen; i++) {
580                 se = get_seg_entry(sbi, GET_SEGNO(sbi, i));
581                 offset = GET_BLKOFF_FROM_SEG0(sbi, i);
582
583                 if (!f2fs_test_and_set_bit(offset, se->discard_map))
584                         sbi->discard_blks--;
585         }
586         trace_f2fs_issue_discard(sbi->sb, blkstart, blklen);
587         return blkdev_issue_discard(sbi->sb->s_bdev, start, len, GFP_NOFS, 0);
588 }
589
590 bool discard_next_dnode(struct f2fs_sb_info *sbi, block_t blkaddr)
591 {
592         int err = -EOPNOTSUPP;
593
594         if (test_opt(sbi, DISCARD)) {
595                 struct seg_entry *se = get_seg_entry(sbi,
596                                 GET_SEGNO(sbi, blkaddr));
597                 unsigned int offset = GET_BLKOFF_FROM_SEG0(sbi, blkaddr);
598
599                 if (f2fs_test_bit(offset, se->discard_map))
600                         return false;
601
602                 err = f2fs_issue_discard(sbi, blkaddr, 1);
603         }
604
605         if (err) {
606                 update_meta_page(sbi, NULL, blkaddr);
607                 return true;
608         }
609         return false;
610 }
611
612 static void __add_discard_entry(struct f2fs_sb_info *sbi,
613                 struct cp_control *cpc, struct seg_entry *se,
614                 unsigned int start, unsigned int end)
615 {
616         struct list_head *head = &SM_I(sbi)->discard_list;
617         struct discard_entry *new, *last;
618
619         if (!list_empty(head)) {
620                 last = list_last_entry(head, struct discard_entry, list);
621                 if (START_BLOCK(sbi, cpc->trim_start) + start ==
622                                                 last->blkaddr + last->len) {
623                         last->len += end - start;
624                         goto done;
625                 }
626         }
627
628         new = f2fs_kmem_cache_alloc(discard_entry_slab, GFP_NOFS);
629         INIT_LIST_HEAD(&new->list);
630         new->blkaddr = START_BLOCK(sbi, cpc->trim_start) + start;
631         new->len = end - start;
632         list_add_tail(&new->list, head);
633 done:
634         SM_I(sbi)->nr_discards += end - start;
635 }
636
637 static void add_discard_addrs(struct f2fs_sb_info *sbi, struct cp_control *cpc)
638 {
639         int entries = SIT_VBLOCK_MAP_SIZE / sizeof(unsigned long);
640         int max_blocks = sbi->blocks_per_seg;
641         struct seg_entry *se = get_seg_entry(sbi, cpc->trim_start);
642         unsigned long *cur_map = (unsigned long *)se->cur_valid_map;
643         unsigned long *ckpt_map = (unsigned long *)se->ckpt_valid_map;
644         unsigned long *discard_map = (unsigned long *)se->discard_map;
645         unsigned long *dmap = SIT_I(sbi)->tmp_map;
646         unsigned int start = 0, end = -1;
647         bool force = (cpc->reason == CP_DISCARD);
648         int i;
649
650         if (se->valid_blocks == max_blocks)
651                 return;
652
653         if (!force) {
654                 if (!test_opt(sbi, DISCARD) || !se->valid_blocks ||
655                     SM_I(sbi)->nr_discards >= SM_I(sbi)->max_discards)
656                         return;
657         }
658
659         /* SIT_VBLOCK_MAP_SIZE should be multiple of sizeof(unsigned long) */
660         for (i = 0; i < entries; i++)
661                 dmap[i] = force ? ~ckpt_map[i] & ~discard_map[i] :
662                                 (cur_map[i] ^ ckpt_map[i]) & ckpt_map[i];
663
664         while (force || SM_I(sbi)->nr_discards <= SM_I(sbi)->max_discards) {
665                 start = __find_rev_next_bit(dmap, max_blocks, end + 1);
666                 if (start >= max_blocks)
667                         break;
668
669                 end = __find_rev_next_zero_bit(dmap, max_blocks, start + 1);
670                 __add_discard_entry(sbi, cpc, se, start, end);
671         }
672 }
673
674 void release_discard_addrs(struct f2fs_sb_info *sbi)
675 {
676         struct list_head *head = &(SM_I(sbi)->discard_list);
677         struct discard_entry *entry, *this;
678
679         /* drop caches */
680         list_for_each_entry_safe(entry, this, head, list) {
681                 list_del(&entry->list);
682                 kmem_cache_free(discard_entry_slab, entry);
683         }
684 }
685
686 /*
687  * Should call clear_prefree_segments after checkpoint is done.
688  */
689 static void set_prefree_as_free_segments(struct f2fs_sb_info *sbi)
690 {
691         struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
692         unsigned int segno;
693
694         mutex_lock(&dirty_i->seglist_lock);
695         for_each_set_bit(segno, dirty_i->dirty_segmap[PRE], MAIN_SEGS(sbi))
696                 __set_test_and_free(sbi, segno);
697         mutex_unlock(&dirty_i->seglist_lock);
698 }
699
700 void clear_prefree_segments(struct f2fs_sb_info *sbi, struct cp_control *cpc)
701 {
702         struct list_head *head = &(SM_I(sbi)->discard_list);
703         struct discard_entry *entry, *this;
704         struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
705         unsigned long *prefree_map = dirty_i->dirty_segmap[PRE];
706         unsigned int start = 0, end = -1;
707
708         mutex_lock(&dirty_i->seglist_lock);
709
710         while (1) {
711                 int i;
712                 start = find_next_bit(prefree_map, MAIN_SEGS(sbi), end + 1);
713                 if (start >= MAIN_SEGS(sbi))
714                         break;
715                 end = find_next_zero_bit(prefree_map, MAIN_SEGS(sbi),
716                                                                 start + 1);
717
718                 for (i = start; i < end; i++)
719                         clear_bit(i, prefree_map);
720
721                 dirty_i->nr_dirty[PRE] -= end - start;
722
723                 if (!test_opt(sbi, DISCARD))
724                         continue;
725
726                 f2fs_issue_discard(sbi, START_BLOCK(sbi, start),
727                                 (end - start) << sbi->log_blocks_per_seg);
728         }
729         mutex_unlock(&dirty_i->seglist_lock);
730
731         /* send small discards */
732         list_for_each_entry_safe(entry, this, head, list) {
733                 if (cpc->reason == CP_DISCARD && entry->len < cpc->trim_minlen)
734                         goto skip;
735                 f2fs_issue_discard(sbi, entry->blkaddr, entry->len);
736                 cpc->trimmed += entry->len;
737 skip:
738                 list_del(&entry->list);
739                 SM_I(sbi)->nr_discards -= entry->len;
740                 kmem_cache_free(discard_entry_slab, entry);
741         }
742 }
743
744 static bool __mark_sit_entry_dirty(struct f2fs_sb_info *sbi, unsigned int segno)
745 {
746         struct sit_info *sit_i = SIT_I(sbi);
747
748         if (!__test_and_set_bit(segno, sit_i->dirty_sentries_bitmap)) {
749                 sit_i->dirty_sentries++;
750                 return false;
751         }
752
753         return true;
754 }
755
756 static void __set_sit_entry_type(struct f2fs_sb_info *sbi, int type,
757                                         unsigned int segno, int modified)
758 {
759         struct seg_entry *se = get_seg_entry(sbi, segno);
760         se->type = type;
761         if (modified)
762                 __mark_sit_entry_dirty(sbi, segno);
763 }
764
765 static void update_sit_entry(struct f2fs_sb_info *sbi, block_t blkaddr, int del)
766 {
767         struct seg_entry *se;
768         unsigned int segno, offset;
769         long int new_vblocks;
770
771         segno = GET_SEGNO(sbi, blkaddr);
772
773         se = get_seg_entry(sbi, segno);
774         new_vblocks = se->valid_blocks + del;
775         offset = GET_BLKOFF_FROM_SEG0(sbi, blkaddr);
776
777         f2fs_bug_on(sbi, (new_vblocks >> (sizeof(unsigned short) << 3) ||
778                                 (new_vblocks > sbi->blocks_per_seg)));
779
780         se->valid_blocks = new_vblocks;
781         se->mtime = get_mtime(sbi);
782         SIT_I(sbi)->max_mtime = se->mtime;
783
784         /* Update valid block bitmap */
785         if (del > 0) {
786                 if (f2fs_test_and_set_bit(offset, se->cur_valid_map))
787                         f2fs_bug_on(sbi, 1);
788                 if (!f2fs_test_and_set_bit(offset, se->discard_map))
789                         sbi->discard_blks--;
790         } else {
791                 if (!f2fs_test_and_clear_bit(offset, se->cur_valid_map))
792                         f2fs_bug_on(sbi, 1);
793                 if (f2fs_test_and_clear_bit(offset, se->discard_map))
794                         sbi->discard_blks++;
795         }
796         if (!f2fs_test_bit(offset, se->ckpt_valid_map))
797                 se->ckpt_valid_blocks += del;
798
799         __mark_sit_entry_dirty(sbi, segno);
800
801         /* update total number of valid blocks to be written in ckpt area */
802         SIT_I(sbi)->written_valid_blocks += del;
803
804         if (sbi->segs_per_sec > 1)
805                 get_sec_entry(sbi, segno)->valid_blocks += del;
806 }
807
808 void refresh_sit_entry(struct f2fs_sb_info *sbi, block_t old, block_t new)
809 {
810         update_sit_entry(sbi, new, 1);
811         if (GET_SEGNO(sbi, old) != NULL_SEGNO)
812                 update_sit_entry(sbi, old, -1);
813
814         locate_dirty_segment(sbi, GET_SEGNO(sbi, old));
815         locate_dirty_segment(sbi, GET_SEGNO(sbi, new));
816 }
817
818 void invalidate_blocks(struct f2fs_sb_info *sbi, block_t addr)
819 {
820         unsigned int segno = GET_SEGNO(sbi, addr);
821         struct sit_info *sit_i = SIT_I(sbi);
822
823         f2fs_bug_on(sbi, addr == NULL_ADDR);
824         if (addr == NEW_ADDR)
825                 return;
826
827         /* add it into sit main buffer */
828         mutex_lock(&sit_i->sentry_lock);
829
830         update_sit_entry(sbi, addr, -1);
831
832         /* add it into dirty seglist */
833         locate_dirty_segment(sbi, segno);
834
835         mutex_unlock(&sit_i->sentry_lock);
836 }
837
838 bool is_checkpointed_data(struct f2fs_sb_info *sbi, block_t blkaddr)
839 {
840         struct sit_info *sit_i = SIT_I(sbi);
841         unsigned int segno, offset;
842         struct seg_entry *se;
843         bool is_cp = false;
844
845         if (blkaddr == NEW_ADDR || blkaddr == NULL_ADDR)
846                 return true;
847
848         mutex_lock(&sit_i->sentry_lock);
849
850         segno = GET_SEGNO(sbi, blkaddr);
851         se = get_seg_entry(sbi, segno);
852         offset = GET_BLKOFF_FROM_SEG0(sbi, blkaddr);
853
854         if (f2fs_test_bit(offset, se->ckpt_valid_map))
855                 is_cp = true;
856
857         mutex_unlock(&sit_i->sentry_lock);
858
859         return is_cp;
860 }
861
862 /*
863  * This function should be resided under the curseg_mutex lock
864  */
865 static void __add_sum_entry(struct f2fs_sb_info *sbi, int type,
866                                         struct f2fs_summary *sum)
867 {
868         struct curseg_info *curseg = CURSEG_I(sbi, type);
869         void *addr = curseg->sum_blk;
870         addr += curseg->next_blkoff * sizeof(struct f2fs_summary);
871         memcpy(addr, sum, sizeof(struct f2fs_summary));
872 }
873
874 /*
875  * Calculate the number of current summary pages for writing
876  */
877 int npages_for_summary_flush(struct f2fs_sb_info *sbi, bool for_ra)
878 {
879         int valid_sum_count = 0;
880         int i, sum_in_page;
881
882         for (i = CURSEG_HOT_DATA; i <= CURSEG_COLD_DATA; i++) {
883                 if (sbi->ckpt->alloc_type[i] == SSR)
884                         valid_sum_count += sbi->blocks_per_seg;
885                 else {
886                         if (for_ra)
887                                 valid_sum_count += le16_to_cpu(
888                                         F2FS_CKPT(sbi)->cur_data_blkoff[i]);
889                         else
890                                 valid_sum_count += curseg_blkoff(sbi, i);
891                 }
892         }
893
894         sum_in_page = (PAGE_SIZE - 2 * SUM_JOURNAL_SIZE -
895                         SUM_FOOTER_SIZE) / SUMMARY_SIZE;
896         if (valid_sum_count <= sum_in_page)
897                 return 1;
898         else if ((valid_sum_count - sum_in_page) <=
899                 (PAGE_SIZE - SUM_FOOTER_SIZE) / SUMMARY_SIZE)
900                 return 2;
901         return 3;
902 }
903
904 /*
905  * Caller should put this summary page
906  */
907 struct page *get_sum_page(struct f2fs_sb_info *sbi, unsigned int segno)
908 {
909         return get_meta_page(sbi, GET_SUM_BLOCK(sbi, segno));
910 }
911
912 void update_meta_page(struct f2fs_sb_info *sbi, void *src, block_t blk_addr)
913 {
914         struct page *page = grab_meta_page(sbi, blk_addr);
915         void *dst = page_address(page);
916
917         if (src)
918                 memcpy(dst, src, PAGE_SIZE);
919         else
920                 memset(dst, 0, PAGE_SIZE);
921         set_page_dirty(page);
922         f2fs_put_page(page, 1);
923 }
924
925 static void write_sum_page(struct f2fs_sb_info *sbi,
926                         struct f2fs_summary_block *sum_blk, block_t blk_addr)
927 {
928         update_meta_page(sbi, (void *)sum_blk, blk_addr);
929 }
930
931 static void write_current_sum_page(struct f2fs_sb_info *sbi,
932                                                 int type, block_t blk_addr)
933 {
934         struct curseg_info *curseg = CURSEG_I(sbi, type);
935         struct page *page = grab_meta_page(sbi, blk_addr);
936         struct f2fs_summary_block *src = curseg->sum_blk;
937         struct f2fs_summary_block *dst;
938
939         dst = (struct f2fs_summary_block *)page_address(page);
940
941         mutex_lock(&curseg->curseg_mutex);
942
943         down_read(&curseg->journal_rwsem);
944         memcpy(&dst->journal, curseg->journal, SUM_JOURNAL_SIZE);
945         up_read(&curseg->journal_rwsem);
946
947         memcpy(dst->entries, src->entries, SUM_ENTRY_SIZE);
948         memcpy(&dst->footer, &src->footer, SUM_FOOTER_SIZE);
949
950         mutex_unlock(&curseg->curseg_mutex);
951
952         set_page_dirty(page);
953         f2fs_put_page(page, 1);
954 }
955
956 static int is_next_segment_free(struct f2fs_sb_info *sbi, int type)
957 {
958         struct curseg_info *curseg = CURSEG_I(sbi, type);
959         unsigned int segno = curseg->segno + 1;
960         struct free_segmap_info *free_i = FREE_I(sbi);
961
962         if (segno < MAIN_SEGS(sbi) && segno % sbi->segs_per_sec)
963                 return !test_bit(segno, free_i->free_segmap);
964         return 0;
965 }
966
967 /*
968  * Find a new segment from the free segments bitmap to right order
969  * This function should be returned with success, otherwise BUG
970  */
971 static void get_new_segment(struct f2fs_sb_info *sbi,
972                         unsigned int *newseg, bool new_sec, int dir)
973 {
974         struct free_segmap_info *free_i = FREE_I(sbi);
975         unsigned int segno, secno, zoneno;
976         unsigned int total_zones = MAIN_SECS(sbi) / sbi->secs_per_zone;
977         unsigned int hint = *newseg / sbi->segs_per_sec;
978         unsigned int old_zoneno = GET_ZONENO_FROM_SEGNO(sbi, *newseg);
979         unsigned int left_start = hint;
980         bool init = true;
981         int go_left = 0;
982         int i;
983
984         spin_lock(&free_i->segmap_lock);
985
986         if (!new_sec && ((*newseg + 1) % sbi->segs_per_sec)) {
987                 segno = find_next_zero_bit(free_i->free_segmap,
988                                 (hint + 1) * sbi->segs_per_sec, *newseg + 1);
989                 if (segno < (hint + 1) * sbi->segs_per_sec)
990                         goto got_it;
991         }
992 find_other_zone:
993         secno = find_next_zero_bit(free_i->free_secmap, MAIN_SECS(sbi), hint);
994         if (secno >= MAIN_SECS(sbi)) {
995                 if (dir == ALLOC_RIGHT) {
996                         secno = find_next_zero_bit(free_i->free_secmap,
997                                                         MAIN_SECS(sbi), 0);
998                         f2fs_bug_on(sbi, secno >= MAIN_SECS(sbi));
999                 } else {
1000                         go_left = 1;
1001                         left_start = hint - 1;
1002                 }
1003         }
1004         if (go_left == 0)
1005                 goto skip_left;
1006
1007         while (test_bit(left_start, free_i->free_secmap)) {
1008                 if (left_start > 0) {
1009                         left_start--;
1010                         continue;
1011                 }
1012                 left_start = find_next_zero_bit(free_i->free_secmap,
1013                                                         MAIN_SECS(sbi), 0);
1014                 f2fs_bug_on(sbi, left_start >= MAIN_SECS(sbi));
1015                 break;
1016         }
1017         secno = left_start;
1018 skip_left:
1019         hint = secno;
1020         segno = secno * sbi->segs_per_sec;
1021         zoneno = secno / sbi->secs_per_zone;
1022
1023         /* give up on finding another zone */
1024         if (!init)
1025                 goto got_it;
1026         if (sbi->secs_per_zone == 1)
1027                 goto got_it;
1028         if (zoneno == old_zoneno)
1029                 goto got_it;
1030         if (dir == ALLOC_LEFT) {
1031                 if (!go_left && zoneno + 1 >= total_zones)
1032                         goto got_it;
1033                 if (go_left && zoneno == 0)
1034                         goto got_it;
1035         }
1036         for (i = 0; i < NR_CURSEG_TYPE; i++)
1037                 if (CURSEG_I(sbi, i)->zone == zoneno)
1038                         break;
1039
1040         if (i < NR_CURSEG_TYPE) {
1041                 /* zone is in user, try another */
1042                 if (go_left)
1043                         hint = zoneno * sbi->secs_per_zone - 1;
1044                 else if (zoneno + 1 >= total_zones)
1045                         hint = 0;
1046                 else
1047                         hint = (zoneno + 1) * sbi->secs_per_zone;
1048                 init = false;
1049                 goto find_other_zone;
1050         }
1051 got_it:
1052         /* set it as dirty segment in free segmap */
1053         f2fs_bug_on(sbi, test_bit(segno, free_i->free_segmap));
1054         __set_inuse(sbi, segno);
1055         *newseg = segno;
1056         spin_unlock(&free_i->segmap_lock);
1057 }
1058
1059 static void reset_curseg(struct f2fs_sb_info *sbi, int type, int modified)
1060 {
1061         struct curseg_info *curseg = CURSEG_I(sbi, type);
1062         struct summary_footer *sum_footer;
1063
1064         curseg->segno = curseg->next_segno;
1065         curseg->zone = GET_ZONENO_FROM_SEGNO(sbi, curseg->segno);
1066         curseg->next_blkoff = 0;
1067         curseg->next_segno = NULL_SEGNO;
1068
1069         sum_footer = &(curseg->sum_blk->footer);
1070         memset(sum_footer, 0, sizeof(struct summary_footer));
1071         if (IS_DATASEG(type))
1072                 SET_SUM_TYPE(sum_footer, SUM_TYPE_DATA);
1073         if (IS_NODESEG(type))
1074                 SET_SUM_TYPE(sum_footer, SUM_TYPE_NODE);
1075         __set_sit_entry_type(sbi, type, curseg->segno, modified);
1076 }
1077
1078 /*
1079  * Allocate a current working segment.
1080  * This function always allocates a free segment in LFS manner.
1081  */
1082 static void new_curseg(struct f2fs_sb_info *sbi, int type, bool new_sec)
1083 {
1084         struct curseg_info *curseg = CURSEG_I(sbi, type);
1085         unsigned int segno = curseg->segno;
1086         int dir = ALLOC_LEFT;
1087
1088         write_sum_page(sbi, curseg->sum_blk,
1089                                 GET_SUM_BLOCK(sbi, segno));
1090         if (type == CURSEG_WARM_DATA || type == CURSEG_COLD_DATA)
1091                 dir = ALLOC_RIGHT;
1092
1093         if (test_opt(sbi, NOHEAP))
1094                 dir = ALLOC_RIGHT;
1095
1096         get_new_segment(sbi, &segno, new_sec, dir);
1097         curseg->next_segno = segno;
1098         reset_curseg(sbi, type, 1);
1099         curseg->alloc_type = LFS;
1100 }
1101
1102 static void __next_free_blkoff(struct f2fs_sb_info *sbi,
1103                         struct curseg_info *seg, block_t start)
1104 {
1105         struct seg_entry *se = get_seg_entry(sbi, seg->segno);
1106         int entries = SIT_VBLOCK_MAP_SIZE / sizeof(unsigned long);
1107         unsigned long *target_map = SIT_I(sbi)->tmp_map;
1108         unsigned long *ckpt_map = (unsigned long *)se->ckpt_valid_map;
1109         unsigned long *cur_map = (unsigned long *)se->cur_valid_map;
1110         int i, pos;
1111
1112         for (i = 0; i < entries; i++)
1113                 target_map[i] = ckpt_map[i] | cur_map[i];
1114
1115         pos = __find_rev_next_zero_bit(target_map, sbi->blocks_per_seg, start);
1116
1117         seg->next_blkoff = pos;
1118 }
1119
1120 /*
1121  * If a segment is written by LFS manner, next block offset is just obtained
1122  * by increasing the current block offset. However, if a segment is written by
1123  * SSR manner, next block offset obtained by calling __next_free_blkoff
1124  */
1125 static void __refresh_next_blkoff(struct f2fs_sb_info *sbi,
1126                                 struct curseg_info *seg)
1127 {
1128         if (seg->alloc_type == SSR)
1129                 __next_free_blkoff(sbi, seg, seg->next_blkoff + 1);
1130         else
1131                 seg->next_blkoff++;
1132 }
1133
1134 /*
1135  * This function always allocates a used segment(from dirty seglist) by SSR
1136  * manner, so it should recover the existing segment information of valid blocks
1137  */
1138 static void change_curseg(struct f2fs_sb_info *sbi, int type, bool reuse)
1139 {
1140         struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
1141         struct curseg_info *curseg = CURSEG_I(sbi, type);
1142         unsigned int new_segno = curseg->next_segno;
1143         struct f2fs_summary_block *sum_node;
1144         struct page *sum_page;
1145
1146         write_sum_page(sbi, curseg->sum_blk,
1147                                 GET_SUM_BLOCK(sbi, curseg->segno));
1148         __set_test_and_inuse(sbi, new_segno);
1149
1150         mutex_lock(&dirty_i->seglist_lock);
1151         __remove_dirty_segment(sbi, new_segno, PRE);
1152         __remove_dirty_segment(sbi, new_segno, DIRTY);
1153         mutex_unlock(&dirty_i->seglist_lock);
1154
1155         reset_curseg(sbi, type, 1);
1156         curseg->alloc_type = SSR;
1157         __next_free_blkoff(sbi, curseg, 0);
1158
1159         if (reuse) {
1160                 sum_page = get_sum_page(sbi, new_segno);
1161                 sum_node = (struct f2fs_summary_block *)page_address(sum_page);
1162                 memcpy(curseg->sum_blk, sum_node, SUM_ENTRY_SIZE);
1163                 f2fs_put_page(sum_page, 1);
1164         }
1165 }
1166
1167 static int get_ssr_segment(struct f2fs_sb_info *sbi, int type)
1168 {
1169         struct curseg_info *curseg = CURSEG_I(sbi, type);
1170         const struct victim_selection *v_ops = DIRTY_I(sbi)->v_ops;
1171
1172         if (IS_NODESEG(type) || !has_not_enough_free_secs(sbi, 0))
1173                 return v_ops->get_victim(sbi,
1174                                 &(curseg)->next_segno, BG_GC, type, SSR);
1175
1176         /* For data segments, let's do SSR more intensively */
1177         for (; type >= CURSEG_HOT_DATA; type--)
1178                 if (v_ops->get_victim(sbi, &(curseg)->next_segno,
1179                                                 BG_GC, type, SSR))
1180                         return 1;
1181         return 0;
1182 }
1183
1184 /*
1185  * flush out current segment and replace it with new segment
1186  * This function should be returned with success, otherwise BUG
1187  */
1188 static void allocate_segment_by_default(struct f2fs_sb_info *sbi,
1189                                                 int type, bool force)
1190 {
1191         struct curseg_info *curseg = CURSEG_I(sbi, type);
1192
1193         if (force)
1194                 new_curseg(sbi, type, true);
1195         else if (type == CURSEG_WARM_NODE)
1196                 new_curseg(sbi, type, false);
1197         else if (curseg->alloc_type == LFS && is_next_segment_free(sbi, type))
1198                 new_curseg(sbi, type, false);
1199         else if (need_SSR(sbi) && get_ssr_segment(sbi, type))
1200                 change_curseg(sbi, type, true);
1201         else
1202                 new_curseg(sbi, type, false);
1203
1204         stat_inc_seg_type(sbi, curseg);
1205 }
1206
1207 static void __allocate_new_segments(struct f2fs_sb_info *sbi, int type)
1208 {
1209         struct curseg_info *curseg = CURSEG_I(sbi, type);
1210         unsigned int old_segno;
1211
1212         old_segno = curseg->segno;
1213         SIT_I(sbi)->s_ops->allocate_segment(sbi, type, true);
1214         locate_dirty_segment(sbi, old_segno);
1215 }
1216
1217 void allocate_new_segments(struct f2fs_sb_info *sbi)
1218 {
1219         int i;
1220
1221         for (i = CURSEG_HOT_DATA; i <= CURSEG_COLD_DATA; i++)
1222                 __allocate_new_segments(sbi, i);
1223 }
1224
1225 static const struct segment_allocation default_salloc_ops = {
1226         .allocate_segment = allocate_segment_by_default,
1227 };
1228
1229 int f2fs_trim_fs(struct f2fs_sb_info *sbi, struct fstrim_range *range)
1230 {
1231         __u64 start = F2FS_BYTES_TO_BLK(range->start);
1232         __u64 end = start + F2FS_BYTES_TO_BLK(range->len) - 1;
1233         unsigned int start_segno, end_segno;
1234         struct cp_control cpc;
1235         int err = 0;
1236
1237         if (start >= MAX_BLKADDR(sbi) || range->len < sbi->blocksize)
1238                 return -EINVAL;
1239
1240         cpc.trimmed = 0;
1241         if (end <= MAIN_BLKADDR(sbi))
1242                 goto out;
1243
1244         /* start/end segment number in main_area */
1245         start_segno = (start <= MAIN_BLKADDR(sbi)) ? 0 : GET_SEGNO(sbi, start);
1246         end_segno = (end >= MAX_BLKADDR(sbi)) ? MAIN_SEGS(sbi) - 1 :
1247                                                 GET_SEGNO(sbi, end);
1248         cpc.reason = CP_DISCARD;
1249         cpc.trim_minlen = max_t(__u64, 1, F2FS_BYTES_TO_BLK(range->minlen));
1250
1251         /* do checkpoint to issue discard commands safely */
1252         for (; start_segno <= end_segno; start_segno = cpc.trim_end + 1) {
1253                 cpc.trim_start = start_segno;
1254
1255                 if (sbi->discard_blks == 0)
1256                         break;
1257                 else if (sbi->discard_blks < BATCHED_TRIM_BLOCKS(sbi))
1258                         cpc.trim_end = end_segno;
1259                 else
1260                         cpc.trim_end = min_t(unsigned int,
1261                                 rounddown(start_segno +
1262                                 BATCHED_TRIM_SEGMENTS(sbi),
1263                                 sbi->segs_per_sec) - 1, end_segno);
1264
1265                 mutex_lock(&sbi->gc_mutex);
1266                 err = write_checkpoint(sbi, &cpc);
1267                 mutex_unlock(&sbi->gc_mutex);
1268         }
1269 out:
1270         range->len = F2FS_BLK_TO_BYTES(cpc.trimmed);
1271         return err;
1272 }
1273
1274 static bool __has_curseg_space(struct f2fs_sb_info *sbi, int type)
1275 {
1276         struct curseg_info *curseg = CURSEG_I(sbi, type);
1277         if (curseg->next_blkoff < sbi->blocks_per_seg)
1278                 return true;
1279         return false;
1280 }
1281
1282 static int __get_segment_type_2(struct page *page, enum page_type p_type)
1283 {
1284         if (p_type == DATA)
1285                 return CURSEG_HOT_DATA;
1286         else
1287                 return CURSEG_HOT_NODE;
1288 }
1289
1290 static int __get_segment_type_4(struct page *page, enum page_type p_type)
1291 {
1292         if (p_type == DATA) {
1293                 struct inode *inode = page->mapping->host;
1294
1295                 if (S_ISDIR(inode->i_mode))
1296                         return CURSEG_HOT_DATA;
1297                 else
1298                         return CURSEG_COLD_DATA;
1299         } else {
1300                 if (IS_DNODE(page) && is_cold_node(page))
1301                         return CURSEG_WARM_NODE;
1302                 else
1303                         return CURSEG_COLD_NODE;
1304         }
1305 }
1306
1307 static int __get_segment_type_6(struct page *page, enum page_type p_type)
1308 {
1309         if (p_type == DATA) {
1310                 struct inode *inode = page->mapping->host;
1311
1312                 if (S_ISDIR(inode->i_mode))
1313                         return CURSEG_HOT_DATA;
1314                 else if (is_cold_data(page) || file_is_cold(inode))
1315                         return CURSEG_COLD_DATA;
1316                 else
1317                         return CURSEG_WARM_DATA;
1318         } else {
1319                 if (IS_DNODE(page))
1320                         return is_cold_node(page) ? CURSEG_WARM_NODE :
1321                                                 CURSEG_HOT_NODE;
1322                 else
1323                         return CURSEG_COLD_NODE;
1324         }
1325 }
1326
1327 static int __get_segment_type(struct page *page, enum page_type p_type)
1328 {
1329         switch (F2FS_P_SB(page)->active_logs) {
1330         case 2:
1331                 return __get_segment_type_2(page, p_type);
1332         case 4:
1333                 return __get_segment_type_4(page, p_type);
1334         }
1335         /* NR_CURSEG_TYPE(6) logs by default */
1336         f2fs_bug_on(F2FS_P_SB(page),
1337                 F2FS_P_SB(page)->active_logs != NR_CURSEG_TYPE);
1338         return __get_segment_type_6(page, p_type);
1339 }
1340
1341 void allocate_data_block(struct f2fs_sb_info *sbi, struct page *page,
1342                 block_t old_blkaddr, block_t *new_blkaddr,
1343                 struct f2fs_summary *sum, int type)
1344 {
1345         struct sit_info *sit_i = SIT_I(sbi);
1346         struct curseg_info *curseg;
1347         bool direct_io = (type == CURSEG_DIRECT_IO);
1348
1349         type = direct_io ? CURSEG_WARM_DATA : type;
1350
1351         curseg = CURSEG_I(sbi, type);
1352
1353         mutex_lock(&curseg->curseg_mutex);
1354         mutex_lock(&sit_i->sentry_lock);
1355
1356         /* direct_io'ed data is aligned to the segment for better performance */
1357         if (direct_io && curseg->next_blkoff &&
1358                                 !has_not_enough_free_secs(sbi, 0))
1359                 __allocate_new_segments(sbi, type);
1360
1361         *new_blkaddr = NEXT_FREE_BLKADDR(sbi, curseg);
1362
1363         /*
1364          * __add_sum_entry should be resided under the curseg_mutex
1365          * because, this function updates a summary entry in the
1366          * current summary block.
1367          */
1368         __add_sum_entry(sbi, type, sum);
1369
1370         __refresh_next_blkoff(sbi, curseg);
1371
1372         stat_inc_block_count(sbi, curseg);
1373
1374         if (!__has_curseg_space(sbi, type))
1375                 sit_i->s_ops->allocate_segment(sbi, type, false);
1376         /*
1377          * SIT information should be updated before segment allocation,
1378          * since SSR needs latest valid block information.
1379          */
1380         refresh_sit_entry(sbi, old_blkaddr, *new_blkaddr);
1381
1382         mutex_unlock(&sit_i->sentry_lock);
1383
1384         if (page && IS_NODESEG(type))
1385                 fill_node_footer_blkaddr(page, NEXT_FREE_BLKADDR(sbi, curseg));
1386
1387         mutex_unlock(&curseg->curseg_mutex);
1388 }
1389
1390 static void do_write_page(struct f2fs_summary *sum, struct f2fs_io_info *fio)
1391 {
1392         int type = __get_segment_type(fio->page, fio->type);
1393
1394         allocate_data_block(fio->sbi, fio->page, fio->old_blkaddr,
1395                                         &fio->new_blkaddr, sum, type);
1396
1397         /* writeout dirty page into bdev */
1398         f2fs_submit_page_mbio(fio);
1399 }
1400
1401 void write_meta_page(struct f2fs_sb_info *sbi, struct page *page)
1402 {
1403         struct f2fs_io_info fio = {
1404                 .sbi = sbi,
1405                 .type = META,
1406                 .rw = WRITE_SYNC | REQ_META | REQ_PRIO,
1407                 .old_blkaddr = page->index,
1408                 .new_blkaddr = page->index,
1409                 .page = page,
1410                 .encrypted_page = NULL,
1411         };
1412
1413         if (unlikely(page->index >= MAIN_BLKADDR(sbi)))
1414                 fio.rw &= ~REQ_META;
1415
1416         set_page_writeback(page);
1417         f2fs_submit_page_mbio(&fio);
1418 }
1419
1420 void write_node_page(unsigned int nid, struct f2fs_io_info *fio)
1421 {
1422         struct f2fs_summary sum;
1423
1424         set_summary(&sum, nid, 0, 0);
1425         do_write_page(&sum, fio);
1426 }
1427
1428 void write_data_page(struct dnode_of_data *dn, struct f2fs_io_info *fio)
1429 {
1430         struct f2fs_sb_info *sbi = fio->sbi;
1431         struct f2fs_summary sum;
1432         struct node_info ni;
1433
1434         f2fs_bug_on(sbi, dn->data_blkaddr == NULL_ADDR);
1435         get_node_info(sbi, dn->nid, &ni);
1436         set_summary(&sum, dn->nid, dn->ofs_in_node, ni.version);
1437         do_write_page(&sum, fio);
1438         f2fs_update_data_blkaddr(dn, fio->new_blkaddr);
1439 }
1440
1441 void rewrite_data_page(struct f2fs_io_info *fio)
1442 {
1443         fio->new_blkaddr = fio->old_blkaddr;
1444         stat_inc_inplace_blocks(fio->sbi);
1445         f2fs_submit_page_mbio(fio);
1446 }
1447
1448 void __f2fs_replace_block(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,
1449                                 block_t old_blkaddr, block_t new_blkaddr,
1450                                 bool recover_curseg, bool recover_newaddr)
1451 {
1452         struct sit_info *sit_i = SIT_I(sbi);
1453         struct curseg_info *curseg;
1454         unsigned int segno, old_cursegno;
1455         struct seg_entry *se;
1456         int type;
1457         unsigned short old_blkoff;
1458
1459         segno = GET_SEGNO(sbi, new_blkaddr);
1460         se = get_seg_entry(sbi, segno);
1461         type = se->type;
1462
1463         if (!recover_curseg) {
1464                 /* for recovery flow */
1465                 if (se->valid_blocks == 0 && !IS_CURSEG(sbi, segno)) {
1466                         if (old_blkaddr == NULL_ADDR)
1467                                 type = CURSEG_COLD_DATA;
1468                         else
1469                                 type = CURSEG_WARM_DATA;
1470                 }
1471         } else {
1472                 if (!IS_CURSEG(sbi, segno))
1473                         type = CURSEG_WARM_DATA;
1474         }
1475
1476         curseg = CURSEG_I(sbi, type);
1477
1478         mutex_lock(&curseg->curseg_mutex);
1479         mutex_lock(&sit_i->sentry_lock);
1480
1481         old_cursegno = curseg->segno;
1482         old_blkoff = curseg->next_blkoff;
1483
1484         /* change the current segment */
1485         if (segno != curseg->segno) {
1486                 curseg->next_segno = segno;
1487                 change_curseg(sbi, type, true);
1488         }
1489
1490         curseg->next_blkoff = GET_BLKOFF_FROM_SEG0(sbi, new_blkaddr);
1491         __add_sum_entry(sbi, type, sum);
1492
1493         if (!recover_curseg || recover_newaddr)
1494                 update_sit_entry(sbi, new_blkaddr, 1);
1495         if (GET_SEGNO(sbi, old_blkaddr) != NULL_SEGNO)
1496                 update_sit_entry(sbi, old_blkaddr, -1);
1497
1498         locate_dirty_segment(sbi, GET_SEGNO(sbi, old_blkaddr));
1499         locate_dirty_segment(sbi, GET_SEGNO(sbi, new_blkaddr));
1500
1501         locate_dirty_segment(sbi, old_cursegno);
1502
1503         if (recover_curseg) {
1504                 if (old_cursegno != curseg->segno) {
1505                         curseg->next_segno = old_cursegno;
1506                         change_curseg(sbi, type, true);
1507                 }
1508                 curseg->next_blkoff = old_blkoff;
1509         }
1510
1511         mutex_unlock(&sit_i->sentry_lock);
1512         mutex_unlock(&curseg->curseg_mutex);
1513 }
1514
1515 void f2fs_replace_block(struct f2fs_sb_info *sbi, struct dnode_of_data *dn,
1516                                 block_t old_addr, block_t new_addr,
1517                                 unsigned char version, bool recover_curseg,
1518                                 bool recover_newaddr)
1519 {
1520         struct f2fs_summary sum;
1521
1522         set_summary(&sum, dn->nid, dn->ofs_in_node, version);
1523
1524         __f2fs_replace_block(sbi, &sum, old_addr, new_addr,
1525                                         recover_curseg, recover_newaddr);
1526
1527         f2fs_update_data_blkaddr(dn, new_addr);
1528 }
1529
1530 void f2fs_wait_on_page_writeback(struct page *page,
1531                                 enum page_type type, bool ordered)
1532 {
1533         if (PageWriteback(page)) {
1534                 struct f2fs_sb_info *sbi = F2FS_P_SB(page);
1535
1536                 f2fs_submit_merged_bio_cond(sbi, NULL, page, 0, type, WRITE);
1537                 if (ordered)
1538                         wait_on_page_writeback(page);
1539                 else
1540                         wait_for_stable_page(page);
1541         }
1542 }
1543
1544 void f2fs_wait_on_encrypted_page_writeback(struct f2fs_sb_info *sbi,
1545                                                         block_t blkaddr)
1546 {
1547         struct page *cpage;
1548
1549         if (blkaddr == NEW_ADDR)
1550                 return;
1551
1552         f2fs_bug_on(sbi, blkaddr == NULL_ADDR);
1553
1554         cpage = find_lock_page(META_MAPPING(sbi), blkaddr);
1555         if (cpage) {
1556                 f2fs_wait_on_page_writeback(cpage, DATA, true);
1557                 f2fs_put_page(cpage, 1);
1558         }
1559 }
1560
1561 static int read_compacted_summaries(struct f2fs_sb_info *sbi)
1562 {
1563         struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
1564         struct curseg_info *seg_i;
1565         unsigned char *kaddr;
1566         struct page *page;
1567         block_t start;
1568         int i, j, offset;
1569
1570         start = start_sum_block(sbi);
1571
1572         page = get_meta_page(sbi, start++);
1573         kaddr = (unsigned char *)page_address(page);
1574
1575         /* Step 1: restore nat cache */
1576         seg_i = CURSEG_I(sbi, CURSEG_HOT_DATA);
1577         memcpy(seg_i->journal, kaddr, SUM_JOURNAL_SIZE);
1578
1579         /* Step 2: restore sit cache */
1580         seg_i = CURSEG_I(sbi, CURSEG_COLD_DATA);
1581         memcpy(seg_i->journal, kaddr + SUM_JOURNAL_SIZE, SUM_JOURNAL_SIZE);
1582         offset = 2 * SUM_JOURNAL_SIZE;
1583
1584         /* Step 3: restore summary entries */
1585         for (i = CURSEG_HOT_DATA; i <= CURSEG_COLD_DATA; i++) {
1586                 unsigned short blk_off;
1587                 unsigned int segno;
1588
1589                 seg_i = CURSEG_I(sbi, i);
1590                 segno = le32_to_cpu(ckpt->cur_data_segno[i]);
1591                 blk_off = le16_to_cpu(ckpt->cur_data_blkoff[i]);
1592                 seg_i->next_segno = segno;
1593                 reset_curseg(sbi, i, 0);
1594                 seg_i->alloc_type = ckpt->alloc_type[i];
1595                 seg_i->next_blkoff = blk_off;
1596
1597                 if (seg_i->alloc_type == SSR)
1598                         blk_off = sbi->blocks_per_seg;
1599
1600                 for (j = 0; j < blk_off; j++) {
1601                         struct f2fs_summary *s;
1602                         s = (struct f2fs_summary *)(kaddr + offset);
1603                         seg_i->sum_blk->entries[j] = *s;
1604                         offset += SUMMARY_SIZE;
1605                         if (offset + SUMMARY_SIZE <= PAGE_SIZE -
1606                                                 SUM_FOOTER_SIZE)
1607                                 continue;
1608
1609                         f2fs_put_page(page, 1);
1610                         page = NULL;
1611
1612                         page = get_meta_page(sbi, start++);
1613                         kaddr = (unsigned char *)page_address(page);
1614                         offset = 0;
1615                 }
1616         }
1617         f2fs_put_page(page, 1);
1618         return 0;
1619 }
1620
1621 static int read_normal_summaries(struct f2fs_sb_info *sbi, int type)
1622 {
1623         struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
1624         struct f2fs_summary_block *sum;
1625         struct curseg_info *curseg;
1626         struct page *new;
1627         unsigned short blk_off;
1628         unsigned int segno = 0;
1629         block_t blk_addr = 0;
1630
1631         /* get segment number and block addr */
1632         if (IS_DATASEG(type)) {
1633                 segno = le32_to_cpu(ckpt->cur_data_segno[type]);
1634                 blk_off = le16_to_cpu(ckpt->cur_data_blkoff[type -
1635                                                         CURSEG_HOT_DATA]);
1636                 if (__exist_node_summaries(sbi))
1637                         blk_addr = sum_blk_addr(sbi, NR_CURSEG_TYPE, type);
1638                 else
1639                         blk_addr = sum_blk_addr(sbi, NR_CURSEG_DATA_TYPE, type);
1640         } else {
1641                 segno = le32_to_cpu(ckpt->cur_node_segno[type -
1642                                                         CURSEG_HOT_NODE]);
1643                 blk_off = le16_to_cpu(ckpt->cur_node_blkoff[type -
1644                                                         CURSEG_HOT_NODE]);
1645                 if (__exist_node_summaries(sbi))
1646                         blk_addr = sum_blk_addr(sbi, NR_CURSEG_NODE_TYPE,
1647                                                         type - CURSEG_HOT_NODE);
1648                 else
1649                         blk_addr = GET_SUM_BLOCK(sbi, segno);
1650         }
1651
1652         new = get_meta_page(sbi, blk_addr);
1653         sum = (struct f2fs_summary_block *)page_address(new);
1654
1655         if (IS_NODESEG(type)) {
1656                 if (__exist_node_summaries(sbi)) {
1657                         struct f2fs_summary *ns = &sum->entries[0];
1658                         int i;
1659                         for (i = 0; i < sbi->blocks_per_seg; i++, ns++) {
1660                                 ns->version = 0;
1661                                 ns->ofs_in_node = 0;
1662                         }
1663                 } else {
1664                         int err;
1665
1666                         err = restore_node_summary(sbi, segno, sum);
1667                         if (err) {
1668                                 f2fs_put_page(new, 1);
1669                                 return err;
1670                         }
1671                 }
1672         }
1673
1674         /* set uncompleted segment to curseg */
1675         curseg = CURSEG_I(sbi, type);
1676         mutex_lock(&curseg->curseg_mutex);
1677
1678         /* update journal info */
1679         down_write(&curseg->journal_rwsem);
1680         memcpy(curseg->journal, &sum->journal, SUM_JOURNAL_SIZE);
1681         up_write(&curseg->journal_rwsem);
1682
1683         memcpy(curseg->sum_blk->entries, sum->entries, SUM_ENTRY_SIZE);
1684         memcpy(&curseg->sum_blk->footer, &sum->footer, SUM_FOOTER_SIZE);
1685         curseg->next_segno = segno;
1686         reset_curseg(sbi, type, 0);
1687         curseg->alloc_type = ckpt->alloc_type[type];
1688         curseg->next_blkoff = blk_off;
1689         mutex_unlock(&curseg->curseg_mutex);
1690         f2fs_put_page(new, 1);
1691         return 0;
1692 }
1693
1694 static int restore_curseg_summaries(struct f2fs_sb_info *sbi)
1695 {
1696         int type = CURSEG_HOT_DATA;
1697         int err;
1698
1699         if (is_set_ckpt_flags(F2FS_CKPT(sbi), CP_COMPACT_SUM_FLAG)) {
1700                 int npages = npages_for_summary_flush(sbi, true);
1701
1702                 if (npages >= 2)
1703                         ra_meta_pages(sbi, start_sum_block(sbi), npages,
1704                                                         META_CP, true);
1705
1706                 /* restore for compacted data summary */
1707                 if (read_compacted_summaries(sbi))
1708                         return -EINVAL;
1709                 type = CURSEG_HOT_NODE;
1710         }
1711
1712         if (__exist_node_summaries(sbi))
1713                 ra_meta_pages(sbi, sum_blk_addr(sbi, NR_CURSEG_TYPE, type),
1714                                         NR_CURSEG_TYPE - type, META_CP, true);
1715
1716         for (; type <= CURSEG_COLD_NODE; type++) {
1717                 err = read_normal_summaries(sbi, type);
1718                 if (err)
1719                         return err;
1720         }
1721
1722         return 0;
1723 }
1724
1725 static void write_compacted_summaries(struct f2fs_sb_info *sbi, block_t blkaddr)
1726 {
1727         struct page *page;
1728         unsigned char *kaddr;
1729         struct f2fs_summary *summary;
1730         struct curseg_info *seg_i;
1731         int written_size = 0;
1732         int i, j;
1733
1734         page = grab_meta_page(sbi, blkaddr++);
1735         kaddr = (unsigned char *)page_address(page);
1736
1737         /* Step 1: write nat cache */
1738         seg_i = CURSEG_I(sbi, CURSEG_HOT_DATA);
1739         memcpy(kaddr, seg_i->journal, SUM_JOURNAL_SIZE);
1740         written_size += SUM_JOURNAL_SIZE;
1741
1742         /* Step 2: write sit cache */
1743         seg_i = CURSEG_I(sbi, CURSEG_COLD_DATA);
1744         memcpy(kaddr + written_size, seg_i->journal, SUM_JOURNAL_SIZE);
1745         written_size += SUM_JOURNAL_SIZE;
1746
1747         /* Step 3: write summary entries */
1748         for (i = CURSEG_HOT_DATA; i <= CURSEG_COLD_DATA; i++) {
1749                 unsigned short blkoff;
1750                 seg_i = CURSEG_I(sbi, i);
1751                 if (sbi->ckpt->alloc_type[i] == SSR)
1752                         blkoff = sbi->blocks_per_seg;
1753                 else
1754                         blkoff = curseg_blkoff(sbi, i);
1755
1756                 for (j = 0; j < blkoff; j++) {
1757                         if (!page) {
1758                                 page = grab_meta_page(sbi, blkaddr++);
1759                                 kaddr = (unsigned char *)page_address(page);
1760                                 written_size = 0;
1761                         }
1762                         summary = (struct f2fs_summary *)(kaddr + written_size);
1763                         *summary = seg_i->sum_blk->entries[j];
1764                         written_size += SUMMARY_SIZE;
1765
1766                         if (written_size + SUMMARY_SIZE <= PAGE_SIZE -
1767                                                         SUM_FOOTER_SIZE)
1768                                 continue;
1769
1770                         set_page_dirty(page);
1771                         f2fs_put_page(page, 1);
1772                         page = NULL;
1773                 }
1774         }
1775         if (page) {
1776                 set_page_dirty(page);
1777                 f2fs_put_page(page, 1);
1778         }
1779 }
1780
1781 static void write_normal_summaries(struct f2fs_sb_info *sbi,
1782                                         block_t blkaddr, int type)
1783 {
1784         int i, end;
1785         if (IS_DATASEG(type))
1786                 end = type + NR_CURSEG_DATA_TYPE;
1787         else
1788                 end = type + NR_CURSEG_NODE_TYPE;
1789
1790         for (i = type; i < end; i++)
1791                 write_current_sum_page(sbi, i, blkaddr + (i - type));
1792 }
1793
1794 void write_data_summaries(struct f2fs_sb_info *sbi, block_t start_blk)
1795 {
1796         if (is_set_ckpt_flags(F2FS_CKPT(sbi), CP_COMPACT_SUM_FLAG))
1797                 write_compacted_summaries(sbi, start_blk);
1798         else
1799                 write_normal_summaries(sbi, start_blk, CURSEG_HOT_DATA);
1800 }
1801
1802 void write_node_summaries(struct f2fs_sb_info *sbi, block_t start_blk)
1803 {
1804         write_normal_summaries(sbi, start_blk, CURSEG_HOT_NODE);
1805 }
1806
1807 int lookup_journal_in_cursum(struct f2fs_journal *journal, int type,
1808                                         unsigned int val, int alloc)
1809 {
1810         int i;
1811
1812         if (type == NAT_JOURNAL) {
1813                 for (i = 0; i < nats_in_cursum(journal); i++) {
1814                         if (le32_to_cpu(nid_in_journal(journal, i)) == val)
1815                                 return i;
1816                 }
1817                 if (alloc && __has_cursum_space(journal, 1, NAT_JOURNAL))
1818                         return update_nats_in_cursum(journal, 1);
1819         } else if (type == SIT_JOURNAL) {
1820                 for (i = 0; i < sits_in_cursum(journal); i++)
1821                         if (le32_to_cpu(segno_in_journal(journal, i)) == val)
1822                                 return i;
1823                 if (alloc && __has_cursum_space(journal, 1, SIT_JOURNAL))
1824                         return update_sits_in_cursum(journal, 1);
1825         }
1826         return -1;
1827 }
1828
1829 static struct page *get_current_sit_page(struct f2fs_sb_info *sbi,
1830                                         unsigned int segno)
1831 {
1832         return get_meta_page(sbi, current_sit_addr(sbi, segno));
1833 }
1834
1835 static struct page *get_next_sit_page(struct f2fs_sb_info *sbi,
1836                                         unsigned int start)
1837 {
1838         struct sit_info *sit_i = SIT_I(sbi);
1839         struct page *src_page, *dst_page;
1840         pgoff_t src_off, dst_off;
1841         void *src_addr, *dst_addr;
1842
1843         src_off = current_sit_addr(sbi, start);
1844         dst_off = next_sit_addr(sbi, src_off);
1845
1846         /* get current sit block page without lock */
1847         src_page = get_meta_page(sbi, src_off);
1848         dst_page = grab_meta_page(sbi, dst_off);
1849         f2fs_bug_on(sbi, PageDirty(src_page));
1850
1851         src_addr = page_address(src_page);
1852         dst_addr = page_address(dst_page);
1853         memcpy(dst_addr, src_addr, PAGE_SIZE);
1854
1855         set_page_dirty(dst_page);
1856         f2fs_put_page(src_page, 1);
1857
1858         set_to_next_sit(sit_i, start);
1859
1860         return dst_page;
1861 }
1862
1863 static struct sit_entry_set *grab_sit_entry_set(void)
1864 {
1865         struct sit_entry_set *ses =
1866                         f2fs_kmem_cache_alloc(sit_entry_set_slab, GFP_NOFS);
1867
1868         ses->entry_cnt = 0;
1869         INIT_LIST_HEAD(&ses->set_list);
1870         return ses;
1871 }
1872
1873 static void release_sit_entry_set(struct sit_entry_set *ses)
1874 {
1875         list_del(&ses->set_list);
1876         kmem_cache_free(sit_entry_set_slab, ses);
1877 }
1878
1879 static void adjust_sit_entry_set(struct sit_entry_set *ses,
1880                                                 struct list_head *head)
1881 {
1882         struct sit_entry_set *next = ses;
1883
1884         if (list_is_last(&ses->set_list, head))
1885                 return;
1886
1887         list_for_each_entry_continue(next, head, set_list)
1888                 if (ses->entry_cnt <= next->entry_cnt)
1889                         break;
1890
1891         list_move_tail(&ses->set_list, &next->set_list);
1892 }
1893
1894 static void add_sit_entry(unsigned int segno, struct list_head *head)
1895 {
1896         struct sit_entry_set *ses;
1897         unsigned int start_segno = START_SEGNO(segno);
1898
1899         list_for_each_entry(ses, head, set_list) {
1900                 if (ses->start_segno == start_segno) {
1901                         ses->entry_cnt++;
1902                         adjust_sit_entry_set(ses, head);
1903                         return;
1904                 }
1905         }
1906
1907         ses = grab_sit_entry_set();
1908
1909         ses->start_segno = start_segno;
1910         ses->entry_cnt++;
1911         list_add(&ses->set_list, head);
1912 }
1913
1914 static void add_sits_in_set(struct f2fs_sb_info *sbi)
1915 {
1916         struct f2fs_sm_info *sm_info = SM_I(sbi);
1917         struct list_head *set_list = &sm_info->sit_entry_set;
1918         unsigned long *bitmap = SIT_I(sbi)->dirty_sentries_bitmap;
1919         unsigned int segno;
1920
1921         for_each_set_bit(segno, bitmap, MAIN_SEGS(sbi))
1922                 add_sit_entry(segno, set_list);
1923 }
1924
1925 static void remove_sits_in_journal(struct f2fs_sb_info *sbi)
1926 {
1927         struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_COLD_DATA);
1928         struct f2fs_journal *journal = curseg->journal;
1929         int i;
1930
1931         down_write(&curseg->journal_rwsem);
1932         for (i = 0; i < sits_in_cursum(journal); i++) {
1933                 unsigned int segno;
1934                 bool dirtied;
1935
1936                 segno = le32_to_cpu(segno_in_journal(journal, i));
1937                 dirtied = __mark_sit_entry_dirty(sbi, segno);
1938
1939                 if (!dirtied)
1940                         add_sit_entry(segno, &SM_I(sbi)->sit_entry_set);
1941         }
1942         update_sits_in_cursum(journal, -i);
1943         up_write(&curseg->journal_rwsem);
1944 }
1945
1946 /*
1947  * CP calls this function, which flushes SIT entries including sit_journal,
1948  * and moves prefree segs to free segs.
1949  */
1950 void flush_sit_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc)
1951 {
1952         struct sit_info *sit_i = SIT_I(sbi);
1953         unsigned long *bitmap = sit_i->dirty_sentries_bitmap;
1954         struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_COLD_DATA);
1955         struct f2fs_journal *journal = curseg->journal;
1956         struct sit_entry_set *ses, *tmp;
1957         struct list_head *head = &SM_I(sbi)->sit_entry_set;
1958         bool to_journal = true;
1959         struct seg_entry *se;
1960
1961         mutex_lock(&sit_i->sentry_lock);
1962
1963         if (!sit_i->dirty_sentries)
1964                 goto out;
1965
1966         /*
1967          * add and account sit entries of dirty bitmap in sit entry
1968          * set temporarily
1969          */
1970         add_sits_in_set(sbi);
1971
1972         /*
1973          * if there are no enough space in journal to store dirty sit
1974          * entries, remove all entries from journal and add and account
1975          * them in sit entry set.
1976          */
1977         if (!__has_cursum_space(journal, sit_i->dirty_sentries, SIT_JOURNAL))
1978                 remove_sits_in_journal(sbi);
1979
1980         /*
1981          * there are two steps to flush sit entries:
1982          * #1, flush sit entries to journal in current cold data summary block.
1983          * #2, flush sit entries to sit page.
1984          */
1985         list_for_each_entry_safe(ses, tmp, head, set_list) {
1986                 struct page *page = NULL;
1987                 struct f2fs_sit_block *raw_sit = NULL;
1988                 unsigned int start_segno = ses->start_segno;
1989                 unsigned int end = min(start_segno + SIT_ENTRY_PER_BLOCK,
1990                                                 (unsigned long)MAIN_SEGS(sbi));
1991                 unsigned int segno = start_segno;
1992
1993                 if (to_journal &&
1994                         !__has_cursum_space(journal, ses->entry_cnt, SIT_JOURNAL))
1995                         to_journal = false;
1996
1997                 if (to_journal) {
1998                         down_write(&curseg->journal_rwsem);
1999                 } else {
2000                         page = get_next_sit_page(sbi, start_segno);
2001                         raw_sit = page_address(page);
2002                 }
2003
2004                 /* flush dirty sit entries in region of current sit set */
2005                 for_each_set_bit_from(segno, bitmap, end) {
2006                         int offset, sit_offset;
2007
2008                         se = get_seg_entry(sbi, segno);
2009
2010                         /* add discard candidates */
2011                         if (cpc->reason != CP_DISCARD) {
2012                                 cpc->trim_start = segno;
2013                                 add_discard_addrs(sbi, cpc);
2014                         }
2015
2016                         if (to_journal) {
2017                                 offset = lookup_journal_in_cursum(journal,
2018                                                         SIT_JOURNAL, segno, 1);
2019                                 f2fs_bug_on(sbi, offset < 0);
2020                                 segno_in_journal(journal, offset) =
2021                                                         cpu_to_le32(segno);
2022                                 seg_info_to_raw_sit(se,
2023                                         &sit_in_journal(journal, offset));
2024                         } else {
2025                                 sit_offset = SIT_ENTRY_OFFSET(sit_i, segno);
2026                                 seg_info_to_raw_sit(se,
2027                                                 &raw_sit->entries[sit_offset]);
2028                         }
2029
2030                         __clear_bit(segno, bitmap);
2031                         sit_i->dirty_sentries--;
2032                         ses->entry_cnt--;
2033                 }
2034
2035                 if (to_journal)
2036                         up_write(&curseg->journal_rwsem);
2037                 else
2038                         f2fs_put_page(page, 1);
2039
2040                 f2fs_bug_on(sbi, ses->entry_cnt);
2041                 release_sit_entry_set(ses);
2042         }
2043
2044         f2fs_bug_on(sbi, !list_empty(head));
2045         f2fs_bug_on(sbi, sit_i->dirty_sentries);
2046 out:
2047         if (cpc->reason == CP_DISCARD) {
2048                 for (; cpc->trim_start <= cpc->trim_end; cpc->trim_start++)
2049                         add_discard_addrs(sbi, cpc);
2050         }
2051         mutex_unlock(&sit_i->sentry_lock);
2052
2053         set_prefree_as_free_segments(sbi);
2054 }
2055
2056 static int build_sit_info(struct f2fs_sb_info *sbi)
2057 {
2058         struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
2059         struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
2060         struct sit_info *sit_i;
2061         unsigned int sit_segs, start;
2062         char *src_bitmap, *dst_bitmap;
2063         unsigned int bitmap_size;
2064
2065         /* allocate memory for SIT information */
2066         sit_i = kzalloc(sizeof(struct sit_info), GFP_KERNEL);
2067         if (!sit_i)
2068                 return -ENOMEM;
2069
2070         SM_I(sbi)->sit_info = sit_i;
2071
2072         sit_i->sentries = f2fs_kvzalloc(MAIN_SEGS(sbi) *
2073                                         sizeof(struct seg_entry), GFP_KERNEL);
2074         if (!sit_i->sentries)
2075                 return -ENOMEM;
2076
2077         bitmap_size = f2fs_bitmap_size(MAIN_SEGS(sbi));
2078         sit_i->dirty_sentries_bitmap = f2fs_kvzalloc(bitmap_size, GFP_KERNEL);
2079         if (!sit_i->dirty_sentries_bitmap)
2080                 return -ENOMEM;
2081
2082         for (start = 0; start < MAIN_SEGS(sbi); start++) {
2083                 sit_i->sentries[start].cur_valid_map
2084                         = kzalloc(SIT_VBLOCK_MAP_SIZE, GFP_KERNEL);
2085                 sit_i->sentries[start].ckpt_valid_map
2086                         = kzalloc(SIT_VBLOCK_MAP_SIZE, GFP_KERNEL);
2087                 sit_i->sentries[start].discard_map
2088                         = kzalloc(SIT_VBLOCK_MAP_SIZE, GFP_KERNEL);
2089                 if (!sit_i->sentries[start].cur_valid_map ||
2090                                 !sit_i->sentries[start].ckpt_valid_map ||
2091                                 !sit_i->sentries[start].discard_map)
2092                         return -ENOMEM;
2093         }
2094
2095         sit_i->tmp_map = kzalloc(SIT_VBLOCK_MAP_SIZE, GFP_KERNEL);
2096         if (!sit_i->tmp_map)
2097                 return -ENOMEM;
2098
2099         if (sbi->segs_per_sec > 1) {
2100                 sit_i->sec_entries = f2fs_kvzalloc(MAIN_SECS(sbi) *
2101                                         sizeof(struct sec_entry), GFP_KERNEL);
2102                 if (!sit_i->sec_entries)
2103                         return -ENOMEM;
2104         }
2105
2106         /* get information related with SIT */
2107         sit_segs = le32_to_cpu(raw_super->segment_count_sit) >> 1;
2108
2109         /* setup SIT bitmap from ckeckpoint pack */
2110         bitmap_size = __bitmap_size(sbi, SIT_BITMAP);
2111         src_bitmap = __bitmap_ptr(sbi, SIT_BITMAP);
2112
2113         dst_bitmap = kmemdup(src_bitmap, bitmap_size, GFP_KERNEL);
2114         if (!dst_bitmap)
2115                 return -ENOMEM;
2116
2117         /* init SIT information */
2118         sit_i->s_ops = &default_salloc_ops;
2119
2120         sit_i->sit_base_addr = le32_to_cpu(raw_super->sit_blkaddr);
2121         sit_i->sit_blocks = sit_segs << sbi->log_blocks_per_seg;
2122         sit_i->written_valid_blocks = le64_to_cpu(ckpt->valid_block_count);
2123         sit_i->sit_bitmap = dst_bitmap;
2124         sit_i->bitmap_size = bitmap_size;
2125         sit_i->dirty_sentries = 0;
2126         sit_i->sents_per_block = SIT_ENTRY_PER_BLOCK;
2127         sit_i->elapsed_time = le64_to_cpu(sbi->ckpt->elapsed_time);
2128         sit_i->mounted_time = CURRENT_TIME_SEC.tv_sec;
2129         mutex_init(&sit_i->sentry_lock);
2130         return 0;
2131 }
2132
2133 static int build_free_segmap(struct f2fs_sb_info *sbi)
2134 {
2135         struct free_segmap_info *free_i;
2136         unsigned int bitmap_size, sec_bitmap_size;
2137
2138         /* allocate memory for free segmap information */
2139         free_i = kzalloc(sizeof(struct free_segmap_info), GFP_KERNEL);
2140         if (!free_i)
2141                 return -ENOMEM;
2142
2143         SM_I(sbi)->free_info = free_i;
2144
2145         bitmap_size = f2fs_bitmap_size(MAIN_SEGS(sbi));
2146         free_i->free_segmap = f2fs_kvmalloc(bitmap_size, GFP_KERNEL);
2147         if (!free_i->free_segmap)
2148                 return -ENOMEM;
2149
2150         sec_bitmap_size = f2fs_bitmap_size(MAIN_SECS(sbi));
2151         free_i->free_secmap = f2fs_kvmalloc(sec_bitmap_size, GFP_KERNEL);
2152         if (!free_i->free_secmap)
2153                 return -ENOMEM;
2154
2155         /* set all segments as dirty temporarily */
2156         memset(free_i->free_segmap, 0xff, bitmap_size);
2157         memset(free_i->free_secmap, 0xff, sec_bitmap_size);
2158
2159         /* init free segmap information */
2160         free_i->start_segno = GET_SEGNO_FROM_SEG0(sbi, MAIN_BLKADDR(sbi));
2161         free_i->free_segments = 0;
2162         free_i->free_sections = 0;
2163         spin_lock_init(&free_i->segmap_lock);
2164         return 0;
2165 }
2166
2167 static int build_curseg(struct f2fs_sb_info *sbi)
2168 {
2169         struct curseg_info *array;
2170         int i;
2171
2172         array = kcalloc(NR_CURSEG_TYPE, sizeof(*array), GFP_KERNEL);
2173         if (!array)
2174                 return -ENOMEM;
2175
2176         SM_I(sbi)->curseg_array = array;
2177
2178         for (i = 0; i < NR_CURSEG_TYPE; i++) {
2179                 mutex_init(&array[i].curseg_mutex);
2180                 array[i].sum_blk = kzalloc(PAGE_SIZE, GFP_KERNEL);
2181                 if (!array[i].sum_blk)
2182                         return -ENOMEM;
2183                 init_rwsem(&array[i].journal_rwsem);
2184                 array[i].journal = kzalloc(sizeof(struct f2fs_journal),
2185                                                         GFP_KERNEL);
2186                 if (!array[i].journal)
2187                         return -ENOMEM;
2188                 array[i].segno = NULL_SEGNO;
2189                 array[i].next_blkoff = 0;
2190         }
2191         return restore_curseg_summaries(sbi);
2192 }
2193
2194 static void build_sit_entries(struct f2fs_sb_info *sbi)
2195 {
2196         struct sit_info *sit_i = SIT_I(sbi);
2197         struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_COLD_DATA);
2198         struct f2fs_journal *journal = curseg->journal;
2199         int sit_blk_cnt = SIT_BLK_CNT(sbi);
2200         unsigned int i, start, end;
2201         unsigned int readed, start_blk = 0;
2202         int nrpages = MAX_BIO_BLOCKS(sbi) * 8;
2203
2204         do {
2205                 readed = ra_meta_pages(sbi, start_blk, nrpages, META_SIT, true);
2206
2207                 start = start_blk * sit_i->sents_per_block;
2208                 end = (start_blk + readed) * sit_i->sents_per_block;
2209
2210                 for (; start < end && start < MAIN_SEGS(sbi); start++) {
2211                         struct seg_entry *se = &sit_i->sentries[start];
2212                         struct f2fs_sit_block *sit_blk;
2213                         struct f2fs_sit_entry sit;
2214                         struct page *page;
2215
2216                         down_read(&curseg->journal_rwsem);
2217                         for (i = 0; i < sits_in_cursum(journal); i++) {
2218                                 if (le32_to_cpu(segno_in_journal(journal, i))
2219                                                                 == start) {
2220                                         sit = sit_in_journal(journal, i);
2221                                         up_read(&curseg->journal_rwsem);
2222                                         goto got_it;
2223                                 }
2224                         }
2225                         up_read(&curseg->journal_rwsem);
2226
2227                         page = get_current_sit_page(sbi, start);
2228                         sit_blk = (struct f2fs_sit_block *)page_address(page);
2229                         sit = sit_blk->entries[SIT_ENTRY_OFFSET(sit_i, start)];
2230                         f2fs_put_page(page, 1);
2231 got_it:
2232                         check_block_count(sbi, start, &sit);
2233                         seg_info_from_raw_sit(se, &sit);
2234
2235                         /* build discard map only one time */
2236                         memcpy(se->discard_map, se->cur_valid_map, SIT_VBLOCK_MAP_SIZE);
2237                         sbi->discard_blks += sbi->blocks_per_seg - se->valid_blocks;
2238
2239                         if (sbi->segs_per_sec > 1) {
2240                                 struct sec_entry *e = get_sec_entry(sbi, start);
2241                                 e->valid_blocks += se->valid_blocks;
2242                         }
2243                 }
2244                 start_blk += readed;
2245         } while (start_blk < sit_blk_cnt);
2246 }
2247
2248 static void init_free_segmap(struct f2fs_sb_info *sbi)
2249 {
2250         unsigned int start;
2251         int type;
2252
2253         for (start = 0; start < MAIN_SEGS(sbi); start++) {
2254                 struct seg_entry *sentry = get_seg_entry(sbi, start);
2255                 if (!sentry->valid_blocks)
2256                         __set_free(sbi, start);
2257         }
2258
2259         /* set use the current segments */
2260         for (type = CURSEG_HOT_DATA; type <= CURSEG_COLD_NODE; type++) {
2261                 struct curseg_info *curseg_t = CURSEG_I(sbi, type);
2262                 __set_test_and_inuse(sbi, curseg_t->segno);
2263         }
2264 }
2265
2266 static void init_dirty_segmap(struct f2fs_sb_info *sbi)
2267 {
2268         struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
2269         struct free_segmap_info *free_i = FREE_I(sbi);
2270         unsigned int segno = 0, offset = 0;
2271         unsigned short valid_blocks;
2272
2273         while (1) {
2274                 /* find dirty segment based on free segmap */
2275                 segno = find_next_inuse(free_i, MAIN_SEGS(sbi), offset);
2276                 if (segno >= MAIN_SEGS(sbi))
2277                         break;
2278                 offset = segno + 1;
2279                 valid_blocks = get_valid_blocks(sbi, segno, 0);
2280                 if (valid_blocks == sbi->blocks_per_seg || !valid_blocks)
2281                         continue;
2282                 if (valid_blocks > sbi->blocks_per_seg) {
2283                         f2fs_bug_on(sbi, 1);
2284                         continue;
2285                 }
2286                 mutex_lock(&dirty_i->seglist_lock);
2287                 __locate_dirty_segment(sbi, segno, DIRTY);
2288                 mutex_unlock(&dirty_i->seglist_lock);
2289         }
2290 }
2291
2292 static int init_victim_secmap(struct f2fs_sb_info *sbi)
2293 {
2294         struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
2295         unsigned int bitmap_size = f2fs_bitmap_size(MAIN_SECS(sbi));
2296
2297         dirty_i->victim_secmap = f2fs_kvzalloc(bitmap_size, GFP_KERNEL);
2298         if (!dirty_i->victim_secmap)
2299                 return -ENOMEM;
2300         return 0;
2301 }
2302
2303 static int build_dirty_segmap(struct f2fs_sb_info *sbi)
2304 {
2305         struct dirty_seglist_info *dirty_i;
2306         unsigned int bitmap_size, i;
2307
2308         /* allocate memory for dirty segments list information */
2309         dirty_i = kzalloc(sizeof(struct dirty_seglist_info), GFP_KERNEL);
2310         if (!dirty_i)
2311                 return -ENOMEM;
2312
2313         SM_I(sbi)->dirty_info = dirty_i;
2314         mutex_init(&dirty_i->seglist_lock);
2315
2316         bitmap_size = f2fs_bitmap_size(MAIN_SEGS(sbi));
2317
2318         for (i = 0; i < NR_DIRTY_TYPE; i++) {
2319                 dirty_i->dirty_segmap[i] = f2fs_kvzalloc(bitmap_size, GFP_KERNEL);
2320                 if (!dirty_i->dirty_segmap[i])
2321                         return -ENOMEM;
2322         }
2323
2324         init_dirty_segmap(sbi);
2325         return init_victim_secmap(sbi);
2326 }
2327
2328 /*
2329  * Update min, max modified time for cost-benefit GC algorithm
2330  */
2331 static void init_min_max_mtime(struct f2fs_sb_info *sbi)
2332 {
2333         struct sit_info *sit_i = SIT_I(sbi);
2334         unsigned int segno;
2335
2336         mutex_lock(&sit_i->sentry_lock);
2337
2338         sit_i->min_mtime = LLONG_MAX;
2339
2340         for (segno = 0; segno < MAIN_SEGS(sbi); segno += sbi->segs_per_sec) {
2341                 unsigned int i;
2342                 unsigned long long mtime = 0;
2343
2344                 for (i = 0; i < sbi->segs_per_sec; i++)
2345                         mtime += get_seg_entry(sbi, segno + i)->mtime;
2346
2347                 mtime = div_u64(mtime, sbi->segs_per_sec);
2348
2349                 if (sit_i->min_mtime > mtime)
2350                         sit_i->min_mtime = mtime;
2351         }
2352         sit_i->max_mtime = get_mtime(sbi);
2353         mutex_unlock(&sit_i->sentry_lock);
2354 }
2355
2356 int build_segment_manager(struct f2fs_sb_info *sbi)
2357 {
2358         struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
2359         struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
2360         struct f2fs_sm_info *sm_info;
2361         int err;
2362
2363         sm_info = kzalloc(sizeof(struct f2fs_sm_info), GFP_KERNEL);
2364         if (!sm_info)
2365                 return -ENOMEM;
2366
2367         /* init sm info */
2368         sbi->sm_info = sm_info;
2369         sm_info->seg0_blkaddr = le32_to_cpu(raw_super->segment0_blkaddr);
2370         sm_info->main_blkaddr = le32_to_cpu(raw_super->main_blkaddr);
2371         sm_info->segment_count = le32_to_cpu(raw_super->segment_count);
2372         sm_info->reserved_segments = le32_to_cpu(ckpt->rsvd_segment_count);
2373         sm_info->ovp_segments = le32_to_cpu(ckpt->overprov_segment_count);
2374         sm_info->main_segments = le32_to_cpu(raw_super->segment_count_main);
2375         sm_info->ssa_blkaddr = le32_to_cpu(raw_super->ssa_blkaddr);
2376         sm_info->rec_prefree_segments = sm_info->main_segments *
2377                                         DEF_RECLAIM_PREFREE_SEGMENTS / 100;
2378         sm_info->ipu_policy = 1 << F2FS_IPU_FSYNC;
2379         sm_info->min_ipu_util = DEF_MIN_IPU_UTIL;
2380         sm_info->min_fsync_blocks = DEF_MIN_FSYNC_BLOCKS;
2381
2382         INIT_LIST_HEAD(&sm_info->discard_list);
2383         sm_info->nr_discards = 0;
2384         sm_info->max_discards = 0;
2385
2386         sm_info->trim_sections = DEF_BATCHED_TRIM_SECTIONS;
2387
2388         INIT_LIST_HEAD(&sm_info->sit_entry_set);
2389
2390         if (test_opt(sbi, FLUSH_MERGE) && !f2fs_readonly(sbi->sb)) {
2391                 err = create_flush_cmd_control(sbi);
2392                 if (err)
2393                         return err;
2394         }
2395
2396         err = build_sit_info(sbi);
2397         if (err)
2398                 return err;
2399         err = build_free_segmap(sbi);
2400         if (err)
2401                 return err;
2402         err = build_curseg(sbi);
2403         if (err)
2404                 return err;
2405
2406         /* reinit free segmap based on SIT */
2407         build_sit_entries(sbi);
2408
2409         init_free_segmap(sbi);
2410         err = build_dirty_segmap(sbi);
2411         if (err)
2412                 return err;
2413
2414         init_min_max_mtime(sbi);
2415         return 0;
2416 }
2417
2418 static void discard_dirty_segmap(struct f2fs_sb_info *sbi,
2419                 enum dirty_type dirty_type)
2420 {
2421         struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
2422
2423         mutex_lock(&dirty_i->seglist_lock);
2424         kvfree(dirty_i->dirty_segmap[dirty_type]);
2425         dirty_i->nr_dirty[dirty_type] = 0;
2426         mutex_unlock(&dirty_i->seglist_lock);
2427 }
2428
2429 static void destroy_victim_secmap(struct f2fs_sb_info *sbi)
2430 {
2431         struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
2432         kvfree(dirty_i->victim_secmap);
2433 }
2434
2435 static void destroy_dirty_segmap(struct f2fs_sb_info *sbi)
2436 {
2437         struct dirty_seglist_info *dirty_i = DIRTY_I(sbi);
2438         int i;
2439
2440         if (!dirty_i)
2441                 return;
2442
2443         /* discard pre-free/dirty segments list */
2444         for (i = 0; i < NR_DIRTY_TYPE; i++)
2445                 discard_dirty_segmap(sbi, i);
2446
2447         destroy_victim_secmap(sbi);
2448         SM_I(sbi)->dirty_info = NULL;
2449         kfree(dirty_i);
2450 }
2451
2452 static void destroy_curseg(struct f2fs_sb_info *sbi)
2453 {
2454         struct curseg_info *array = SM_I(sbi)->curseg_array;
2455         int i;
2456
2457         if (!array)
2458                 return;
2459         SM_I(sbi)->curseg_array = NULL;
2460         for (i = 0; i < NR_CURSEG_TYPE; i++) {
2461                 kfree(array[i].sum_blk);
2462                 kfree(array[i].journal);
2463         }
2464         kfree(array);
2465 }
2466
2467 static void destroy_free_segmap(struct f2fs_sb_info *sbi)
2468 {
2469         struct free_segmap_info *free_i = SM_I(sbi)->free_info;
2470         if (!free_i)
2471                 return;
2472         SM_I(sbi)->free_info = NULL;
2473         kvfree(free_i->free_segmap);
2474         kvfree(free_i->free_secmap);
2475         kfree(free_i);
2476 }
2477
2478 static void destroy_sit_info(struct f2fs_sb_info *sbi)
2479 {
2480         struct sit_info *sit_i = SIT_I(sbi);
2481         unsigned int start;
2482
2483         if (!sit_i)
2484                 return;
2485
2486         if (sit_i->sentries) {
2487                 for (start = 0; start < MAIN_SEGS(sbi); start++) {
2488                         kfree(sit_i->sentries[start].cur_valid_map);
2489                         kfree(sit_i->sentries[start].ckpt_valid_map);
2490                         kfree(sit_i->sentries[start].discard_map);
2491                 }
2492         }
2493         kfree(sit_i->tmp_map);
2494
2495         kvfree(sit_i->sentries);
2496         kvfree(sit_i->sec_entries);
2497         kvfree(sit_i->dirty_sentries_bitmap);
2498
2499         SM_I(sbi)->sit_info = NULL;
2500         kfree(sit_i->sit_bitmap);
2501         kfree(sit_i);
2502 }
2503
2504 void destroy_segment_manager(struct f2fs_sb_info *sbi)
2505 {
2506         struct f2fs_sm_info *sm_info = SM_I(sbi);
2507
2508         if (!sm_info)
2509                 return;
2510         destroy_flush_cmd_control(sbi);
2511         destroy_dirty_segmap(sbi);
2512         destroy_curseg(sbi);
2513         destroy_free_segmap(sbi);
2514         destroy_sit_info(sbi);
2515         sbi->sm_info = NULL;
2516         kfree(sm_info);
2517 }
2518
2519 int __init create_segment_manager_caches(void)
2520 {
2521         discard_entry_slab = f2fs_kmem_cache_create("discard_entry",
2522                         sizeof(struct discard_entry));
2523         if (!discard_entry_slab)
2524                 goto fail;
2525
2526         sit_entry_set_slab = f2fs_kmem_cache_create("sit_entry_set",
2527                         sizeof(struct sit_entry_set));
2528         if (!sit_entry_set_slab)
2529                 goto destory_discard_entry;
2530
2531         inmem_entry_slab = f2fs_kmem_cache_create("inmem_page_entry",
2532                         sizeof(struct inmem_pages));
2533         if (!inmem_entry_slab)
2534                 goto destroy_sit_entry_set;
2535         return 0;
2536
2537 destroy_sit_entry_set:
2538         kmem_cache_destroy(sit_entry_set_slab);
2539 destory_discard_entry:
2540         kmem_cache_destroy(discard_entry_slab);
2541 fail:
2542         return -ENOMEM;
2543 }
2544
2545 void destroy_segment_manager_caches(void)
2546 {
2547         kmem_cache_destroy(sit_entry_set_slab);
2548         kmem_cache_destroy(discard_entry_slab);
2549         kmem_cache_destroy(inmem_entry_slab);
2550 }