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

Commit 1c627829 authored by Dave Kleikamp's avatar Dave Kleikamp Committed by Linus Torvalds
Browse files

[PATCH] JFS: Write journal sync points more often



This patch adds jfs_syncpt, which calls lmLogSync to write sync points
to the journal both in jfs_sync_fs and when sync barrier processing
completes.

lmLogSync accomplishes two things:  1) it pushes logged-but-dirty
metadata pages to disk, and 2) it writes a sync record to the journal
so that jfs_fsck doesn't need to replay more transactions than is
necessary.

Signed-off-by: default avatarDave Kleikamp <shaggy@austin.ibm.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 7fab479b
Loading
Loading
Loading
Loading
+14 −3
Original line number Diff line number Diff line
@@ -927,9 +927,8 @@ static void lmPostGC(struct lbuf * bp)
 *	calculate new value of i_nextsync which determines when
 *	this code is called again.
 *
 *	this is called only from lmLog().
 *
 * PARAMETER:	ip	- pointer to logs inode.
 * PARAMETERS:	log	- log structure
 * 		nosyncwait - 1 if called asynchronously
 *
 * RETURN:	0
 *			
@@ -1051,6 +1050,18 @@ static int lmLogSync(struct jfs_log * log, int nosyncwait)
	return lsn;
}

/*
 * NAME:	jfs_syncpt
 *
 * FUNCTION:	write log SYNCPT record for specified log
 *
 * PARAMETERS:	log	- log structure
 */
void jfs_syncpt(struct jfs_log *log)
{	LOG_LOCK(log);
	lmLogSync(log, 1);
	LOG_UNLOCK(log);
}

/*
 * NAME:	lmLogOpen()
+1 −0
Original line number Diff line number Diff line
@@ -508,5 +508,6 @@ extern int lmLogShutdown(struct jfs_log * log);
extern int lmLogInit(struct jfs_log * log);
extern int lmLogFormat(struct jfs_log *log, s64 logAddress, int logSize);
extern void jfs_flush_journal(struct jfs_log * log, int wait);
extern void jfs_syncpt(struct jfs_log *log);

#endif				/* _H_JFS_LOGMGR */
+9 −5
Original line number Diff line number Diff line
@@ -567,9 +567,6 @@ void txEnd(tid_t tid)
		 * synchronize with logsync barrier
		 */
		if (test_bit(log_SYNCBARRIER, &log->flag)) {
			/* forward log syncpt */
			/* lmSync(log); */

			jfs_info("log barrier off: 0x%x", log->lsn);

			/* enable new transactions start */
@@ -577,15 +574,22 @@ void txEnd(tid_t tid)

			/* wakeup all waitors for logsync barrier */
			TXN_WAKEUP(&log->syncwait);

			TXN_UNLOCK();

			/* forward log syncpt */
			jfs_syncpt(log);

			goto wakeup;
		}
	}

	TXN_UNLOCK();
wakeup:
	/*
	 * wakeup all waitors for a free tblock
	 */
	TXN_WAKEUP(&TxAnchor.freewait);

	TXN_UNLOCK();
}


+3 −1
Original line number Diff line number Diff line
@@ -558,8 +558,10 @@ static int jfs_sync_fs(struct super_block *sb, int wait)
	struct jfs_log *log = JFS_SBI(sb)->log;

	/* log == NULL indicates read-only mount */
	if (log)
	if (log) {
		jfs_flush_journal(log, wait);
		jfs_syncpt(log);
	}

	return 0;
}