if (batch_count) 
if (batch_count) { 
int log_do_checkpoint(journal_t *journal){	int result;	int batch_count = 0;	struct buffer_head *bhs[NR_BATCH];	jbd_debug(1, "Start checkpoint\n");	/* 	 * First thing: if there are any transactions in the log which	 * don't need checkpointing, just eliminate them from the	 * journal straight away.  	 */	result = cleanup_journal_tail(journal);	jbd_debug(1, "cleanup_journal_tail returned %d\n", result);	if (result <= 0)		return result;	/*	 * OK, we need to start writing disk blocks.  Try to free up a	 * quarter of the log in a single checkpoint if we can.	 */	/*	 * AKPM: check this code.  I had a feeling a while back that it	 * degenerates into a busy loop at unmount time.	 */	spin_lock(&journal->j_list_lock);	while (journal->j_checkpoint_transactions) {		transaction_t *transaction;		struct journal_head *jh, *last_jh, *next_jh;		int drop_count = 0;		int cleanup_ret, retry = 0;		tid_t this_tid;		transaction = journal->j_checkpoint_transactions;		this_tid = transaction->t_tid;		jh = transaction->t_checkpoint_list;		last_jh = jh->b_cpprev;		next_jh = jh;		do {			struct buffer_head *bh;			jh = next_jh;			next_jh = jh->b_cpnext;			bh = jh2bh(jh);			if (!jbd_trylock_bh_state(bh)) {				jbd_sync_bh(journal, bh);				spin_lock(&journal->j_list_lock);				retry = 1;				break;			}			retry = __flush_buffer(journal, jh, bhs, &batch_count, &drop_count);			if (cond_resched_lock(&journal->j_list_lock)) {				retry = 1;				break;			}		} while (jh != last_jh && !retry);		if (batch_count)			__flush_batch(journal, bhs, &batch_count);		/*		 * If someone cleaned up this transaction while we slept, we're		 * done		 */		if (journal->j_checkpoint_transactions != transaction)			break;		if (retry)			continue;		/*		 * Maybe it's a new transaction, but it fell at the same		 * address		 */		if (transaction->t_tid != this_tid)			continue;		/*		 * We have walked the whole transaction list without		 * finding anything to write to disk.  We had better be		 * able to make some progress or we are in trouble. 		 */		cleanup_ret = __cleanup_transaction(journal, transaction);		J_ASSERT(drop_count != 0 || cleanup_ret != 0);		if (journal->j_checkpoint_transactions != transaction)			break;	}	spin_unlock(&journal->j_list_lock);	result = cleanup_journal_tail(journal);	if (result < 0)		return result;	return 0;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/00ea81459c279f14a7b344320a71c94f60f88929/checkpoint.c/buggy/fs/jbd/checkpoint.c