diff options
Diffstat (limited to 'fs/f2fs/segment.h')
| -rw-r--r-- | fs/f2fs/segment.h | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h index 7f327c0ba4e3..7fd35111cf62 100644 --- a/fs/f2fs/segment.h +++ b/fs/f2fs/segment.h | |||
| @@ -189,6 +189,7 @@ struct sit_info { | |||
| 189 | char *sit_bitmap; /* SIT bitmap pointer */ | 189 | char *sit_bitmap; /* SIT bitmap pointer */ |
| 190 | unsigned int bitmap_size; /* SIT bitmap size */ | 190 | unsigned int bitmap_size; /* SIT bitmap size */ |
| 191 | 191 | ||
| 192 | unsigned long *tmp_map; /* bitmap for temporal use */ | ||
| 192 | unsigned long *dirty_sentries_bitmap; /* bitmap for dirty sentries */ | 193 | unsigned long *dirty_sentries_bitmap; /* bitmap for dirty sentries */ |
| 193 | unsigned int dirty_sentries; /* # of dirty sentries */ | 194 | unsigned int dirty_sentries; /* # of dirty sentries */ |
| 194 | unsigned int sents_per_block; /* # of SIT entries per block */ | 195 | unsigned int sents_per_block; /* # of SIT entries per block */ |
| @@ -207,7 +208,7 @@ struct free_segmap_info { | |||
| 207 | unsigned int start_segno; /* start segment number logically */ | 208 | unsigned int start_segno; /* start segment number logically */ |
| 208 | unsigned int free_segments; /* # of free segments */ | 209 | unsigned int free_segments; /* # of free segments */ |
| 209 | unsigned int free_sections; /* # of free sections */ | 210 | unsigned int free_sections; /* # of free sections */ |
| 210 | rwlock_t segmap_lock; /* free segmap lock */ | 211 | spinlock_t segmap_lock; /* free segmap lock */ |
| 211 | unsigned long *free_segmap; /* free segment bitmap */ | 212 | unsigned long *free_segmap; /* free segment bitmap */ |
| 212 | unsigned long *free_secmap; /* free section bitmap */ | 213 | unsigned long *free_secmap; /* free section bitmap */ |
| 213 | }; | 214 | }; |
| @@ -318,9 +319,9 @@ static inline unsigned int find_next_inuse(struct free_segmap_info *free_i, | |||
| 318 | unsigned int max, unsigned int segno) | 319 | unsigned int max, unsigned int segno) |
| 319 | { | 320 | { |
| 320 | unsigned int ret; | 321 | unsigned int ret; |
| 321 | read_lock(&free_i->segmap_lock); | 322 | spin_lock(&free_i->segmap_lock); |
| 322 | ret = find_next_bit(free_i->free_segmap, max, segno); | 323 | ret = find_next_bit(free_i->free_segmap, max, segno); |
| 323 | read_unlock(&free_i->segmap_lock); | 324 | spin_unlock(&free_i->segmap_lock); |
| 324 | return ret; | 325 | return ret; |
| 325 | } | 326 | } |
| 326 | 327 | ||
| @@ -331,7 +332,7 @@ static inline void __set_free(struct f2fs_sb_info *sbi, unsigned int segno) | |||
| 331 | unsigned int start_segno = secno * sbi->segs_per_sec; | 332 | unsigned int start_segno = secno * sbi->segs_per_sec; |
| 332 | unsigned int next; | 333 | unsigned int next; |
| 333 | 334 | ||
| 334 | write_lock(&free_i->segmap_lock); | 335 | spin_lock(&free_i->segmap_lock); |
| 335 | clear_bit(segno, free_i->free_segmap); | 336 | clear_bit(segno, free_i->free_segmap); |
| 336 | free_i->free_segments++; | 337 | free_i->free_segments++; |
| 337 | 338 | ||
| @@ -340,7 +341,7 @@ static inline void __set_free(struct f2fs_sb_info *sbi, unsigned int segno) | |||
| 340 | clear_bit(secno, free_i->free_secmap); | 341 | clear_bit(secno, free_i->free_secmap); |
| 341 | free_i->free_sections++; | 342 | free_i->free_sections++; |
| 342 | } | 343 | } |
| 343 | write_unlock(&free_i->segmap_lock); | 344 | spin_unlock(&free_i->segmap_lock); |
| 344 | } | 345 | } |
| 345 | 346 | ||
| 346 | static inline void __set_inuse(struct f2fs_sb_info *sbi, | 347 | static inline void __set_inuse(struct f2fs_sb_info *sbi, |
| @@ -362,7 +363,7 @@ static inline void __set_test_and_free(struct f2fs_sb_info *sbi, | |||
| 362 | unsigned int start_segno = secno * sbi->segs_per_sec; | 363 | unsigned int start_segno = secno * sbi->segs_per_sec; |
| 363 | unsigned int next; | 364 | unsigned int next; |
| 364 | 365 | ||
| 365 | write_lock(&free_i->segmap_lock); | 366 | spin_lock(&free_i->segmap_lock); |
| 366 | if (test_and_clear_bit(segno, free_i->free_segmap)) { | 367 | if (test_and_clear_bit(segno, free_i->free_segmap)) { |
| 367 | free_i->free_segments++; | 368 | free_i->free_segments++; |
| 368 | 369 | ||
| @@ -373,7 +374,7 @@ static inline void __set_test_and_free(struct f2fs_sb_info *sbi, | |||
| 373 | free_i->free_sections++; | 374 | free_i->free_sections++; |
| 374 | } | 375 | } |
| 375 | } | 376 | } |
| 376 | write_unlock(&free_i->segmap_lock); | 377 | spin_unlock(&free_i->segmap_lock); |
| 377 | } | 378 | } |
| 378 | 379 | ||
| 379 | static inline void __set_test_and_inuse(struct f2fs_sb_info *sbi, | 380 | static inline void __set_test_and_inuse(struct f2fs_sb_info *sbi, |
| @@ -381,13 +382,13 @@ static inline void __set_test_and_inuse(struct f2fs_sb_info *sbi, | |||
| 381 | { | 382 | { |
| 382 | struct free_segmap_info *free_i = FREE_I(sbi); | 383 | struct free_segmap_info *free_i = FREE_I(sbi); |
| 383 | unsigned int secno = segno / sbi->segs_per_sec; | 384 | unsigned int secno = segno / sbi->segs_per_sec; |
| 384 | write_lock(&free_i->segmap_lock); | 385 | spin_lock(&free_i->segmap_lock); |
| 385 | if (!test_and_set_bit(segno, free_i->free_segmap)) { | 386 | if (!test_and_set_bit(segno, free_i->free_segmap)) { |
| 386 | free_i->free_segments--; | 387 | free_i->free_segments--; |
| 387 | if (!test_and_set_bit(secno, free_i->free_secmap)) | 388 | if (!test_and_set_bit(secno, free_i->free_secmap)) |
| 388 | free_i->free_sections--; | 389 | free_i->free_sections--; |
| 389 | } | 390 | } |
| 390 | write_unlock(&free_i->segmap_lock); | 391 | spin_unlock(&free_i->segmap_lock); |
| 391 | } | 392 | } |
| 392 | 393 | ||
| 393 | static inline void get_sit_bitmap(struct f2fs_sb_info *sbi, | 394 | static inline void get_sit_bitmap(struct f2fs_sb_info *sbi, |
| @@ -460,7 +461,7 @@ static inline bool has_not_enough_free_secs(struct f2fs_sb_info *sbi, int freed) | |||
| 460 | int node_secs = get_blocktype_secs(sbi, F2FS_DIRTY_NODES); | 461 | int node_secs = get_blocktype_secs(sbi, F2FS_DIRTY_NODES); |
| 461 | int dent_secs = get_blocktype_secs(sbi, F2FS_DIRTY_DENTS); | 462 | int dent_secs = get_blocktype_secs(sbi, F2FS_DIRTY_DENTS); |
| 462 | 463 | ||
| 463 | if (unlikely(sbi->por_doing)) | 464 | if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) |
| 464 | return false; | 465 | return false; |
| 465 | 466 | ||
| 466 | return (free_sections(sbi) + freed) <= (node_secs + 2 * dent_secs + | 467 | return (free_sections(sbi) + freed) <= (node_secs + 2 * dent_secs + |
| @@ -599,13 +600,13 @@ static inline void check_block_count(struct f2fs_sb_info *sbi, | |||
| 599 | static inline void check_seg_range(struct f2fs_sb_info *sbi, unsigned int segno) | 600 | static inline void check_seg_range(struct f2fs_sb_info *sbi, unsigned int segno) |
| 600 | { | 601 | { |
| 601 | if (segno > TOTAL_SEGS(sbi) - 1) | 602 | if (segno > TOTAL_SEGS(sbi) - 1) |
| 602 | sbi->need_fsck = true; | 603 | set_sbi_flag(sbi, SBI_NEED_FSCK); |
| 603 | } | 604 | } |
| 604 | 605 | ||
| 605 | static inline void verify_block_addr(struct f2fs_sb_info *sbi, block_t blk_addr) | 606 | static inline void verify_block_addr(struct f2fs_sb_info *sbi, block_t blk_addr) |
| 606 | { | 607 | { |
| 607 | if (blk_addr < SEG0_BLKADDR(sbi) || blk_addr >= MAX_BLKADDR(sbi)) | 608 | if (blk_addr < SEG0_BLKADDR(sbi) || blk_addr >= MAX_BLKADDR(sbi)) |
| 608 | sbi->need_fsck = true; | 609 | set_sbi_flag(sbi, SBI_NEED_FSCK); |
| 609 | } | 610 | } |
| 610 | 611 | ||
| 611 | /* | 612 | /* |
| @@ -616,11 +617,11 @@ static inline void check_block_count(struct f2fs_sb_info *sbi, | |||
| 616 | { | 617 | { |
| 617 | /* check segment usage */ | 618 | /* check segment usage */ |
| 618 | if (GET_SIT_VBLOCKS(raw_sit) > sbi->blocks_per_seg) | 619 | if (GET_SIT_VBLOCKS(raw_sit) > sbi->blocks_per_seg) |
| 619 | sbi->need_fsck = true; | 620 | set_sbi_flag(sbi, SBI_NEED_FSCK); |
| 620 | 621 | ||
| 621 | /* check boundary of a given segment number */ | 622 | /* check boundary of a given segment number */ |
| 622 | if (segno > TOTAL_SEGS(sbi) - 1) | 623 | if (segno > TOTAL_SEGS(sbi) - 1) |
| 623 | sbi->need_fsck = true; | 624 | set_sbi_flag(sbi, SBI_NEED_FSCK); |
| 624 | } | 625 | } |
| 625 | #endif | 626 | #endif |
| 626 | 627 | ||
