diff options
author | Jaegeuk Kim <jaegeuk@kernel.org> | 2015-12-16 18:31:38 -0800 |
---|---|---|
committer | Greg Wallace <greg@gregtwallace.com> | 2016-01-19 22:02:21 -0500 |
commit | 09dfa9f0c722b024804f8961036411ce7f25641e (patch) | |
tree | 2524a3d07bc2599ede757f7a9abad569162d08bb | |
parent | 8c04142bab05b5c81e24fb07c8c3e1cd1cb9c56b (diff) | |
download | android_external_f2fs-tools-09dfa9f0c722b024804f8961036411ce7f25641e.tar.gz android_external_f2fs-tools-09dfa9f0c722b024804f8961036411ce7f25641e.tar.bz2 android_external_f2fs-tools-09dfa9f0c722b024804f8961036411ce7f25641e.zip |
defrag.f2fs: return error if there is no space
This patch checks whether there is a space or not to allocate new blocks.
Change-Id: I92bfd159b820d8364d3f081e571cef9fec99d76c
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
-rw-r--r-- | fsck/mount.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/fsck/mount.c b/fsck/mount.c index 735ed90..4b38df8 100644 --- a/fsck/mount.c +++ b/fsck/mount.c @@ -11,6 +11,20 @@ #include "fsck.h" #include <locale.h> +static u32 get_free_segments(struct f2fs_sb_info *sbi) +{ + u32 i, free_segs = 0; + + for (i = 0; i < TOTAL_SEGS(sbi); i++) { + struct seg_entry *se = get_seg_entry(sbi, i); + + if (se->valid_blocks == 0x0 && + !IS_CUR_SEGNO(sbi, i, NO_CHECK_TYPE)) + free_segs++; + } + return free_segs; +} + void print_inode_info(struct f2fs_inode *inode, int name) { unsigned int i = 0; @@ -1376,6 +1390,9 @@ int find_next_free_block(struct f2fs_sb_info *sbi, u64 *to, int left, int type) u32 segno; u64 offset; + if (get_free_segments(sbi) <= SM_I(sbi)->reserved_segments + 1) + return -1; + while (*to >= SM_I(sbi)->main_blkaddr && *to < F2FS_RAW_SUPER(sbi)->block_count) { segno = GET_SEGNO(sbi, *to); @@ -1543,10 +1560,8 @@ void write_checkpoint(struct f2fs_sb_info *sbi) struct f2fs_checkpoint *cp = F2FS_CKPT(sbi); struct f2fs_super_block *sb = F2FS_RAW_SUPER(sbi); block_t orphan_blks = 0; - u32 free_segs = 0; unsigned long long cp_blk_no; u32 flags = CP_UMOUNT_FLAG; - unsigned int segno; int i, ret; u_int32_t crc = 0; @@ -1557,14 +1572,7 @@ void write_checkpoint(struct f2fs_sb_info *sbi) set_cp(ckpt_flags, flags); - for (segno = 0; segno < TOTAL_SEGS(sbi); segno++) { - struct seg_entry *se = get_seg_entry(sbi, segno); - - if (se->valid_blocks == 0x0 && - !IS_CUR_SEGNO(sbi, segno, NO_CHECK_TYPE)) - free_segs++; - } - set_cp(free_segment_count, free_segs); + set_cp(free_segment_count, get_free_segments(sbi)); set_cp(cp_pack_total_block_count, 8 + orphan_blks + get_sb(cp_payload)); crc = f2fs_cal_crc32(F2FS_SUPER_MAGIC, cp, CHECKSUM_OFFSET); |