node.c (c9f289701540baeef9ac7c9977d67a7259f404db) node.c (f40f31cadc0ea5dcdd224c8b324add26469c2379)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * fs/f2fs/node.c
4 *
5 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
6 * http://www.samsung.com/
7 */
8#include <linux/fs.h>

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

505 spin_lock(&nm_i->nat_list_lock);
506 }
507 spin_unlock(&nm_i->nat_list_lock);
508
509 up_write(&nm_i->nat_tree_lock);
510 return nr - nr_shrink;
511}
512
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * fs/f2fs/node.c
4 *
5 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
6 * http://www.samsung.com/
7 */
8#include <linux/fs.h>

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

505 spin_lock(&nm_i->nat_list_lock);
506 }
507 spin_unlock(&nm_i->nat_list_lock);
508
509 up_write(&nm_i->nat_tree_lock);
510 return nr - nr_shrink;
511}
512
513/*
514 * This function always returns success
515 */
516int f2fs_get_node_info(struct f2fs_sb_info *sbi, nid_t nid,
517 struct node_info *ni)
518{
519 struct f2fs_nm_info *nm_i = NM_I(sbi);
520 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
521 struct f2fs_journal *journal = curseg->journal;
522 nid_t start_nid = START_NID(nid);
523 struct f2fs_nat_block *nat_blk;

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

711 }
712got:
713 return level;
714}
715
716/*
717 * Caller should call f2fs_put_dnode(dn).
718 * Also, it should grab and release a rwsem by calling f2fs_lock_op() and
513int f2fs_get_node_info(struct f2fs_sb_info *sbi, nid_t nid,
514 struct node_info *ni)
515{
516 struct f2fs_nm_info *nm_i = NM_I(sbi);
517 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
518 struct f2fs_journal *journal = curseg->journal;
519 nid_t start_nid = START_NID(nid);
520 struct f2fs_nat_block *nat_blk;

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

708 }
709got:
710 return level;
711}
712
713/*
714 * Caller should call f2fs_put_dnode(dn).
715 * Also, it should grab and release a rwsem by calling f2fs_lock_op() and
719 * f2fs_unlock_op() only if ro is not set RDONLY_NODE.
720 * In the case of RDONLY_NODE, we don't need to care about mutex.
716 * f2fs_unlock_op() only if mode is set with ALLOC_NODE.
721 */
722int f2fs_get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int mode)
723{
724 struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
725 struct page *npage[4];
726 struct page *parent = NULL;
727 int offset[4];
728 unsigned int noffset[4];

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

804 if (i < level) {
805 parent = npage[i];
806 nids[i + 1] = get_nid(parent, offset[i], false);
807 }
808 }
809 dn->nid = nids[level];
810 dn->ofs_in_node = offset[level];
811 dn->node_page = npage[level];
717 */
718int f2fs_get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int mode)
719{
720 struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode);
721 struct page *npage[4];
722 struct page *parent = NULL;
723 int offset[4];
724 unsigned int noffset[4];

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

800 if (i < level) {
801 parent = npage[i];
802 nids[i + 1] = get_nid(parent, offset[i], false);
803 }
804 }
805 dn->nid = nids[level];
806 dn->ofs_in_node = offset[level];
807 dn->node_page = npage[level];
812 dn->data_blkaddr = datablock_addr(dn->inode,
813 dn->node_page, dn->ofs_in_node);
808 dn->data_blkaddr = f2fs_data_blkaddr(dn);
814 return 0;
815
816release_pages:
817 f2fs_put_page(parent, 1);
818 if (i > 1)
819 f2fs_put_page(npage[0], 0);
820release_out:
821 dn->inode_page = NULL;

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

1183
1184 /* 0 is possible, after f2fs_new_inode() has failed */
1185 if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) {
1186 f2fs_put_dnode(&dn);
1187 return -EIO;
1188 }
1189
1190 if (unlikely(inode->i_blocks != 0 && inode->i_blocks != 8)) {
809 return 0;
810
811release_pages:
812 f2fs_put_page(parent, 1);
813 if (i > 1)
814 f2fs_put_page(npage[0], 0);
815release_out:
816 dn->inode_page = NULL;

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

1178
1179 /* 0 is possible, after f2fs_new_inode() has failed */
1180 if (unlikely(f2fs_cp_error(F2FS_I_SB(inode)))) {
1181 f2fs_put_dnode(&dn);
1182 return -EIO;
1183 }
1184
1185 if (unlikely(inode->i_blocks != 0 && inode->i_blocks != 8)) {
1191 f2fs_warn(F2FS_I_SB(inode), "Inconsistent i_blocks, ino:%lu, iblocks:%llu",
1192 inode->i_ino, (unsigned long long)inode->i_blocks);
1186 f2fs_warn(F2FS_I_SB(inode),
1187 "f2fs_remove_inode_page: inconsistent i_blocks, ino:%lu, iblocks:%llu",
1188 inode->i_ino, (unsigned long long)inode->i_blocks);
1193 set_sbi_flag(F2FS_I_SB(inode), SBI_NEED_FSCK);
1194 }
1195
1196 /* will put inode & node pages */
1197 err = truncate_node(&dn);
1198 if (err) {
1199 f2fs_put_dnode(&dn);
1200 return err;

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

1557 DATA_GENERIC_ENHANCE)) {
1558 up_read(&sbi->node_write);
1559 goto redirty_out;
1560 }
1561
1562 if (atomic && !test_opt(sbi, NOBARRIER))
1563 fio.op_flags |= REQ_PREFLUSH | REQ_FUA;
1564
1189 set_sbi_flag(F2FS_I_SB(inode), SBI_NEED_FSCK);
1190 }
1191
1192 /* will put inode & node pages */
1193 err = truncate_node(&dn);
1194 if (err) {
1195 f2fs_put_dnode(&dn);
1196 return err;

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

1553 DATA_GENERIC_ENHANCE)) {
1554 up_read(&sbi->node_write);
1555 goto redirty_out;
1556 }
1557
1558 if (atomic && !test_opt(sbi, NOBARRIER))
1559 fio.op_flags |= REQ_PREFLUSH | REQ_FUA;
1560
1565 set_page_writeback(page);
1566 ClearPageError(page);
1567
1561 /* should add to global list before clearing PAGECACHE status */
1568 if (f2fs_in_warm_node_list(sbi, page)) {
1569 seq = f2fs_add_fsync_node_entry(sbi, page);
1570 if (seq_id)
1571 *seq_id = seq;
1572 }
1573
1562 if (f2fs_in_warm_node_list(sbi, page)) {
1563 seq = f2fs_add_fsync_node_entry(sbi, page);
1564 if (seq_id)
1565 *seq_id = seq;
1566 }
1567
1568 set_page_writeback(page);
1569 ClearPageError(page);
1570
1574 fio.old_blkaddr = ni.blk_addr;
1575 f2fs_do_write_node_page(nid, &fio);
1576 set_node_addr(sbi, &ni, fio.new_blkaddr, is_fsync_dnode(page));
1577 dec_page_count(sbi, F2FS_DIRTY_NODES);
1578 up_read(&sbi->node_write);
1579
1580 if (wbc->for_reclaim) {
1581 f2fs_submit_merged_write_cond(sbi, NULL, page, 0, NODE);

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

1974 struct f2fs_sb_info *sbi = F2FS_M_SB(mapping);
1975 struct blk_plug plug;
1976 long diff;
1977
1978 if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
1979 goto skip_write;
1980
1981 /* balancing f2fs's metadata in background */
1571 fio.old_blkaddr = ni.blk_addr;
1572 f2fs_do_write_node_page(nid, &fio);
1573 set_node_addr(sbi, &ni, fio.new_blkaddr, is_fsync_dnode(page));
1574 dec_page_count(sbi, F2FS_DIRTY_NODES);
1575 up_read(&sbi->node_write);
1576
1577 if (wbc->for_reclaim) {
1578 f2fs_submit_merged_write_cond(sbi, NULL, page, 0, NODE);

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

1971 struct f2fs_sb_info *sbi = F2FS_M_SB(mapping);
1972 struct blk_plug plug;
1973 long diff;
1974
1975 if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
1976 goto skip_write;
1977
1978 /* balancing f2fs's metadata in background */
1982 f2fs_balance_fs_bg(sbi);
1979 f2fs_balance_fs_bg(sbi, true);
1983
1984 /* collect a number of dirty node pages and write together */
1985 if (wbc->sync_mode != WB_SYNC_ALL &&
1986 get_pages(sbi, F2FS_DIRTY_NODES) <
1987 nr_pages_to_skip(sbi, NODE))
1988 goto skip_write;
1989
1990 if (wbc->sync_mode == WB_SYNC_ALL)

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

2597 if (err)
2598 return err;
2599
2600 if (unlikely(old_ni.blk_addr != NULL_ADDR))
2601 return -EINVAL;
2602retry:
2603 ipage = f2fs_grab_cache_page(NODE_MAPPING(sbi), ino, false);
2604 if (!ipage) {
1980
1981 /* collect a number of dirty node pages and write together */
1982 if (wbc->sync_mode != WB_SYNC_ALL &&
1983 get_pages(sbi, F2FS_DIRTY_NODES) <
1984 nr_pages_to_skip(sbi, NODE))
1985 goto skip_write;
1986
1987 if (wbc->sync_mode == WB_SYNC_ALL)

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

2594 if (err)
2595 return err;
2596
2597 if (unlikely(old_ni.blk_addr != NULL_ADDR))
2598 return -EINVAL;
2599retry:
2600 ipage = f2fs_grab_cache_page(NODE_MAPPING(sbi), ino, false);
2601 if (!ipage) {
2605 congestion_wait(BLK_RW_ASYNC, HZ/50);
2602 congestion_wait(BLK_RW_ASYNC, DEFAULT_IO_TIMEOUT);
2606 goto retry;
2607 }
2608
2609 /* Should not use this inode from free nid list */
2610 remove_free_nid(sbi, ino);
2611
2612 if (!PageUptodate(ipage))
2613 SetPageUptodate(ipage);

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

3188 kvfree(nm_i->nat_bitmap_mir);
3189#endif
3190 sbi->nm_info = NULL;
3191 kvfree(nm_i);
3192}
3193
3194int __init f2fs_create_node_manager_caches(void)
3195{
2603 goto retry;
2604 }
2605
2606 /* Should not use this inode from free nid list */
2607 remove_free_nid(sbi, ino);
2608
2609 if (!PageUptodate(ipage))
2610 SetPageUptodate(ipage);

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

3185 kvfree(nm_i->nat_bitmap_mir);
3186#endif
3187 sbi->nm_info = NULL;
3188 kvfree(nm_i);
3189}
3190
3191int __init f2fs_create_node_manager_caches(void)
3192{
3196 nat_entry_slab = f2fs_kmem_cache_create("nat_entry",
3193 nat_entry_slab = f2fs_kmem_cache_create("f2fs_nat_entry",
3197 sizeof(struct nat_entry));
3198 if (!nat_entry_slab)
3199 goto fail;
3200
3194 sizeof(struct nat_entry));
3195 if (!nat_entry_slab)
3196 goto fail;
3197
3201 free_nid_slab = f2fs_kmem_cache_create("free_nid",
3198 free_nid_slab = f2fs_kmem_cache_create("f2fs_free_nid",
3202 sizeof(struct free_nid));
3203 if (!free_nid_slab)
3204 goto destroy_nat_entry;
3205
3199 sizeof(struct free_nid));
3200 if (!free_nid_slab)
3201 goto destroy_nat_entry;
3202
3206 nat_entry_set_slab = f2fs_kmem_cache_create("nat_entry_set",
3203 nat_entry_set_slab = f2fs_kmem_cache_create("f2fs_nat_entry_set",
3207 sizeof(struct nat_entry_set));
3208 if (!nat_entry_set_slab)
3209 goto destroy_free_nid;
3210
3204 sizeof(struct nat_entry_set));
3205 if (!nat_entry_set_slab)
3206 goto destroy_free_nid;
3207
3211 fsync_node_entry_slab = f2fs_kmem_cache_create("fsync_node_entry",
3208 fsync_node_entry_slab = f2fs_kmem_cache_create("f2fs_fsync_node_entry",
3212 sizeof(struct fsync_node_entry));
3213 if (!fsync_node_entry_slab)
3214 goto destroy_nat_entry_set;
3215 return 0;
3216
3217destroy_nat_entry_set:
3218 kmem_cache_destroy(nat_entry_set_slab);
3219destroy_free_nid:

--- 14 unchanged lines hidden ---
3209 sizeof(struct fsync_node_entry));
3210 if (!fsync_node_entry_slab)
3211 goto destroy_nat_entry_set;
3212 return 0;
3213
3214destroy_nat_entry_set:
3215 kmem_cache_destroy(nat_entry_set_slab);
3216destroy_free_nid:

--- 14 unchanged lines hidden ---