f2fs: fix equation of has_not_enough_free_secs()
Practically, has_not_enough_free_secs() should calculate with the numbers of current node and directory data blocks together. Actually the equation was implemented in need_to_flush(). So, this patch removes need_flush() and moves the equation into has_not_enough_free_secs(). Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
This commit is contained in:
parent
f58ad8f51a
commit
029cd28c1f
2 changed files with 16 additions and 35 deletions
|
@ -19,48 +19,16 @@
|
||||||
#include "segment.h"
|
#include "segment.h"
|
||||||
#include "node.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.
|
* This function balances dirty node and dentry pages.
|
||||||
* In addition, it controls garbage collection.
|
* In addition, it controls garbage collection.
|
||||||
*/
|
*/
|
||||||
void f2fs_balance_fs(struct f2fs_sb_info *sbi)
|
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
|
* We should do GC or end up with checkpoint, if there are so many dirty
|
||||||
* with enough free segments. After then, we should do GC.
|
* 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)) {
|
if (has_not_enough_free_secs(sbi)) {
|
||||||
mutex_lock(&sbi->gc_mutex);
|
mutex_lock(&sbi->gc_mutex);
|
||||||
f2fs_gc(sbi, 1);
|
f2fs_gc(sbi, 1);
|
||||||
|
|
|
@ -459,7 +459,20 @@ static inline int get_ssr_segment(struct f2fs_sb_info *sbi, int type)
|
||||||
|
|
||||||
static inline bool has_not_enough_free_secs(struct f2fs_sb_info *sbi)
|
static inline bool has_not_enough_free_secs(struct f2fs_sb_info *sbi)
|
||||||
{
|
{
|
||||||
return free_sections(sbi) <= reserved_sections(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 false;
|
||||||
|
|
||||||
|
if (free_sections(sbi) <= (node_secs + 2 * dent_secs +
|
||||||
|
reserved_sections(sbi)))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int utilization(struct f2fs_sb_info *sbi)
|
static inline int utilization(struct f2fs_sb_info *sbi)
|
||||||
|
|
Loading…
Reference in a new issue