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 --- |