Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aeda7f63 authored by Ryusuke Konishi's avatar Ryusuke Konishi
Browse files

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: default avatarRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
parent b1e19e56
Loading
Loading
Loading
Loading
+11 −6
Original line number Diff line number Diff line
@@ -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)
	} 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);
}