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>

+11 -6
+11 -6
fs/nilfs2/segment.c
··· 2468 2468 /* Clear requests (even when the construction failed) */ 2469 2469 spin_lock(&sci->sc_state_lock); 2470 2470 2471 - sci->sc_state &= ~NILFS_SEGCTOR_COMMIT; 2472 - 2473 2471 if (req->mode == SC_LSEG_SR) { 2472 + sci->sc_state &= ~NILFS_SEGCTOR_COMMIT; 2474 2473 sci->sc_seq_done = req->seq_accepted; 2475 2474 nilfs_segctor_wakeup(sci, req->sc_err ? : req->sb_err); 2476 2475 sci->sc_flush_request = 0; 2477 - } else if (req->mode == SC_FLUSH_FILE) 2478 - sci->sc_flush_request &= ~FLUSH_FILE_BIT; 2479 - else if (req->mode == SC_FLUSH_DAT) 2480 - sci->sc_flush_request &= ~FLUSH_DAT_BIT; 2476 + } else { 2477 + if (req->mode == SC_FLUSH_FILE) 2478 + sci->sc_flush_request &= ~FLUSH_FILE_BIT; 2479 + else if (req->mode == SC_FLUSH_DAT) 2480 + sci->sc_flush_request &= ~FLUSH_DAT_BIT; 2481 2481 2482 + /* re-enable timer if checkpoint creation was not done */ 2483 + if (sci->sc_timer && (sci->sc_state & NILFS_SEGCTOR_COMMIT) && 2484 + time_before(jiffies, sci->sc_timer->expires)) 2485 + add_timer(sci->sc_timer); 2486 + } 2482 2487 spin_unlock(&sci->sc_state_lock); 2483 2488 } 2484 2489