nilfs2: fix irregular checkpoint creation due to data flush
When nilfs flushes out dirty data to reduce memory pressure, creation of checkpoints is wrongly postponed. This bug causes irregular checkpoint creation especially in small footprint systems. To correct this issue, a timer for the checkpoint creation has to be continued if a log writer does not create a checkpoint. This will do the correction. Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
This commit is contained in:
parent
b1e19e5601
commit
aeda7f6343
|
@ -2468,17 +2468,22 @@ static void nilfs_segctor_notify(struct nilfs_sc_info *sci,
|
|||
/* Clear requests (even when the construction failed) */
|
||||
spin_lock(&sci->sc_state_lock);
|
||||
|
||||
sci->sc_state &= ~NILFS_SEGCTOR_COMMIT;
|
||||
|
||||
if (req->mode == SC_LSEG_SR) {
|
||||
sci->sc_state &= ~NILFS_SEGCTOR_COMMIT;
|
||||
sci->sc_seq_done = req->seq_accepted;
|
||||
nilfs_segctor_wakeup(sci, req->sc_err ? : req->sb_err);
|
||||
sci->sc_flush_request = 0;
|
||||
} else if (req->mode == SC_FLUSH_FILE)
|
||||
sci->sc_flush_request &= ~FLUSH_FILE_BIT;
|
||||
else if (req->mode == SC_FLUSH_DAT)
|
||||
sci->sc_flush_request &= ~FLUSH_DAT_BIT;
|
||||
} else {
|
||||
if (req->mode == SC_FLUSH_FILE)
|
||||
sci->sc_flush_request &= ~FLUSH_FILE_BIT;
|
||||
else if (req->mode == SC_FLUSH_DAT)
|
||||
sci->sc_flush_request &= ~FLUSH_DAT_BIT;
|
||||
|
||||
/* re-enable timer if checkpoint creation was not done */
|
||||
if (sci->sc_timer && (sci->sc_state & NILFS_SEGCTOR_COMMIT) &&
|
||||
time_before(jiffies, sci->sc_timer->expires))
|
||||
add_timer(sci->sc_timer);
|
||||
}
|
||||
spin_unlock(&sci->sc_state_lock);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue