node.c (521187439abfb3e1c946796dc2187c443e5457ab) | node.c (94c821fb286b545d37549ff30a0c341e066f0d6c) |
---|---|
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> --- 2199 unchanged lines hidden (view full) --- 2208 case FREE_NID: 2209 list_add_tail(&i->list, &nm_i->free_nid_list); 2210 break; 2211 default: 2212 BUG_ON(1); 2213 } 2214} 2215 | 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> --- 2199 unchanged lines hidden (view full) --- 2208 case FREE_NID: 2209 list_add_tail(&i->list, &nm_i->free_nid_list); 2210 break; 2211 default: 2212 BUG_ON(1); 2213 } 2214} 2215 |
2216bool f2fs_nat_bitmap_enabled(struct f2fs_sb_info *sbi) 2217{ 2218 struct f2fs_nm_info *nm_i = NM_I(sbi); 2219 unsigned int i; 2220 bool ret = true; 2221 2222 down_read(&nm_i->nat_tree_lock); 2223 for (i = 0; i < nm_i->nat_blocks; i++) { 2224 if (!test_bit_le(i, nm_i->nat_block_bitmap)) { 2225 ret = false; 2226 break; 2227 } 2228 } 2229 up_read(&nm_i->nat_tree_lock); 2230 2231 return ret; 2232} 2233 |
|
2216static void update_free_nid_bitmap(struct f2fs_sb_info *sbi, nid_t nid, 2217 bool set, bool build) 2218{ 2219 struct f2fs_nm_info *nm_i = NM_I(sbi); 2220 unsigned int nat_ofs = NAT_BLOCK_OFFSET(nid); 2221 unsigned int nid_ofs = nid - START_NID(nid); 2222 2223 if (!test_bit_le(nat_ofs, nm_i->nat_block_bitmap)) --- 655 unchanged lines hidden (view full) --- 2879 list_add(&nes->set_list, cur->set_list.prev); 2880 return; 2881 } 2882 } 2883add_out: 2884 list_add_tail(&nes->set_list, head); 2885} 2886 | 2234static void update_free_nid_bitmap(struct f2fs_sb_info *sbi, nid_t nid, 2235 bool set, bool build) 2236{ 2237 struct f2fs_nm_info *nm_i = NM_I(sbi); 2238 unsigned int nat_ofs = NAT_BLOCK_OFFSET(nid); 2239 unsigned int nid_ofs = nid - START_NID(nid); 2240 2241 if (!test_bit_le(nat_ofs, nm_i->nat_block_bitmap)) --- 655 unchanged lines hidden (view full) --- 2897 list_add(&nes->set_list, cur->set_list.prev); 2898 return; 2899 } 2900 } 2901add_out: 2902 list_add_tail(&nes->set_list, head); 2903} 2904 |
2887static void __update_nat_bits(struct f2fs_sb_info *sbi, nid_t start_nid, | 2905static void __update_nat_bits(struct f2fs_nm_info *nm_i, unsigned int nat_ofs, 2906 unsigned int valid) 2907{ 2908 if (valid == 0) { 2909 __set_bit_le(nat_ofs, nm_i->empty_nat_bits); 2910 __clear_bit_le(nat_ofs, nm_i->full_nat_bits); 2911 return; 2912 } 2913 2914 __clear_bit_le(nat_ofs, nm_i->empty_nat_bits); 2915 if (valid == NAT_ENTRY_PER_BLOCK) 2916 __set_bit_le(nat_ofs, nm_i->full_nat_bits); 2917 else 2918 __clear_bit_le(nat_ofs, nm_i->full_nat_bits); 2919} 2920 2921static void update_nat_bits(struct f2fs_sb_info *sbi, nid_t start_nid, |
2888 struct page *page) 2889{ 2890 struct f2fs_nm_info *nm_i = NM_I(sbi); 2891 unsigned int nat_index = start_nid / NAT_ENTRY_PER_BLOCK; 2892 struct f2fs_nat_block *nat_blk = page_address(page); 2893 int valid = 0; 2894 int i = 0; 2895 | 2922 struct page *page) 2923{ 2924 struct f2fs_nm_info *nm_i = NM_I(sbi); 2925 unsigned int nat_index = start_nid / NAT_ENTRY_PER_BLOCK; 2926 struct f2fs_nat_block *nat_blk = page_address(page); 2927 int valid = 0; 2928 int i = 0; 2929 |
2896 if (!enabled_nat_bits(sbi, NULL)) | 2930 if (!is_set_ckpt_flags(sbi, CP_NAT_BITS_FLAG)) |
2897 return; 2898 2899 if (nat_index == 0) { 2900 valid = 1; 2901 i = 1; 2902 } 2903 for (; i < NAT_ENTRY_PER_BLOCK; i++) { 2904 if (le32_to_cpu(nat_blk->entries[i].block_addr) != NULL_ADDR) 2905 valid++; 2906 } | 2931 return; 2932 2933 if (nat_index == 0) { 2934 valid = 1; 2935 i = 1; 2936 } 2937 for (; i < NAT_ENTRY_PER_BLOCK; i++) { 2938 if (le32_to_cpu(nat_blk->entries[i].block_addr) != NULL_ADDR) 2939 valid++; 2940 } |
2907 if (valid == 0) { 2908 __set_bit_le(nat_index, nm_i->empty_nat_bits); 2909 __clear_bit_le(nat_index, nm_i->full_nat_bits); 2910 return; | 2941 2942 __update_nat_bits(nm_i, nat_index, valid); 2943} 2944 2945void f2fs_enable_nat_bits(struct f2fs_sb_info *sbi) 2946{ 2947 struct f2fs_nm_info *nm_i = NM_I(sbi); 2948 unsigned int nat_ofs; 2949 2950 down_read(&nm_i->nat_tree_lock); 2951 2952 for (nat_ofs = 0; nat_ofs < nm_i->nat_blocks; nat_ofs++) { 2953 unsigned int valid = 0, nid_ofs = 0; 2954 2955 /* handle nid zero due to it should never be used */ 2956 if (unlikely(nat_ofs == 0)) { 2957 valid = 1; 2958 nid_ofs = 1; 2959 } 2960 2961 for (; nid_ofs < NAT_ENTRY_PER_BLOCK; nid_ofs++) { 2962 if (!test_bit_le(nid_ofs, 2963 nm_i->free_nid_bitmap[nat_ofs])) 2964 valid++; 2965 } 2966 2967 __update_nat_bits(nm_i, nat_ofs, valid); |
2911 } 2912 | 2968 } 2969 |
2913 __clear_bit_le(nat_index, nm_i->empty_nat_bits); 2914 if (valid == NAT_ENTRY_PER_BLOCK) 2915 __set_bit_le(nat_index, nm_i->full_nat_bits); 2916 else 2917 __clear_bit_le(nat_index, nm_i->full_nat_bits); | 2970 up_read(&nm_i->nat_tree_lock); |
2918} 2919 2920static int __flush_nat_entry_set(struct f2fs_sb_info *sbi, 2921 struct nat_entry_set *set, struct cp_control *cpc) 2922{ 2923 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA); 2924 struct f2fs_journal *journal = curseg->journal; 2925 nid_t start_nid = set->set * NAT_ENTRY_PER_BLOCK; 2926 bool to_journal = true; 2927 struct f2fs_nat_block *nat_blk; 2928 struct nat_entry *ne, *cur; 2929 struct page *page = NULL; 2930 2931 /* 2932 * there are two steps to flush nat entries: 2933 * #1, flush nat entries to journal in current hot data summary block. 2934 * #2, flush nat entries to nat page. 2935 */ | 2971} 2972 2973static int __flush_nat_entry_set(struct f2fs_sb_info *sbi, 2974 struct nat_entry_set *set, struct cp_control *cpc) 2975{ 2976 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA); 2977 struct f2fs_journal *journal = curseg->journal; 2978 nid_t start_nid = set->set * NAT_ENTRY_PER_BLOCK; 2979 bool to_journal = true; 2980 struct f2fs_nat_block *nat_blk; 2981 struct nat_entry *ne, *cur; 2982 struct page *page = NULL; 2983 2984 /* 2985 * there are two steps to flush nat entries: 2986 * #1, flush nat entries to journal in current hot data summary block. 2987 * #2, flush nat entries to nat page. 2988 */ |
2936 if (enabled_nat_bits(sbi, cpc) || | 2989 if ((cpc->reason & CP_UMOUNT) || |
2937 !__has_cursum_space(journal, set->entry_cnt, NAT_JOURNAL)) 2938 to_journal = false; 2939 2940 if (to_journal) { 2941 down_write(&curseg->journal_rwsem); 2942 } else { 2943 page = get_next_nat_page(sbi, start_nid); 2944 if (IS_ERR(page)) --- 30 unchanged lines hidden (view full) --- 2975 update_free_nid_bitmap(sbi, nid, false, false); 2976 spin_unlock(&NM_I(sbi)->nid_list_lock); 2977 } 2978 } 2979 2980 if (to_journal) { 2981 up_write(&curseg->journal_rwsem); 2982 } else { | 2990 !__has_cursum_space(journal, set->entry_cnt, NAT_JOURNAL)) 2991 to_journal = false; 2992 2993 if (to_journal) { 2994 down_write(&curseg->journal_rwsem); 2995 } else { 2996 page = get_next_nat_page(sbi, start_nid); 2997 if (IS_ERR(page)) --- 30 unchanged lines hidden (view full) --- 3028 update_free_nid_bitmap(sbi, nid, false, false); 3029 spin_unlock(&NM_I(sbi)->nid_list_lock); 3030 } 3031 } 3032 3033 if (to_journal) { 3034 up_write(&curseg->journal_rwsem); 3035 } else { |
2983 __update_nat_bits(sbi, start_nid, page); | 3036 update_nat_bits(sbi, start_nid, page); |
2984 f2fs_put_page(page, 1); 2985 } 2986 2987 /* Allow dirty nats by node block allocation in write_begin */ 2988 if (!set->entry_cnt) { 2989 radix_tree_delete(&NM_I(sbi)->nat_set_root, set->set); 2990 kmem_cache_free(nat_entry_set_slab, set); 2991 } --- 14 unchanged lines hidden (view full) --- 3006 nid_t set_idx = 0; 3007 LIST_HEAD(sets); 3008 int err = 0; 3009 3010 /* 3011 * during unmount, let's flush nat_bits before checking 3012 * nat_cnt[DIRTY_NAT]. 3013 */ | 3037 f2fs_put_page(page, 1); 3038 } 3039 3040 /* Allow dirty nats by node block allocation in write_begin */ 3041 if (!set->entry_cnt) { 3042 radix_tree_delete(&NM_I(sbi)->nat_set_root, set->set); 3043 kmem_cache_free(nat_entry_set_slab, set); 3044 } --- 14 unchanged lines hidden (view full) --- 3059 nid_t set_idx = 0; 3060 LIST_HEAD(sets); 3061 int err = 0; 3062 3063 /* 3064 * during unmount, let's flush nat_bits before checking 3065 * nat_cnt[DIRTY_NAT]. 3066 */ |
3014 if (enabled_nat_bits(sbi, cpc)) { | 3067 if (cpc->reason & CP_UMOUNT) { |
3015 down_write(&nm_i->nat_tree_lock); 3016 remove_nats_in_journal(sbi); 3017 up_write(&nm_i->nat_tree_lock); 3018 } 3019 3020 if (!nm_i->nat_cnt[DIRTY_NAT]) 3021 return 0; 3022 3023 down_write(&nm_i->nat_tree_lock); 3024 3025 /* 3026 * if there are no enough space in journal to store dirty nat 3027 * entries, remove all entries from journal and merge them 3028 * into nat entry set. 3029 */ | 3068 down_write(&nm_i->nat_tree_lock); 3069 remove_nats_in_journal(sbi); 3070 up_write(&nm_i->nat_tree_lock); 3071 } 3072 3073 if (!nm_i->nat_cnt[DIRTY_NAT]) 3074 return 0; 3075 3076 down_write(&nm_i->nat_tree_lock); 3077 3078 /* 3079 * if there are no enough space in journal to store dirty nat 3080 * entries, remove all entries from journal and merge them 3081 * into nat entry set. 3082 */ |
3030 if (enabled_nat_bits(sbi, cpc) || | 3083 if (cpc->reason & CP_UMOUNT || |
3031 !__has_cursum_space(journal, 3032 nm_i->nat_cnt[DIRTY_NAT], NAT_JOURNAL)) 3033 remove_nats_in_journal(sbi); 3034 3035 while ((found = __gang_lookup_nat_set(nm_i, 3036 set_idx, SETVEC_SIZE, setvec))) { 3037 unsigned idx; 3038 --- 20 unchanged lines hidden (view full) --- 3059{ 3060 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi); 3061 struct f2fs_nm_info *nm_i = NM_I(sbi); 3062 unsigned int nat_bits_bytes = nm_i->nat_blocks / BITS_PER_BYTE; 3063 unsigned int i; 3064 __u64 cp_ver = cur_cp_version(ckpt); 3065 block_t nat_bits_addr; 3066 | 3084 !__has_cursum_space(journal, 3085 nm_i->nat_cnt[DIRTY_NAT], NAT_JOURNAL)) 3086 remove_nats_in_journal(sbi); 3087 3088 while ((found = __gang_lookup_nat_set(nm_i, 3089 set_idx, SETVEC_SIZE, setvec))) { 3090 unsigned idx; 3091 --- 20 unchanged lines hidden (view full) --- 3112{ 3113 struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi); 3114 struct f2fs_nm_info *nm_i = NM_I(sbi); 3115 unsigned int nat_bits_bytes = nm_i->nat_blocks / BITS_PER_BYTE; 3116 unsigned int i; 3117 __u64 cp_ver = cur_cp_version(ckpt); 3118 block_t nat_bits_addr; 3119 |
3067 if (!enabled_nat_bits(sbi, NULL)) 3068 return 0; 3069 | |
3070 nm_i->nat_bits_blocks = F2FS_BLK_ALIGN((nat_bits_bytes << 1) + 8); 3071 nm_i->nat_bits = f2fs_kvzalloc(sbi, 3072 nm_i->nat_bits_blocks << F2FS_BLKSIZE_BITS, GFP_KERNEL); 3073 if (!nm_i->nat_bits) 3074 return -ENOMEM; 3075 | 3120 nm_i->nat_bits_blocks = F2FS_BLK_ALIGN((nat_bits_bytes << 1) + 8); 3121 nm_i->nat_bits = f2fs_kvzalloc(sbi, 3122 nm_i->nat_bits_blocks << F2FS_BLKSIZE_BITS, GFP_KERNEL); 3123 if (!nm_i->nat_bits) 3124 return -ENOMEM; 3125 |
3126 nm_i->full_nat_bits = nm_i->nat_bits + 8; 3127 nm_i->empty_nat_bits = nm_i->full_nat_bits + nat_bits_bytes; 3128 3129 if (!is_set_ckpt_flags(sbi, CP_NAT_BITS_FLAG)) 3130 return 0; 3131 |
|
3076 nat_bits_addr = __start_cp_addr(sbi) + sbi->blocks_per_seg - 3077 nm_i->nat_bits_blocks; 3078 for (i = 0; i < nm_i->nat_bits_blocks; i++) { 3079 struct page *page; 3080 3081 page = f2fs_get_meta_page(sbi, nat_bits_addr++); 3082 if (IS_ERR(page)) 3083 return PTR_ERR(page); 3084 3085 memcpy(nm_i->nat_bits + (i << F2FS_BLKSIZE_BITS), 3086 page_address(page), F2FS_BLKSIZE); 3087 f2fs_put_page(page, 1); 3088 } 3089 3090 cp_ver |= (cur_cp_crc(ckpt) << 32); 3091 if (cpu_to_le64(cp_ver) != *(__le64 *)nm_i->nat_bits) { | 3132 nat_bits_addr = __start_cp_addr(sbi) + sbi->blocks_per_seg - 3133 nm_i->nat_bits_blocks; 3134 for (i = 0; i < nm_i->nat_bits_blocks; i++) { 3135 struct page *page; 3136 3137 page = f2fs_get_meta_page(sbi, nat_bits_addr++); 3138 if (IS_ERR(page)) 3139 return PTR_ERR(page); 3140 3141 memcpy(nm_i->nat_bits + (i << F2FS_BLKSIZE_BITS), 3142 page_address(page), F2FS_BLKSIZE); 3143 f2fs_put_page(page, 1); 3144 } 3145 3146 cp_ver |= (cur_cp_crc(ckpt) << 32); 3147 if (cpu_to_le64(cp_ver) != *(__le64 *)nm_i->nat_bits) { |
3092 disable_nat_bits(sbi, true); | 3148 clear_ckpt_flags(sbi, CP_NAT_BITS_FLAG); 3149 f2fs_notice(sbi, "Disable nat_bits due to incorrect cp_ver (%llu, %llu)", 3150 cp_ver, le64_to_cpu(*(__le64 *)nm_i->nat_bits)); |
3093 return 0; 3094 } 3095 | 3151 return 0; 3152 } 3153 |
3096 nm_i->full_nat_bits = nm_i->nat_bits + 8; 3097 nm_i->empty_nat_bits = nm_i->full_nat_bits + nat_bits_bytes; 3098 | |
3099 f2fs_notice(sbi, "Found nat_bits in checkpoint"); 3100 return 0; 3101} 3102 3103static inline void load_free_nid_bitmap(struct f2fs_sb_info *sbi) 3104{ 3105 struct f2fs_nm_info *nm_i = NM_I(sbi); 3106 unsigned int i = 0; 3107 nid_t nid, last_nid; 3108 | 3154 f2fs_notice(sbi, "Found nat_bits in checkpoint"); 3155 return 0; 3156} 3157 3158static inline void load_free_nid_bitmap(struct f2fs_sb_info *sbi) 3159{ 3160 struct f2fs_nm_info *nm_i = NM_I(sbi); 3161 unsigned int i = 0; 3162 nid_t nid, last_nid; 3163 |
3109 if (!enabled_nat_bits(sbi, NULL)) | 3164 if (!is_set_ckpt_flags(sbi, CP_NAT_BITS_FLAG)) |
3110 return; 3111 3112 for (i = 0; i < nm_i->nat_blocks; i++) { 3113 i = find_next_bit_le(nm_i->empty_nat_bits, nm_i->nat_blocks, i); 3114 if (i >= nm_i->nat_blocks) 3115 break; 3116 3117 __set_bit_le(i, nm_i->nat_block_bitmap); --- 249 unchanged lines hidden --- | 3165 return; 3166 3167 for (i = 0; i < nm_i->nat_blocks; i++) { 3168 i = find_next_bit_le(nm_i->empty_nat_bits, nm_i->nat_blocks, i); 3169 if (i >= nm_i->nat_blocks) 3170 break; 3171 3172 __set_bit_le(i, nm_i->nat_block_bitmap); --- 249 unchanged lines hidden --- |