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

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

[PATCH] JFS: Take logsync lock before testing mp->lsn



This fixes a race where lsn could be cleared before taking the lock

Signed-off-by: default avatarDave Kleikamp <shaggy@austin.ibm.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 0f511ea7
Loading
Loading
Loading
Loading
+2 −5
Original line number Diff line number Diff line
@@ -532,10 +532,10 @@ dbUpdatePMap(struct inode *ipbmap,

		lastlblkno = lblkno;

		LOGSYNC_LOCK(log, flags);
		if (mp->lsn != 0) {
			/* inherit older/smaller lsn */
			logdiff(diffp, mp->lsn, log);
			LOGSYNC_LOCK(log, flags);
			if (difft < diffp) {
				mp->lsn = lsn;

@@ -548,20 +548,17 @@ dbUpdatePMap(struct inode *ipbmap,
			logdiff(diffp, mp->clsn, log);
			if (difft > diffp)
				mp->clsn = tblk->clsn;
			LOGSYNC_UNLOCK(log, flags);
		} else {
			mp->log = log;
			mp->lsn = lsn;

			/* insert bp after tblock in logsync list */
			LOGSYNC_LOCK(log, flags);

			log->count++;
			list_add(&mp->synclist, &tblk->synclist);

			mp->clsn = tblk->clsn;
			LOGSYNC_UNLOCK(log, flags);
		}
		LOGSYNC_UNLOCK(log, flags);
	}

	/* write the last buffer. */
+2 −4
Original line number Diff line number Diff line
@@ -2844,11 +2844,11 @@ diUpdatePMap(struct inode *ipimap,
	 */
	lsn = tblk->lsn;
	log = JFS_SBI(tblk->sb)->log;
	LOGSYNC_LOCK(log, flags);
	if (mp->lsn != 0) {
		/* inherit older/smaller lsn */
		logdiff(difft, lsn, log);
		logdiff(diffp, mp->lsn, log);
		LOGSYNC_LOCK(log, flags);
		if (difft < diffp) {
			mp->lsn = lsn;
			/* move mp after tblock in logsync list */
@@ -2860,17 +2860,15 @@ diUpdatePMap(struct inode *ipimap,
		logdiff(diffp, mp->clsn, log);
		if (difft > diffp)
			mp->clsn = tblk->clsn;
		LOGSYNC_UNLOCK(log, flags);
	} else {
		mp->log = log;
		mp->lsn = lsn;
		/* insert mp after tblock in logsync list */
		LOGSYNC_LOCK(log, flags);
		log->count++;
		list_add(&mp->synclist, &tblk->synclist);
		mp->clsn = tblk->clsn;
		LOGSYNC_UNLOCK(log, flags);
	}
	LOGSYNC_UNLOCK(log, flags);
	write_metapage(mp);
	return (0);
}