gc.c (43f3eae1d3b1de6a4f7e39ef9c363ec6f8b9c8d4) gc.c (4375a33664de17af9032b5f491a49bd256670927)
1/*
2 * fs/f2fs/gc.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

--- 504 unchanged lines hidden (view full) ---

513 source_blkaddr = datablock_addr(node_page, ofs_in_node);
514 f2fs_put_page(node_page, 1);
515
516 if (source_blkaddr != blkaddr)
517 return 0;
518 return 1;
519}
520
1/*
2 * fs/f2fs/gc.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

--- 504 unchanged lines hidden (view full) ---

513 source_blkaddr = datablock_addr(node_page, ofs_in_node);
514 f2fs_put_page(node_page, 1);
515
516 if (source_blkaddr != blkaddr)
517 return 0;
518 return 1;
519}
520
521static void move_encrypted_block(struct inode *inode, block_t bidx)
522{
523 struct f2fs_io_info fio = {
524 .sbi = F2FS_I_SB(inode),
525 .type = DATA,
526 .rw = READ_SYNC,
527 .encrypted_page = NULL,
528 };
529 struct dnode_of_data dn;
530 struct f2fs_summary sum;
531 struct node_info ni;
532 struct page *page;
533 int err;
534
535 /* do not read out */
536 page = grab_cache_page(inode->i_mapping, bidx);
537 if (!page)
538 return;
539
540 set_new_dnode(&dn, inode, NULL, NULL, 0);
541 err = get_dnode_of_data(&dn, bidx, LOOKUP_NODE);
542 if (err)
543 goto out;
544
545 if (unlikely(dn.data_blkaddr == NULL_ADDR))
546 goto put_out;
547
548 get_node_info(fio.sbi, dn.nid, &ni);
549 set_summary(&sum, dn.nid, dn.ofs_in_node, ni.version);
550
551 /* read page */
552 fio.page = page;
553 fio.blk_addr = dn.data_blkaddr;
554
555 fio.encrypted_page = grab_cache_page(META_MAPPING(fio.sbi), fio.blk_addr);
556 if (!fio.encrypted_page)
557 goto put_out;
558
559 f2fs_submit_page_bio(&fio);
560
561 /* allocate block address */
562 f2fs_wait_on_page_writeback(dn.node_page, NODE);
563
564 allocate_data_block(fio.sbi, NULL, fio.blk_addr,
565 &fio.blk_addr, &sum, CURSEG_COLD_DATA);
566 dn.data_blkaddr = fio.blk_addr;
567
568 /* write page */
569 lock_page(fio.encrypted_page);
570 set_page_writeback(fio.encrypted_page);
571 fio.rw = WRITE_SYNC;
572 f2fs_submit_page_mbio(&fio);
573
574 set_data_blkaddr(&dn);
575 f2fs_update_extent_cache(&dn);
576 set_inode_flag(F2FS_I(inode), FI_APPEND_WRITE);
577 if (page->index == 0)
578 set_inode_flag(F2FS_I(inode), FI_FIRST_BLOCK_WRITTEN);
579
580 f2fs_put_page(fio.encrypted_page, 1);
581put_out:
582 f2fs_put_dnode(&dn);
583out:
584 f2fs_put_page(page, 1);
585}
586
521static void move_data_page(struct inode *inode, block_t bidx, int gc_type)
522{
523 struct page *page;
524
525 page = get_lock_data_page(inode, bidx);
526 if (IS_ERR(page))
527 return;
528
529 if (gc_type == BG_GC) {
530 if (PageWriteback(page))
531 goto out;
532 set_page_dirty(page);
533 set_cold_data(page);
534 } else {
535 struct f2fs_io_info fio = {
536 .sbi = F2FS_I_SB(inode),
537 .type = DATA,
538 .rw = WRITE_SYNC,
539 .page = page,
587static void move_data_page(struct inode *inode, block_t bidx, int gc_type)
588{
589 struct page *page;
590
591 page = get_lock_data_page(inode, bidx);
592 if (IS_ERR(page))
593 return;
594
595 if (gc_type == BG_GC) {
596 if (PageWriteback(page))
597 goto out;
598 set_page_dirty(page);
599 set_cold_data(page);
600 } else {
601 struct f2fs_io_info fio = {
602 .sbi = F2FS_I_SB(inode),
603 .type = DATA,
604 .rw = WRITE_SYNC,
605 .page = page,
606 .encrypted_page = NULL,
540 };
541 f2fs_wait_on_page_writeback(page, DATA);
542
543 if (clear_page_dirty_for_io(page))
544 inode_dec_dirty_pages(inode);
545 set_cold_data(page);
546 do_write_data_page(&fio);
547 clear_cold_data(page);

--- 53 unchanged lines hidden (view full) ---

601
602 ofs_in_node = le16_to_cpu(entry->ofs_in_node);
603
604 if (phase == 2) {
605 inode = f2fs_iget(sb, dni.ino);
606 if (IS_ERR(inode) || is_bad_inode(inode))
607 continue;
608
607 };
608 f2fs_wait_on_page_writeback(page, DATA);
609
610 if (clear_page_dirty_for_io(page))
611 inode_dec_dirty_pages(inode);
612 set_cold_data(page);
613 do_write_data_page(&fio);
614 clear_cold_data(page);

--- 53 unchanged lines hidden (view full) ---

668
669 ofs_in_node = le16_to_cpu(entry->ofs_in_node);
670
671 if (phase == 2) {
672 inode = f2fs_iget(sb, dni.ino);
673 if (IS_ERR(inode) || is_bad_inode(inode))
674 continue;
675
676 /* if encrypted inode, let's go phase 3 */
677 if (f2fs_encrypted_inode(inode) &&
678 S_ISREG(inode->i_mode)) {
679 add_gc_inode(gc_list, inode);
680 continue;
681 }
682
609 start_bidx = start_bidx_of_node(nofs, F2FS_I(inode));
610 data_page = get_read_data_page(inode,
611 start_bidx + ofs_in_node, READA);
612 if (IS_ERR(data_page)) {
613 iput(inode);
614 continue;
615 }
616
617 f2fs_put_page(data_page, 0);
618 add_gc_inode(gc_list, inode);
619 continue;
620 }
621
622 /* phase 3 */
623 inode = find_gc_inode(gc_list, dni.ino);
624 if (inode) {
625 start_bidx = start_bidx_of_node(nofs, F2FS_I(inode))
626 + ofs_in_node;
683 start_bidx = start_bidx_of_node(nofs, F2FS_I(inode));
684 data_page = get_read_data_page(inode,
685 start_bidx + ofs_in_node, READA);
686 if (IS_ERR(data_page)) {
687 iput(inode);
688 continue;
689 }
690
691 f2fs_put_page(data_page, 0);
692 add_gc_inode(gc_list, inode);
693 continue;
694 }
695
696 /* phase 3 */
697 inode = find_gc_inode(gc_list, dni.ino);
698 if (inode) {
699 start_bidx = start_bidx_of_node(nofs, F2FS_I(inode))
700 + ofs_in_node;
627 move_data_page(inode, start_bidx, gc_type);
701 if (f2fs_encrypted_inode(inode) && S_ISREG(inode->i_mode))
702 move_encrypted_block(inode, start_bidx);
703 else
704 move_data_page(inode, start_bidx, gc_type);
628 stat_inc_data_blk_count(sbi, 1, gc_type);
629 }
630 }
631
632 if (++phase < 4)
633 goto next_step;
634
635 if (gc_type == FG_GC) {

--- 114 unchanged lines hidden ---
705 stat_inc_data_blk_count(sbi, 1, gc_type);
706 }
707 }
708
709 if (++phase < 4)
710 goto next_step;
711
712 if (gc_type == FG_GC) {

--- 114 unchanged lines hidden ---