diff options
Diffstat (limited to 'fs/f2fs/segment.c')
| -rw-r--r-- | fs/f2fs/segment.c | 46 | 
1 files changed, 6 insertions, 40 deletions
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 1b26e4ea1016..de6240922b0a 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -12,54 +12,23 @@  #include <linux/f2fs_fs.h>  #include <linux/bio.h>  #include <linux/blkdev.h> +#include <linux/prefetch.h>  #include <linux/vmalloc.h>  #include "f2fs.h"  #include "segment.h"  #include "node.h" -static int need_to_flush(struct f2fs_sb_info *sbi) -{ -	unsigned int pages_per_sec = (1 << sbi->log_blocks_per_seg) * -			sbi->segs_per_sec; -	int node_secs = ((get_pages(sbi, F2FS_DIRTY_NODES) + pages_per_sec - 1) -		>> sbi->log_blocks_per_seg) / sbi->segs_per_sec; -	int dent_secs = ((get_pages(sbi, F2FS_DIRTY_DENTS) + pages_per_sec - 1) -		>> sbi->log_blocks_per_seg) / sbi->segs_per_sec; - -	if (sbi->por_doing) -		return 0; - -	if (free_sections(sbi) <= (node_secs + 2 * dent_secs + -						reserved_sections(sbi))) -		return 1; -	return 0; -} -  /*   * This function balances dirty node and dentry pages.   * In addition, it controls garbage collection.   */  void f2fs_balance_fs(struct f2fs_sb_info *sbi)  { -	struct writeback_control wbc = { -		.sync_mode = WB_SYNC_ALL, -		.nr_to_write = LONG_MAX, -		.for_reclaim = 0, -	}; - -	if (sbi->por_doing) -		return; -  	/* -	 * We should do checkpoint when there are so many dirty node pages -	 * with enough free segments. After then, we should do GC. +	 * We should do GC or end up with checkpoint, if there are so many dirty +	 * dir/node pages without enough free segments.  	 */ -	if (need_to_flush(sbi)) { -		sync_dirty_dir_inodes(sbi); -		sync_node_pages(sbi, 0, &wbc); -	} -  	if (has_not_enough_free_secs(sbi)) {  		mutex_lock(&sbi->gc_mutex);  		f2fs_gc(sbi, 1); @@ -631,7 +600,6 @@ static void f2fs_end_io_write(struct bio *bio, int err)  			if (page->mapping)  				set_bit(AS_EIO, &page->mapping->flags);  			set_ckpt_flags(p->sbi->ckpt, CP_ERROR_FLAG); -			set_page_dirty(page);  		}  		end_page_writeback(page);  		dec_page_count(p->sbi, F2FS_WRITEBACK); @@ -791,11 +759,10 @@ static int __get_segment_type(struct page *page, enum page_type p_type)  		return __get_segment_type_2(page, p_type);  	case 4:  		return __get_segment_type_4(page, p_type); -	case 6: -		return __get_segment_type_6(page, p_type); -	default: -		BUG();  	} +	/* NR_CURSEG_TYPE(6) logs by default */ +	BUG_ON(sbi->active_logs != NR_CURSEG_TYPE); +	return __get_segment_type_6(page, p_type);  }  static void do_write_page(struct f2fs_sb_info *sbi, struct page *page, @@ -1608,7 +1575,6 @@ static int build_dirty_segmap(struct f2fs_sb_info *sbi)  	for (i = 0; i < NR_DIRTY_TYPE; i++) {  		dirty_i->dirty_segmap[i] = kzalloc(bitmap_size, GFP_KERNEL); -		dirty_i->nr_dirty[i] = 0;  		if (!dirty_i->dirty_segmap[i])  			return -ENOMEM;  	}  |