@@ -2426,16 +2426,103 @@ static void update_segment_mtime(struct f2fs_sb_info *sbi, block_t blkaddr,
2426
2426
SIT_I (sbi )-> max_mtime = ctime ;
2427
2427
}
2428
2428
2429
- static void update_sit_entry (struct f2fs_sb_info * sbi , block_t blkaddr , int del )
2429
+ static int update_sit_entry_for_release (struct f2fs_sb_info * sbi , struct seg_entry * se ,
2430
+ block_t blkaddr , unsigned int offset , int del )
2431
+ {
2432
+ bool exist ;
2433
+ #ifdef CONFIG_F2FS_CHECK_FS
2434
+ bool mir_exist ;
2435
+ #endif
2436
+
2437
+ exist = f2fs_test_and_clear_bit (offset , se -> cur_valid_map );
2438
+ #ifdef CONFIG_F2FS_CHECK_FS
2439
+ mir_exist = f2fs_test_and_clear_bit (offset ,
2440
+ se -> cur_valid_map_mir );
2441
+ if (unlikely (exist != mir_exist )) {
2442
+ f2fs_err (sbi , "Inconsistent error when clearing bitmap, blk:%u, old bit:%d" ,
2443
+ blkaddr , exist );
2444
+ f2fs_bug_on (sbi , 1 );
2445
+ }
2446
+ #endif
2447
+ if (unlikely (!exist )) {
2448
+ f2fs_err (sbi , "Bitmap was wrongly cleared, blk:%u" , blkaddr );
2449
+ f2fs_bug_on (sbi , 1 );
2450
+ se -> valid_blocks ++ ;
2451
+ del = 0 ;
2452
+ } else if (unlikely (is_sbi_flag_set (sbi , SBI_CP_DISABLED ))) {
2453
+ /*
2454
+ * If checkpoints are off, we must not reuse data that
2455
+ * was used in the previous checkpoint. If it was used
2456
+ * before, we must track that to know how much space we
2457
+ * really have.
2458
+ */
2459
+ if (f2fs_test_bit (offset , se -> ckpt_valid_map )) {
2460
+ spin_lock (& sbi -> stat_lock );
2461
+ sbi -> unusable_block_count ++ ;
2462
+ spin_unlock (& sbi -> stat_lock );
2463
+ }
2464
+ }
2465
+
2466
+ if (f2fs_block_unit_discard (sbi ) &&
2467
+ f2fs_test_and_clear_bit (offset , se -> discard_map ))
2468
+ sbi -> discard_blks ++ ;
2469
+
2470
+ if (!f2fs_test_bit (offset , se -> ckpt_valid_map ))
2471
+ se -> ckpt_valid_blocks += del ;
2472
+
2473
+ return del ;
2474
+ }
2475
+
2476
+ static int update_sit_entry_for_alloc (struct f2fs_sb_info * sbi , struct seg_entry * se ,
2477
+ block_t blkaddr , unsigned int offset , int del )
2430
2478
{
2431
- struct seg_entry * se ;
2432
- unsigned int segno , offset ;
2433
- long int new_vblocks ;
2434
2479
bool exist ;
2435
2480
#ifdef CONFIG_F2FS_CHECK_FS
2436
2481
bool mir_exist ;
2437
2482
#endif
2438
2483
2484
+ exist = f2fs_test_and_set_bit (offset , se -> cur_valid_map );
2485
+ #ifdef CONFIG_F2FS_CHECK_FS
2486
+ mir_exist = f2fs_test_and_set_bit (offset ,
2487
+ se -> cur_valid_map_mir );
2488
+ if (unlikely (exist != mir_exist )) {
2489
+ f2fs_err (sbi , "Inconsistent error when setting bitmap, blk:%u, old bit:%d" ,
2490
+ blkaddr , exist );
2491
+ f2fs_bug_on (sbi , 1 );
2492
+ }
2493
+ #endif
2494
+ if (unlikely (exist )) {
2495
+ f2fs_err (sbi , "Bitmap was wrongly set, blk:%u" , blkaddr );
2496
+ f2fs_bug_on (sbi , 1 );
2497
+ se -> valid_blocks -- ;
2498
+ del = 0 ;
2499
+ }
2500
+
2501
+ if (f2fs_block_unit_discard (sbi ) &&
2502
+ !f2fs_test_and_set_bit (offset , se -> discard_map ))
2503
+ sbi -> discard_blks -- ;
2504
+
2505
+ /*
2506
+ * SSR should never reuse block which is checkpointed
2507
+ * or newly invalidated.
2508
+ */
2509
+ if (!is_sbi_flag_set (sbi , SBI_CP_DISABLED )) {
2510
+ if (!f2fs_test_and_set_bit (offset , se -> ckpt_valid_map ))
2511
+ se -> ckpt_valid_blocks ++ ;
2512
+ }
2513
+
2514
+ if (!f2fs_test_bit (offset , se -> ckpt_valid_map ))
2515
+ se -> ckpt_valid_blocks += del ;
2516
+
2517
+ return del ;
2518
+ }
2519
+
2520
+ static void update_sit_entry (struct f2fs_sb_info * sbi , block_t blkaddr , int del )
2521
+ {
2522
+ struct seg_entry * se ;
2523
+ unsigned int segno , offset ;
2524
+ long int new_vblocks ;
2525
+
2439
2526
segno = GET_SEGNO (sbi , blkaddr );
2440
2527
if (segno == NULL_SEGNO )
2441
2528
return ;
@@ -2451,73 +2538,10 @@ static void update_sit_entry(struct f2fs_sb_info *sbi, block_t blkaddr, int del)
2451
2538
2452
2539
/* Update valid block bitmap */
2453
2540
if (del > 0 ) {
2454
- exist = f2fs_test_and_set_bit (offset , se -> cur_valid_map );
2455
- #ifdef CONFIG_F2FS_CHECK_FS
2456
- mir_exist = f2fs_test_and_set_bit (offset ,
2457
- se -> cur_valid_map_mir );
2458
- if (unlikely (exist != mir_exist )) {
2459
- f2fs_err (sbi , "Inconsistent error when setting bitmap, blk:%u, old bit:%d" ,
2460
- blkaddr , exist );
2461
- f2fs_bug_on (sbi , 1 );
2462
- }
2463
- #endif
2464
- if (unlikely (exist )) {
2465
- f2fs_err (sbi , "Bitmap was wrongly set, blk:%u" ,
2466
- blkaddr );
2467
- f2fs_bug_on (sbi , 1 );
2468
- se -> valid_blocks -- ;
2469
- del = 0 ;
2470
- }
2471
-
2472
- if (f2fs_block_unit_discard (sbi ) &&
2473
- !f2fs_test_and_set_bit (offset , se -> discard_map ))
2474
- sbi -> discard_blks -- ;
2475
-
2476
- /*
2477
- * SSR should never reuse block which is checkpointed
2478
- * or newly invalidated.
2479
- */
2480
- if (!is_sbi_flag_set (sbi , SBI_CP_DISABLED )) {
2481
- if (!f2fs_test_and_set_bit (offset , se -> ckpt_valid_map ))
2482
- se -> ckpt_valid_blocks ++ ;
2483
- }
2541
+ del = update_sit_entry_for_alloc (sbi , se , blkaddr , offset , del );
2484
2542
} else {
2485
- exist = f2fs_test_and_clear_bit (offset , se -> cur_valid_map );
2486
- #ifdef CONFIG_F2FS_CHECK_FS
2487
- mir_exist = f2fs_test_and_clear_bit (offset ,
2488
- se -> cur_valid_map_mir );
2489
- if (unlikely (exist != mir_exist )) {
2490
- f2fs_err (sbi , "Inconsistent error when clearing bitmap, blk:%u, old bit:%d" ,
2491
- blkaddr , exist );
2492
- f2fs_bug_on (sbi , 1 );
2493
- }
2494
- #endif
2495
- if (unlikely (!exist )) {
2496
- f2fs_err (sbi , "Bitmap was wrongly cleared, blk:%u" ,
2497
- blkaddr );
2498
- f2fs_bug_on (sbi , 1 );
2499
- se -> valid_blocks ++ ;
2500
- del = 0 ;
2501
- } else if (unlikely (is_sbi_flag_set (sbi , SBI_CP_DISABLED ))) {
2502
- /*
2503
- * If checkpoints are off, we must not reuse data that
2504
- * was used in the previous checkpoint. If it was used
2505
- * before, we must track that to know how much space we
2506
- * really have.
2507
- */
2508
- if (f2fs_test_bit (offset , se -> ckpt_valid_map )) {
2509
- spin_lock (& sbi -> stat_lock );
2510
- sbi -> unusable_block_count ++ ;
2511
- spin_unlock (& sbi -> stat_lock );
2512
- }
2513
- }
2514
-
2515
- if (f2fs_block_unit_discard (sbi ) &&
2516
- f2fs_test_and_clear_bit (offset , se -> discard_map ))
2517
- sbi -> discard_blks ++ ;
2543
+ del = update_sit_entry_for_release (sbi , se , blkaddr , offset , del );
2518
2544
}
2519
- if (!f2fs_test_bit (offset , se -> ckpt_valid_map ))
2520
- se -> ckpt_valid_blocks += del ;
2521
2545
2522
2546
__mark_sit_entry_dirty (sbi , segno );
2523
2547
0 commit comments