@ -562,6 +562,16 @@ int log_wait_commit(journal_t *journal, tid_t tid)
spin_unlock ( & journal - > j_state_lock ) ;
# endif
spin_lock ( & journal - > j_state_lock ) ;
/*
* Not running or committing trans ? Must be already committed . This
* saves us from waiting for a * long * time when tid overflows .
*/
if ( ! ( ( journal - > j_running_transaction & &
journal - > j_running_transaction - > t_tid = = tid ) | |
( journal - > j_committing_transaction & &
journal - > j_committing_transaction - > t_tid = = tid ) ) )
goto out_unlock ;
if ( ! tid_geq ( journal - > j_commit_waited , tid ) )
journal - > j_commit_waited = tid ;
while ( tid_gt ( tid , journal - > j_commit_sequence ) ) {
@ -573,6 +583,7 @@ int log_wait_commit(journal_t *journal, tid_t tid)
! tid_gt ( tid , journal - > j_commit_sequence ) ) ;
spin_lock ( & journal - > j_state_lock ) ;
}
out_unlock :
spin_unlock ( & journal - > j_state_lock ) ;
if ( unlikely ( is_journal_aborted ( journal ) ) ) {
@ -1843,7 +1854,7 @@ static struct journal_head *journal_alloc_journal_head(void)
# ifdef CONFIG_JBD_DEBUG
atomic_inc ( & nr_journal_heads ) ;
# endif
ret = kmem_cache_alloc ( journal_head_cache , GFP_NOFS ) ;
ret = kmem_cache_z alloc ( journal_head_cache , GFP_NOFS ) ;
if ( ret = = NULL ) {
jbd_debug ( 1 , " out of memory for journal_head \n " ) ;
printk_ratelimited ( KERN_NOTICE " ENOMEM in %s, retrying. \n " ,
@ -1851,7 +1862,7 @@ static struct journal_head *journal_alloc_journal_head(void)
while ( ret = = NULL ) {
yield ( ) ;
ret = kmem_cache_alloc ( journal_head_cache , GFP_NOFS ) ;
ret = kmem_cache_z alloc ( journal_head_cache , GFP_NOFS ) ;
}
}
return ret ;
@ -1913,10 +1924,8 @@ struct journal_head *journal_add_journal_head(struct buffer_head *bh)
struct journal_head * new_jh = NULL ;
repeat :
if ( ! buffer_jbd ( bh ) ) {
if ( ! buffer_jbd ( bh ) )
new_jh = journal_alloc_journal_head ( ) ;
memset ( new_jh , 0 , sizeof ( * new_jh ) ) ;
}
jbd_lock_bh_journal_head ( bh ) ;
if ( buffer_jbd ( bh ) ) {