diff options
Diffstat (limited to 'fs/f2fs/node.c')
| -rw-r--r-- | fs/f2fs/node.c | 19 | 
1 files changed, 12 insertions, 7 deletions
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index 5066bfd256c..9bda63c9c16 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c @@ -1124,6 +1124,12 @@ static int f2fs_write_node_page(struct page *page,  	return 0;  } +/* + * It is very important to gather dirty pages and write at once, so that we can + * submit a big bio without interfering other data writes. + * Be default, 512 pages (2MB), a segment size, is quite reasonable. + */ +#define COLLECT_DIRTY_NODES	512  static int f2fs_write_node_pages(struct address_space *mapping,  			    struct writeback_control *wbc)  { @@ -1131,17 +1137,16 @@ static int f2fs_write_node_pages(struct address_space *mapping,  	struct block_device *bdev = sbi->sb->s_bdev;  	long nr_to_write = wbc->nr_to_write; -	if (wbc->for_kupdate) -		return 0; - -	if (get_pages(sbi, F2FS_DIRTY_NODES) == 0) -		return 0; - +	/* First check balancing cached NAT entries */  	if (try_to_free_nats(sbi, NAT_ENTRY_PER_BLOCK)) {  		write_checkpoint(sbi, false, false);  		return 0;  	} +	/* collect a number of dirty node pages and write together */ +	if (get_pages(sbi, F2FS_DIRTY_NODES) < COLLECT_DIRTY_NODES) +		return 0; +  	/* if mounting is failed, skip writing node pages */  	wbc->nr_to_write = bio_get_nr_vecs(bdev);  	sync_node_pages(sbi, 0, wbc); @@ -1732,7 +1737,7 @@ void destroy_node_manager(struct f2fs_sb_info *sbi)  	kfree(nm_i);  } -int create_node_manager_caches(void) +int __init create_node_manager_caches(void)  {  	nat_entry_slab = f2fs_kmem_cache_create("nat_entry",  			sizeof(struct nat_entry), NULL);  |