checkpoint.c (b2efb3f0a1db62aff5e824125785ec6731143b6d) | checkpoint.c (a7ffdbe22cecaed59b5d76a5f003d68907d64240) |
---|---|
1/* 2 * fs/f2fs/checkpoint.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 --- 137 unchanged lines hidden (view full) --- 146out: 147 f2fs_submit_merged_bio(sbi, META, READ); 148 return blkno - start; 149} 150 151static int f2fs_write_meta_page(struct page *page, 152 struct writeback_control *wbc) 153{ | 1/* 2 * fs/f2fs/checkpoint.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 --- 137 unchanged lines hidden (view full) --- 146out: 147 f2fs_submit_merged_bio(sbi, META, READ); 148 return blkno - start; 149} 150 151static int f2fs_write_meta_page(struct page *page, 152 struct writeback_control *wbc) 153{ |
154 struct inode *inode = page->mapping->host; 155 struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); | 154 struct f2fs_sb_info *sbi = F2FS_P_SB(page); |
156 157 trace_f2fs_writepage(page, META); 158 159 if (unlikely(sbi->por_doing)) 160 goto redirty_out; 161 if (wbc->for_reclaim) 162 goto redirty_out; 163 if (unlikely(f2fs_cp_error(sbi))) --- 8 unchanged lines hidden (view full) --- 172redirty_out: 173 redirty_page_for_writepage(wbc, page); 174 return AOP_WRITEPAGE_ACTIVATE; 175} 176 177static int f2fs_write_meta_pages(struct address_space *mapping, 178 struct writeback_control *wbc) 179{ | 155 156 trace_f2fs_writepage(page, META); 157 158 if (unlikely(sbi->por_doing)) 159 goto redirty_out; 160 if (wbc->for_reclaim) 161 goto redirty_out; 162 if (unlikely(f2fs_cp_error(sbi))) --- 8 unchanged lines hidden (view full) --- 171redirty_out: 172 redirty_page_for_writepage(wbc, page); 173 return AOP_WRITEPAGE_ACTIVATE; 174} 175 176static int f2fs_write_meta_pages(struct address_space *mapping, 177 struct writeback_control *wbc) 178{ |
180 struct f2fs_sb_info *sbi = F2FS_SB(mapping->host->i_sb); | 179 struct f2fs_sb_info *sbi = F2FS_M_SB(mapping); |
181 long diff, written; 182 183 trace_f2fs_writepages(mapping->host, wbc, META); 184 185 /* collect a number of dirty meta pages and write together */ 186 if (wbc->for_kupdate || 187 get_pages(sbi, F2FS_DIRTY_META) < nr_pages_to_skip(sbi, META)) 188 goto skip_write; --- 65 unchanged lines hidden (view full) --- 254 if (nwritten) 255 f2fs_submit_merged_bio(sbi, type, WRITE); 256 257 return nwritten; 258} 259 260static int f2fs_set_meta_page_dirty(struct page *page) 261{ | 180 long diff, written; 181 182 trace_f2fs_writepages(mapping->host, wbc, META); 183 184 /* collect a number of dirty meta pages and write together */ 185 if (wbc->for_kupdate || 186 get_pages(sbi, F2FS_DIRTY_META) < nr_pages_to_skip(sbi, META)) 187 goto skip_write; --- 65 unchanged lines hidden (view full) --- 253 if (nwritten) 254 f2fs_submit_merged_bio(sbi, type, WRITE); 255 256 return nwritten; 257} 258 259static int f2fs_set_meta_page_dirty(struct page *page) 260{ |
262 struct address_space *mapping = page->mapping; 263 struct f2fs_sb_info *sbi = F2FS_SB(mapping->host->i_sb); 264 | |
265 trace_f2fs_set_page_dirty(page, META); 266 267 SetPageUptodate(page); 268 if (!PageDirty(page)) { 269 __set_page_dirty_nobuffers(page); | 261 trace_f2fs_set_page_dirty(page, META); 262 263 SetPageUptodate(page); 264 if (!PageDirty(page)) { 265 __set_page_dirty_nobuffers(page); |
270 inc_page_count(sbi, F2FS_DIRTY_META); | 266 inc_page_count(F2FS_P_SB(page), F2FS_DIRTY_META); |
271 return 1; 272 } 273 return 0; 274} 275 276const struct address_space_operations f2fs_meta_aops = { 277 .writepage = f2fs_write_meta_page, 278 .writepages = f2fs_write_meta_pages, --- 94 unchanged lines hidden (view full) --- 373 spin_unlock(&sbi->ino_lock[ORPHAN_INO]); 374 375 return err; 376} 377 378void release_orphan_inode(struct f2fs_sb_info *sbi) 379{ 380 spin_lock(&sbi->ino_lock[ORPHAN_INO]); | 267 return 1; 268 } 269 return 0; 270} 271 272const struct address_space_operations f2fs_meta_aops = { 273 .writepage = f2fs_write_meta_page, 274 .writepages = f2fs_write_meta_pages, --- 94 unchanged lines hidden (view full) --- 369 spin_unlock(&sbi->ino_lock[ORPHAN_INO]); 370 371 return err; 372} 373 374void release_orphan_inode(struct f2fs_sb_info *sbi) 375{ 376 spin_lock(&sbi->ino_lock[ORPHAN_INO]); |
381 f2fs_bug_on(sbi->n_orphans == 0); | 377 f2fs_bug_on(sbi, sbi->n_orphans == 0); |
382 sbi->n_orphans--; 383 spin_unlock(&sbi->ino_lock[ORPHAN_INO]); 384} 385 386void add_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino) 387{ 388 /* add new orphan ino entry into list */ 389 __add_ino_entry(sbi, ino, ORPHAN_INO); 390} 391 392void remove_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino) 393{ 394 /* remove orphan entry from orphan list */ 395 __remove_ino_entry(sbi, ino, ORPHAN_INO); 396} 397 398static void recover_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino) 399{ 400 struct inode *inode = f2fs_iget(sbi->sb, ino); | 378 sbi->n_orphans--; 379 spin_unlock(&sbi->ino_lock[ORPHAN_INO]); 380} 381 382void add_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino) 383{ 384 /* add new orphan ino entry into list */ 385 __add_ino_entry(sbi, ino, ORPHAN_INO); 386} 387 388void remove_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino) 389{ 390 /* remove orphan entry from orphan list */ 391 __remove_ino_entry(sbi, ino, ORPHAN_INO); 392} 393 394static void recover_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino) 395{ 396 struct inode *inode = f2fs_iget(sbi->sb, ino); |
401 f2fs_bug_on(IS_ERR(inode)); | 397 f2fs_bug_on(sbi, IS_ERR(inode)); |
402 clear_nlink(inode); 403 404 /* truncate all the data during iput */ 405 iput(inode); 406} 407 408void recover_orphan_inodes(struct f2fs_sb_info *sbi) 409{ --- 44 unchanged lines hidden (view full) --- 454 index = 1; 455 spin_lock(&sbi->ino_lock[ORPHAN_INO]); 456 head = &sbi->ino_list[ORPHAN_INO]; 457 458 /* loop for each orphan inode entry and write them in Jornal block */ 459 list_for_each_entry(orphan, head, list) { 460 if (!page) { 461 page = find_get_page(META_MAPPING(sbi), start_blk++); | 398 clear_nlink(inode); 399 400 /* truncate all the data during iput */ 401 iput(inode); 402} 403 404void recover_orphan_inodes(struct f2fs_sb_info *sbi) 405{ --- 44 unchanged lines hidden (view full) --- 450 index = 1; 451 spin_lock(&sbi->ino_lock[ORPHAN_INO]); 452 head = &sbi->ino_list[ORPHAN_INO]; 453 454 /* loop for each orphan inode entry and write them in Jornal block */ 455 list_for_each_entry(orphan, head, list) { 456 if (!page) { 457 page = find_get_page(META_MAPPING(sbi), start_blk++); |
462 f2fs_bug_on(!page); | 458 f2fs_bug_on(sbi, !page); |
463 orphan_blk = 464 (struct f2fs_orphan_block *)page_address(page); 465 memset(orphan_blk, 0, sizeof(*orphan_blk)); 466 f2fs_put_page(page, 0); 467 } 468 469 orphan_blk->ino[nentries++] = cpu_to_le32(orphan->ino); 470 --- 143 unchanged lines hidden (view full) --- 614 615fail_no_cp: 616 kfree(sbi->ckpt); 617 return -EINVAL; 618} 619 620static int __add_dirty_inode(struct inode *inode, struct dir_inode_entry *new) 621{ | 459 orphan_blk = 460 (struct f2fs_orphan_block *)page_address(page); 461 memset(orphan_blk, 0, sizeof(*orphan_blk)); 462 f2fs_put_page(page, 0); 463 } 464 465 orphan_blk->ino[nentries++] = cpu_to_le32(orphan->ino); 466 --- 143 unchanged lines hidden (view full) --- 610 611fail_no_cp: 612 kfree(sbi->ckpt); 613 return -EINVAL; 614} 615 616static int __add_dirty_inode(struct inode *inode, struct dir_inode_entry *new) 617{ |
622 struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); | 618 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); |
623 624 if (is_inode_flag_set(F2FS_I(inode), FI_DIRTY_DIR)) 625 return -EEXIST; 626 627 set_inode_flag(F2FS_I(inode), FI_DIRTY_DIR); 628 F2FS_I(inode)->dirty_dir = new; 629 list_add_tail(&new->list, &sbi->dir_inode_list); 630 stat_inc_dirty_dir(sbi); 631 return 0; 632} 633 | 619 620 if (is_inode_flag_set(F2FS_I(inode), FI_DIRTY_DIR)) 621 return -EEXIST; 622 623 set_inode_flag(F2FS_I(inode), FI_DIRTY_DIR); 624 F2FS_I(inode)->dirty_dir = new; 625 list_add_tail(&new->list, &sbi->dir_inode_list); 626 stat_inc_dirty_dir(sbi); 627 return 0; 628} 629 |
634void set_dirty_dir_page(struct inode *inode, struct page *page) | 630void update_dirty_page(struct inode *inode, struct page *page) |
635{ | 631{ |
636 struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); | 632 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); |
637 struct dir_inode_entry *new; 638 int ret = 0; 639 | 633 struct dir_inode_entry *new; 634 int ret = 0; 635 |
640 if (!S_ISDIR(inode->i_mode)) | 636 if (!S_ISDIR(inode->i_mode) && !S_ISREG(inode->i_mode)) |
641 return; 642 | 637 return; 638 |
639 if (!S_ISDIR(inode->i_mode)) { 640 inode_inc_dirty_pages(inode); 641 goto out; 642 } 643 |
|
643 new = f2fs_kmem_cache_alloc(inode_entry_slab, GFP_NOFS); 644 new->inode = inode; 645 INIT_LIST_HEAD(&new->list); 646 647 spin_lock(&sbi->dir_inode_lock); 648 ret = __add_dirty_inode(inode, new); | 644 new = f2fs_kmem_cache_alloc(inode_entry_slab, GFP_NOFS); 645 new->inode = inode; 646 INIT_LIST_HEAD(&new->list); 647 648 spin_lock(&sbi->dir_inode_lock); 649 ret = __add_dirty_inode(inode, new); |
649 inode_inc_dirty_dents(inode); 650 SetPagePrivate(page); | 650 inode_inc_dirty_pages(inode); |
651 spin_unlock(&sbi->dir_inode_lock); 652 653 if (ret) 654 kmem_cache_free(inode_entry_slab, new); | 651 spin_unlock(&sbi->dir_inode_lock); 652 653 if (ret) 654 kmem_cache_free(inode_entry_slab, new); |
655out: 656 SetPagePrivate(page); |
|
655} 656 657void add_dirty_dir_inode(struct inode *inode) 658{ | 657} 658 659void add_dirty_dir_inode(struct inode *inode) 660{ |
659 struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); | 661 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); |
660 struct dir_inode_entry *new = 661 f2fs_kmem_cache_alloc(inode_entry_slab, GFP_NOFS); 662 int ret = 0; 663 664 new->inode = inode; 665 INIT_LIST_HEAD(&new->list); 666 667 spin_lock(&sbi->dir_inode_lock); 668 ret = __add_dirty_inode(inode, new); 669 spin_unlock(&sbi->dir_inode_lock); 670 671 if (ret) 672 kmem_cache_free(inode_entry_slab, new); 673} 674 675void remove_dirty_dir_inode(struct inode *inode) 676{ | 662 struct dir_inode_entry *new = 663 f2fs_kmem_cache_alloc(inode_entry_slab, GFP_NOFS); 664 int ret = 0; 665 666 new->inode = inode; 667 INIT_LIST_HEAD(&new->list); 668 669 spin_lock(&sbi->dir_inode_lock); 670 ret = __add_dirty_inode(inode, new); 671 spin_unlock(&sbi->dir_inode_lock); 672 673 if (ret) 674 kmem_cache_free(inode_entry_slab, new); 675} 676 677void remove_dirty_dir_inode(struct inode *inode) 678{ |
677 struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); | 679 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); |
678 struct dir_inode_entry *entry; 679 680 if (!S_ISDIR(inode->i_mode)) 681 return; 682 683 spin_lock(&sbi->dir_inode_lock); | 680 struct dir_inode_entry *entry; 681 682 if (!S_ISDIR(inode->i_mode)) 683 return; 684 685 spin_lock(&sbi->dir_inode_lock); |
684 if (get_dirty_dents(inode) || | 686 if (get_dirty_pages(inode) || |
685 !is_inode_flag_set(F2FS_I(inode), FI_DIRTY_DIR)) { 686 spin_unlock(&sbi->dir_inode_lock); 687 return; 688 } 689 690 entry = F2FS_I(inode)->dirty_dir; 691 list_del(&entry->list); 692 F2FS_I(inode)->dirty_dir = NULL; --- 188 unchanged lines hidden (view full) --- 881 orphan_blocks); 882 } 883 884 if (sbi->n_orphans) 885 set_ckpt_flags(ckpt, CP_ORPHAN_PRESENT_FLAG); 886 else 887 clear_ckpt_flags(ckpt, CP_ORPHAN_PRESENT_FLAG); 888 | 687 !is_inode_flag_set(F2FS_I(inode), FI_DIRTY_DIR)) { 688 spin_unlock(&sbi->dir_inode_lock); 689 return; 690 } 691 692 entry = F2FS_I(inode)->dirty_dir; 693 list_del(&entry->list); 694 F2FS_I(inode)->dirty_dir = NULL; --- 188 unchanged lines hidden (view full) --- 883 orphan_blocks); 884 } 885 886 if (sbi->n_orphans) 887 set_ckpt_flags(ckpt, CP_ORPHAN_PRESENT_FLAG); 888 else 889 clear_ckpt_flags(ckpt, CP_ORPHAN_PRESENT_FLAG); 890 |
891 if (sbi->need_fsck) 892 set_ckpt_flags(ckpt, CP_FSCK_FLAG); 893 |
|
889 /* update SIT/NAT bitmap */ 890 get_sit_bitmap(sbi, __bitmap_ptr(sbi, SIT_BITMAP)); 891 get_nat_bitmap(sbi, __bitmap_ptr(sbi, NAT_BITMAP)); 892 893 crc32 = f2fs_crc32(ckpt, le32_to_cpu(ckpt->checksum_offset)); 894 *((__le32 *)((unsigned char *)ckpt + 895 le32_to_cpu(ckpt->checksum_offset))) 896 = cpu_to_le32(crc32); --- 151 unchanged lines hidden --- | 894 /* update SIT/NAT bitmap */ 895 get_sit_bitmap(sbi, __bitmap_ptr(sbi, SIT_BITMAP)); 896 get_nat_bitmap(sbi, __bitmap_ptr(sbi, NAT_BITMAP)); 897 898 crc32 = f2fs_crc32(ckpt, le32_to_cpu(ckpt->checksum_offset)); 899 *((__le32 *)((unsigned char *)ckpt + 900 le32_to_cpu(ckpt->checksum_offset))) 901 = cpu_to_le32(crc32); --- 151 unchanged lines hidden --- |