TXN_UNLOCK();
void txEnd(tid_t tid){	struct tblock *tblk = tid_to_tblock(tid);	struct jfs_log *log;	jfs_info("txEnd: tid = %d", tid);	TXN_LOCK();	/*	 * wakeup transactions waiting on the page locked	 * by the current transaction	 */	TXN_WAKEUP(&tblk->waitor);	log = JFS_SBI(tblk->sb)->log;	/*	 * Lazy commit thread can't free this guy until we mark it UNLOCKED,	 * otherwise, we would be left with a transaction that may have been	 * reused.	 *	 * Lazy commit thread will turn off tblkGC_LAZY before calling this	 * routine.	 */	if (tblk->flag & tblkGC_LAZY) {		jfs_info("txEnd called w/lazy tid: %d, tblk = 0x%p", tid, tblk);		TXN_UNLOCK();		spin_lock_irq(&log->gclock);	// LOGGC_LOCK		tblk->flag |= tblkGC_UNLOCKED;		spin_unlock_irq(&log->gclock);	// LOGGC_UNLOCK		return;	}	jfs_info("txEnd: tid: %d, tblk = 0x%p", tid, tblk);	assert(tblk->next == 0);	/*	 * insert tblock back on freelist	 */	tblk->next = TxAnchor.freetid;	TxAnchor.freetid = tid;	/*	 * mark the tblock not active	 */	if (--log->active == 0) {		clear_bit(log_FLUSH, &log->flag);		/*		 * 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 */			clear_bit(log_SYNCBARRIER, &log->flag);			/* wakeup all waitors for logsync barrier */			TXN_WAKEUP(&log->syncwait);		}	}	/*	 * wakeup all waitors for a free tblock	 */	TXN_WAKEUP(&TxAnchor.freewait);	TXN_UNLOCK();}