/*
** Write ahead logging implementation copyright Chris Mason 2000
**
** The background commits make this code very interelated, and 
** overly complex.  I need to rethink things a bit....The major players:
**
** journal_begin -- call with the number of blocks you expect to log.  
**                  If the current transaction is too
** 		    old, it will block until the current transaction is 
** 		    finished, and then start a new one.
**		    Usually, your transaction will get joined in with 
**                  previous ones for speed.
**
** journal_join  -- same as journal_begin, but won't block on the current 
**                  transaction regardless of age.  Don't ever call
**                  this.  Ever.  There are only two places it should be 
**                  called from, and they are both inside this file.
**
** journal_mark_dirty -- adds blocks into this transaction.  clears any flags 
**                       that might make them get sent to disk
**                       and then marks them BH_JDirty.  Puts the buffer head 
**                       into the current transaction hash.  
**
** journal_end -- if the current transaction is batchable, it does nothing
**                   otherwise, it could do an async/synchronous commit, or
**                   a full flush of all log and real blocks in the 
**                   transaction.
**
** flush_old_commits -- if the current transaction is too old, it is ended and 
**                      commit blocks are sent to disk.  Forces commit blocks 
**                      to disk for all backgrounded commits that have been 
**                      around too long.
**		     -- Note, if you call this as an immediate flush from 
**		        from within kupdate, it will ignore the immediate flag
*/

#include <linux/config.h>
#include <asm/uaccess.h>
#include <asm/system.h>

#include <linux/time.h>
#include <asm/semaphore.h>

#include <linux/vmalloc.h>
#include <linux/reiserfs_fs.h>

#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/fcntl.h>
#include <linux/stat.h>
#include <linux/string.h>
#include <linux/smp_lock.h>
#include <linux/buffer_head.h>
#include <linux/workqueue.h>
#include <linux/writeback.h>
#include <linux/blkdev.h>


/* gets a struct reiserfs_journal_list * from a list head */
#define JOURNAL_LIST_ENTRY(h) (list_entry((h), struct reiserfs_journal_list, \
                               j_list))
#define JOURNAL_WORK_ENTRY(h) (list_entry((h), struct reiserfs_journal_list, \
                               j_working_list))

/* the number of mounted filesystems.  This is used to decide when to
** start and kill the commit workqueue
*/
static int reiserfs_mounted_fs_count;

static struct workqueue_struct *commit_wq;

#define JOURNAL_TRANS_HALF 1018   /* must be correct to keep the desc and commit
				     structs at 4k */
#define BUFNR 64 /*read ahead */

/* cnode stat bits.  Move these into reiserfs_fs.h */

#define BLOCK_FREED 2		/* this block was freed, and can't be written.  */
#define BLOCK_FREED_HOLDER 3    /* this block was freed during this transaction, and can't be written */

#define BLOCK_NEEDS_FLUSH 4	/* used in flush_journal_list */
#define BLOCK_DIRTIED 5


/* journal list state bits */
#define LIST_TOUCHED 1
#define LIST_DIRTY   2
#define LIST_COMMIT_PENDING  4		/* someone will commit this list */

/* flags for do_journal_end */
#define FLUSH_ALL   1		/* flush commit and real blocks */
#define COMMIT_NOW  2		/* end and commit this transaction */
#define WAIT        4		/* wait for the log blocks to hit the disk*/

static int do_journal_end(struct reiserfs_transaction_handle *,struct super_block *,unsigned long nblocks,int flags) ;
static int flush_journal_list(struct super_block *s, struct reiserfs_journal_list *jl, int flushall) ;
static int flush_commit_list(struct super_block *s, struct reiserfs_journal_list *jl, int flushall)  ;
static int can_dirty(struct reiserfs_journal_cnode *cn) ;
static int journal_join(struct reiserfs_transaction_handle *th, struct super_block *p_s_sb, unsigned long nblocks);
static int release_journal_dev( struct super_block *super,
				struct reiserfs_journal *journal );
static int dirty_one_transaction(struct super_block *s,
                                 struct reiserfs_journal_list *jl);
static void flush_async_commits(void *p);
static void queue_log_writer(struct super_block *s);

/* values for join in do_journal_begin_r */
enum {
    JBEGIN_REG = 0, /* regular journal begin */
    JBEGIN_JOIN = 1, /* join the running transaction if at all possible */
    JBEGIN_ABORT = 2, /* called from cleanup code, ignores aborted flag */
};

static int do_journal_begin_r(struct reiserfs_transaction_handle *th,
                             struct super_block * p_s_sb,
			     unsigned long nblocks,int join);

static void init_journal_hash(struct super_block *p_s_sb) {
  struct reiserfs_journal *journal = SB_JOURNAL (p_s_sb);
  memset(journal->j_hash_table, 0, JOURNAL_HASH_SIZE * sizeof(struct reiserfs_journal_cnode *)) ;
}

/*
** clears BH_Dirty and sticks the buffer on the clean list.  Called because I can't allow refile_buffer to
** make schedule happen after I've freed a block.  Look at remove_from_transaction and journal_mark_freed for
** more details.
*/
static int reiserfs_clean_and_file_buffer(struct buffer_head *bh) {
  if (bh) {
    clear_buffer_dirty(bh);
    clear_buffer_journal_test(bh);
  }
  return 0 ;
}

static void disable_barrier(struct super_block *s)
{
    REISERFS_SB(s)->s_mount_opt &= ~(1 << REISERFS_BARRIER_FLUSH);
    printk("reiserfs: disabling flush barriers on %s\n", reiserfs_bdevname(s));
}

static struct reiserfs_bitmap_node *
allocate_bitmap_node(struct super_block *p_s_sb) {
  struct reiserfs_bitmap_node *bn ;
  static int id;

  bn = reiserfs_kmalloc(sizeof(struct reiserfs_bitmap_node), GFP_NOFS, p_s_sb) ;
  if (!bn) {
    return NULL ;
  }
  bn->data = reiserfs_kmalloc(p_s_sb->s_blocksize, GFP_NOFS, p_s_sb) ;
  if (!bn->data) {
    reiserfs_kfree(bn, sizeof(struct reiserfs_bitmap_node), p_s_sb) ;
    return NULL ;
  }
  bn->id = id++ ;
  memset(bn->data, 0, p_s_sb->s_blocksize) ;
  INIT_LIST_HEAD(&bn->list) ;
  return bn ;
}

static struct reiserfs_bitmap_node *
get_bitmap_node(struct super_block *p_s_sb) {
  struct reiserfs_journal *journal = SB_JOURNAL (p_s_sb);
  struct reiserfs_bitmap_node *bn = NULL;
  struct list_head *entry = journal->j_bitmap_nodes.next ;

  journal->j_used_bitmap_nodes++ ;
repeat:

  if(entry != &journal->j_bitmap_nodes) {
    bn = list_entry(entry, struct reiserfs_bitmap_node, list) ;
    list_del(entry) ;
    memset(bn->data, 0, p_s_sb->s_blocksize) ;
    journal->j_free_bitmap_nodes-- ;
    return bn ;
  }
  bn = allocate_bitmap_node(p_s_sb) ;
  if (!bn) {
    yield();
    goto repeat ;
  }
  return bn ;
}
static inline void free_bitmap_node(struct super_block *p_s_sb,
                                    struct reiserfs_bitmap_node *bn) {
  struct reiserfs_journal *journal = SB_JOURNAL (p_s_sb);
  journal->j_used_bitmap_nodes-- ;
  if (journal->j_free_bitmap_nodes > REISERFS_MAX_BITMAP_NODES) {
    reiserfs_kfree(bn->data, p_s_sb->s_blocksize, p_s_sb) ;
    reiserfs_kfree(bn, sizeof(struct reiserfs_bitmap_node), p_s_sb) ;
  } else {
    list_add(&bn->list, &journal->j_bitmap_nodes) ;
    journal->j_free_bitmap_nodes++ ;
  }
}

static void allocate_bitmap_nodes(struct super_block *p_s_sb) {
  int i ;
  struct reiserfs_journal *journal = SB_JOURNAL (p_s_sb);
  struct reiserfs_bitmap_node *bn = NULL ;
  for (i = 0 ; i < REISERFS_MIN_BITMAP_NODES ; i++) {
    bn = allocate_bitmap_node(p_s_sb) ;
    if (bn) {
      list_add(&bn->list, &journal->j_bitmap_nodes) ;
      journal->j_free_bitmap_nodes++ ;
    } else {
      break ; // this is ok, we'll try again when more are needed 
    }
  }
}

static int set_bit_in_list_bitmap(struct super_block *p_s_sb, int block,
                                  struct reiserfs_list_bitmap *jb) {
  int bmap_nr = block / (p_s_sb->s_blocksize << 3) ;
  int bit_nr = block % (p_s_sb->s_blocksize << 3) ;

  if (!jb->bitmaps[bmap_nr]) {
    jb->bitmaps[bmap_nr] = get_bitmap_node(p_s_sb) ;
  }
  set_bit(bit_nr, (unsigned long *)jb->bitmaps[bmap_nr]->data) ;
  return 0 ;
}

static void cleanup_bitmap_list(struct super_block *p_s_sb,
                                struct reiserfs_list_bitmap *jb) {
  int i;
  if (jb->bitmaps == NULL)
    return;

  for (i = 0 ; i < SB_BMAP_NR(p_s_sb) ; i++) {
    if (jb->bitmaps[i]) {
      free_bitmap_node(p_s_sb, jb->bitmaps[i]) ;
      jb->bitmaps[i] = NULL ;
    }
  }
}

/*
** only call this on FS unmount.
*/
static int free_list_bitmaps(struct super_block *p_s_sb,
                             struct reiserfs_list_bitmap *jb_array) {
  int i ;
  struct reiserfs_list_bitmap *jb ;
  for (i = 0 ; i < JOURNAL_NUM_BITMAPS ; i++) {
    jb = jb_array + i ;
    jb->journal_list = NULL ;
    cleanup_bitmap_list(p_s_sb, jb) ;
    vfree(jb->bitmaps) ;
    jb->bitmaps = NULL ;
  }
  return 0;
}

static int free_bitmap_nodes(struct super_block *p_s_sb) {
  struct reiserfs_journal *journal = SB_JOURNAL (p_s_sb);
  struct list_head *next = journal->j_bitmap_nodes.next ;
  struct reiserfs_bitmap_node *bn ;

  while(next != &journal->j_bitmap_nodes) {
    bn = list_entry(next, struct reiserfs_bitmap_node, list) ;
    list_del(next) ;
    reiserfs_kfree(bn->data, p_s_sb->s_blocksize, p_s_sb) ;
    reiserfs_kfree(bn, sizeof(struct reiserfs_bitmap_node), p_s_sb) ;
    next = journal->j_bitmap_nodes.next ;
    journal->j_free_bitmap_nodes-- ;
  }

  return 0 ;
}

/*
** get memory for JOURNAL_NUM_BITMAPS worth of bitmaps. 
** jb_array is the array to be filled in.
*/
int reiserfs_allocate_list_bitmaps(struct super_block *p_s_sb,
                                   struct reiserfs_list_bitmap *jb_array,
				   int bmap_nr) {
  int i ;
  int failed = 0 ;
  struct reiserfs_list_bitmap *jb ;
  int mem = bmap_nr * sizeof(struct reiserfs_bitmap_node *) ;

  for (i = 0 ; i < JOURNAL_NUM_BITMAPS ; i++) {
    jb = jb_array + i ;
    jb->journal_list = NULL ;
    jb->bitmaps = vmalloc( mem ) ;
    if (!jb->bitmaps) {
      reiserfs_warning(p_s_sb, "clm-2000, unable to allocate bitmaps for journal lists") ;
      failed = 1;   
      break ;
    }
    memset(jb->bitmaps, 0, mem) ;
  }
  if (failed) {
    free_list_bitmaps(p_s_sb, jb_array) ;
    return -1 ;
  }
  return 0 ;
}

/*
** find an available list bitmap.  If you can't find one, flush a commit list 
** and try again
*/
static struct reiserfs_list_bitmap *
get_list_bitmap(struct super_block *p_s_sb, struct reiserfs_journal_list *jl) {
  int i,j ; 
  struct reiserfs_journal *journal = SB_JOURNAL (p_s_sb);
  struct reiserfs_list_bitmap *jb = NULL ;

  for (j = 0 ; j < (JOURNAL_NUM_BITMAPS * 3) ; j++) {
    i = journal->j_list_bitmap_index ;
    journal->j_list_bitmap_index = (i + 1) % JOURNAL_NUM_BITMAPS ;
    jb = journal->j_list_bitmap + i ;
    if (journal->j_list_bitmap[i].journal_list) {
      flush_commit_list(p_s_sb, journal->j_list_bitmap[i].journal_list, 1) ;
      if (!journal->j_list_bitmap[i].journal_list) {
	break ;
      }
    } else {
      break ;
    }
  }
  if (jb->journal_list) { /* double check to make sure if flushed correctly */
    return NULL ;
  }
  jb->journal_list = jl ;
  return jb ;
}

/* 
** allocates a new chunk of X nodes, and links them all together as a list.
** Uses the cnode->next and cnode->prev pointers
** returns NULL on failure
*/
static struct reiserfs_journal_cnode *allocate_cnodes(int num_cnodes) {
  struct reiserfs_journal_cnode *head ;
  int i ;
  if (num_cnodes <= 0) {
    return NULL ;
  }
  head = vmalloc(num_cnodes * sizeof(struct reiserfs_journal_cnode)) ;
  if (!head) {
    return NULL ;
  }
  memset(head, 0, num_cnodes * sizeof(struct reiserfs_journal_cnode)) ;
  head[0].prev = NULL ;
  head[0].next = head + 1 ;
  for (i = 1 ; i < num_cnodes; i++) {
    head[i].prev = head + (i - 1) ;
    head[i].next = head + (i + 1) ; /* if last one, overwrite it after the if */
  }
  head[num_cnodes -1].next = NULL ;
  return head ;
}

/*
** pulls a cnode off the free list, or returns NULL on failure 
*/
static struct reiserfs_journal_cnode *get_cnode(struct super_block *p_s_sb) {
  struct reiserfs_journal_cnode *cn ;
  struct reiserfs_journal *journal = SB_JOURNAL (p_s_sb);

  reiserfs_check_lock_depth(p_s_sb, "get_cnode") ;

  if (journal->j_cnode_free <= 0) {
    return NULL ;
  }
  journal->j_cnode_used++ ;
  journal->j_cnode_free-- ;
  cn = journal->j_cnode_free_list ;
  if (!cn) {
    return cn ;
  }
  if (cn->next) {
    cn->next->prev = NULL ;
  }
  journal->j_cnode_free_list = cn->next ;
  memset(cn, 0, sizeof(struct reiserfs_journal_cnode)) ;
  return cn ;
}

/*
** returns a cnode to the free list 
*/
static void free_cnode(struct super_block *p_s_sb, struct reiserfs_journal_cnode *cn) {
  struct reiserfs_journal *journal = SB_JOURNAL (p_s_sb);

  reiserfs_check_lock_depth(p_s_sb, "free_cnode") ;

  journal->j_cnode_used-- ;
  journal->j_cnode_free++ ;
  /* memset(cn, 0, sizeof(struct reiserfs_journal_cnode)) ; */
  cn->next = journal->j_cnode_free_list ;
  if (journal->j_cnode_free_list) {
    journal->j_cnode_free_list->prev = cn ;
  }
  cn->prev = NULL ; /* not needed with the memset, but I might kill the memset, and forget to do this */
  journal->j_cnode_free_list = cn ;
}

static void clear_prepared_bits(struct buffer_head *bh) {
  clear_buffer_journal_prepared (bh);
  clear_buffer_journal_restore_dirty (bh);
}

/* utility function to force a BUG if it is called without the big
** kernel lock held.  caller is the string printed just before calling BUG()
*/
void reiserfs_check_lock_depth(struct super_block *sb, char *caller) {
#ifdef CONFIG_SMP
  if (current->lock_depth < 0) {
    reiserfs_panic (sb, "%s called without kernel lock held", caller) ;
  }
#else
  ;
#endif
}

/* return a cnode with same dev, block number and size in table, or null if not found */
static inline struct reiserfs_journal_cnode *
get_journal_hash_dev(struct super_block *sb,
		     struct reiserfs_journal_cnode **table,
		     long bl)
{
  struct reiserfs_journal_cnode *cn ;
  cn = journal_hash(table, sb, bl) ;
  while(cn) {
    if (cn->blocknr == bl && cn->sb == sb)
      return cn ;
    cn = cn->hnext ;
  }
  return (struct reiserfs_journal_cnode *)0 ;
}

/*
** this actually means 'can this block be reallocated yet?'.  If you set search_all, a block can only be allocated
** if it is not in the current transaction, was not freed by the current transaction, and has no chance of ever
** being overwritten by a replay after crashing.
**
** If you don't set search_all, a block can only be allocated if it is not in the current transaction.  Since deleting
** a block removes it from the current transaction, this case should never happen.  If you don't set search_all, make
** sure you never write the block without logging it.
**
** next_zero_bit is a suggestion about the next block to try for find_forward.
** when bl is rejected because it is set in a journal list bitmap, we search
** for the next zero bit in the bitmap that rejected bl.  Then, we return that
** through next_zero_bit for find_forward to try.
**
** Just because we return something in next_zero_bit does not mean we won't
** reject it on the next call to reiserfs_in_journal
**
*/
int reiserfs_in_journal(struct super_block *p_s_sb,
                        int bmap_nr, int bit_nr, int search_all, 
			b_blocknr_t *next_zero_bit) {
  struct reiserfs_journal *journal = SB_JOURNAL (p_s_sb);
  struct reiserfs_journal_cnode *cn ;
  struct reiserfs_list_bitmap *jb ;
  int i ;
  unsigned long bl;

  *next_zero_bit = 0 ; /* always start this at zero. */

  PROC_INFO_INC( p_s_sb, journal.in_journal );
  /* If we aren't doing a search_all, this is a metablock, and it will be logged before use.
  ** if we crash before the transaction that freed it commits,  this transaction won't
  ** have committed either, and the block will never be written
  */
  if (search_all) {
    for (i = 0 ; i < JOURNAL_NUM_BITMAPS ; i++) {
      PROC_INFO_INC( p_s_sb, journal.in_journal_bitmap );
      jb = journal->j_list_bitmap + i ;
      if (jb->journal_list && jb->bitmaps[bmap_nr] &&
          test_bit(bit_nr, (unsigned long *)jb->bitmaps[bmap_nr]->data)) {
	*next_zero_bit = find_next_zero_bit((unsigned long *)
	                             (jb->bitmaps[bmap_nr]->data),
	                             p_s_sb->s_blocksize << 3, bit_nr+1) ; 
	return 1 ;
      }
    }
  }

  bl = bmap_nr * (p_s_sb->s_blocksize << 3) + bit_nr;
  /* is it in any old transactions? */
  if (search_all && (cn = get_journal_hash_dev(p_s_sb, journal->j_list_hash_table, bl))) {
    return 1; 
  }

  /* is it in the current transaction.  This should never happen */
  if ((cn = get_journal_hash_dev(p_s_sb, journal->j_hash_table, bl))) {
    BUG();
    return 1; 
  }

  PROC_INFO_INC( p_s_sb, journal.in_journal_reusable );
  /* safe for reuse */
  return 0 ;
}

/* insert cn into table
*/
static inline void insert_journal_hash(struct reiserfs_journal_cnode **table, struct reiserfs_journal_cnode *cn) {
  struct reiserfs_journal_cnode *cn_orig ;

  cn_orig = journal_hash(table, cn->sb, cn->blocknr) ;
  cn->hnext = cn_orig ;
  cn->hprev = NULL ;
  if (cn_orig) {
    cn_orig->hprev = cn ;
  }
  journal_hash(table, cn->sb, cn->blocknr) =  cn ;
}

/* lock the current transaction */
inline static void lock_journal(struct super_block *p_s_sb) {
    PROC_INFO_INC( p_s_sb, journal.lock_journal );
    down(&SB_JOURNAL(p_s_sb)->j_lock);
}

/* unlock the current transaction */
inline static void unlock_journal(struct super_block *p_s_sb) {
    up(&SB_JOURNAL(p_s_sb)->j_lock);
}

static inline void get_journal_list(struct reiserfs_journal_list *jl)
{
    jl->j_refcount++;
}

static inline void put_journal_list(struct super_block *s,
                                   struct reiserfs_journal_list *jl)
{
    if (jl->j_refcount < 1) {
        reiserfs_panic (s, "trans id %lu, refcount at %d", jl->j_trans_id,
	                                         jl->j_refcount);
    }
    if (--jl->j_refcount == 0)
        reiserfs_kfree(jl, sizeof(struct reiserfs_journal_list), s);
}

/*
** this used to be much more involved, and I'm keeping it just in case things get ugly again.
** it gets called by flush_commit_list, and cleans up any data stored about blocks freed during a
** transaction.
*/
static void cleanup_freed_for_journal_list(struct super_block *p_s_sb, struct reiserfs_journal_list *jl) {

  struct reiserfs_list_bitmap *jb = jl->j_list_bitmap ;
  if (jb) {
    cleanup_bitmap_list(p_s_sb, jb) ;
  }
  jl->j_list_bitmap->journal_list = NULL ;
  jl->j_list_bitmap = NULL ;
}

static int journal_list_still_alive(struct super_block *s,
                                    unsigned long trans_id)
{
    struct reiserfs_journal *journal = SB_JOURNAL (s);
    struct list_head *entry = &journal->j_journal_list;
    struct reiserfs_journal_list *jl;

    if (!list_empty(entry)) {
        jl = JOURNAL_LIST_ENTRY(entry->next);
	if (jl->j_trans_id <= trans_id) {
	    return 1;
	}
    }
    return 0;
}

static void reiserfs_end_buffer_io_sync(struct buffer_head *bh, int uptodate) {
    char b[BDEVNAME_SIZE];

    if (buffer_journaled(bh)) {
        reiserfs_warning(NULL, "clm-2084: pinned buffer %lu:%s sent to disk",
	                 bh->b_blocknr, bdevname(bh->b_bdev, b)) ;
    }
    if (uptodate)
    	set_buffer_uptodate(bh) ;
    else
    	clear_buffer_uptodate(bh) ;
    unlock_buffer(bh) ;
    put_bh(bh) ;
}

static void reiserfs_end_ordered_io(struct buffer_head *bh, int uptodate) {
    if (uptodate)
    	set_buffer_uptodate(bh) ;
    else
    	clear_buffer_uptodate(bh) ;
    unlock_buffer(bh) ;
    put_bh(bh) ;
}

static void submit_logged_buffer(struct buffer_head *bh) {
    get_bh(bh) ;
    bh->b_end_io = reiserfs_end_buffer_io_sync ;
    clear_buffer_journal_new (bh);
    clear_buffer_dirty(bh) ;
    if (!test_clear_buffer_journal_test (bh))
        BUG();
    if (!buffer_uptodate(bh))
        BUG();
    submit_bh(WRITE, bh) ;
}

static void submit_ordered_buffer(struct buffer_head *bh) {
    get_bh(bh) ;
    bh->b_end_io = reiserfs_end_ordered_io;
    clear_buffer_dirty(bh) ;
    if (!buffer_uptodate(bh))
        BUG();
    submit_bh(WRITE, bh) ;
}

static int submit_barrier_buffer(struct buffer_head *bh) {
    get_bh(bh) ;
    bh->b_end_io = reiserfs_end_ordered_io;
    clear_buffer_dirty(bh) ;
    if (!buffer_uptodate(bh))
        BUG();
    return submit_bh(WRITE_BARRIER, bh) ;
}

static void check_barrier_completion(struct super_block *s,
                                     struct buffer_head *bh) {
    if (buffer_eopnotsupp(bh)) {
	clear_buffer_eopnotsupp(bh);
	disable_barrier(s);
	set_buffer_uptodate(bh);
	set_buffer_dirty(bh);
	sync_dirty_buffer(bh);
    }
}

#define CHUNK_SIZE 32
struct buffer_chunk {
    struct buffer_head *bh[CHUNK_SIZE];
    int nr;
};

static void write_chunk(struct buffer_chunk *chunk) {
    int i;
    for (i = 0; i < chunk->nr ; i++) {
	submit_logged_buffer(chunk->bh[i]) ;
    }
    chunk->nr = 0;
}

static void write_ordered_chunk(struct buffer_chunk *chunk) {
    int i;
    for (i = 0; i < chunk->nr ; i++) {
	submit_ordered_buffer(chunk->bh[i]) ;
    }
    chunk->nr = 0;
}

static int add_to_chunk(struct buffer_chunk *chunk, struct buffer_head *bh,
			 spinlock_t *lock,
			 void (fn)(struct buffer_chunk *))
{
    int ret = 0;
    if (chunk->nr >= CHUNK_SIZE)
        BUG();
    chunk->bh[chunk->nr++] = bh;
    if (chunk->nr >= CHUNK_SIZE) {
	ret = 1;
        if (lock)
	    spin_unlock(lock);
        fn(chunk);
        if (lock)
	    spin_lock(lock);
    }
    return ret;
}


static atomic_t nr_reiserfs_jh = ATOMIC_INIT(0);
static struct reiserfs_jh *alloc_jh(void) {
    struct reiserfs_jh *jh;
    while(1) {
	jh = kmalloc(sizeof(*jh), GFP_NOFS);
	if (jh) {
	    atomic_inc(&nr_reiserfs_jh);
	    return jh;
	}
        yield();
    }
}

/*
 * we want to free the jh when the buffer has been written
 * and waited on
 */
void reiserfs_free_jh(struct buffer_head *bh) {
    struct reiserfs_jh *jh;

    jh = bh->b_private;
    if (jh) {
	bh->b_private = NULL;
	jh->bh = NULL;
	list_del_init(&jh->list);
	kfree(jh);
	if (atomic_read(&nr_reiserfs_jh) <= 0)
	    BUG();
	atomic_dec(&nr_reiserfs_jh);
	put_bh(bh);
    }
}

static inline int __add_jh(struct reiserfs_journal *j, struct buffer_head *bh,
                           int tail)
{
    struct reiserfs_jh *jh;

    if (bh->b_private) {
	spin_lock(&j->j_dirty_buffers_lock);
	if (!bh->b_private) {
	    spin_unlock(&j->j_dirty_buffers_lock);
	    goto no_jh;
	}
        jh = bh->b_private;
	list_del_init(&jh->list);
    } else {
no_jh:
	get_bh(bh);
	jh = alloc_jh();
	spin_lock(&j->j_dirty_buffers_lock);
	/* buffer must be locked for __add_jh, should be able to have
	 * two adds at the same time
	 */
	if (bh->b_private)
	    BUG();
	jh->bh = bh;
	bh->b_private = jh;
    }
    jh->jl = j->j_current_jl;
    if (tail)
	list_add_tail(&jh->list, &jh->jl->j_tail_bh_list);
    else {
	list_add_tail(&jh->list, &jh->jl->j_bh_list);
    }
    spin_unlock(&j->j_dirty_buffers_lock);
    return 0;
}

int reiserfs_add_tail_list(struct inode *inode, struct buffer_head *bh) {
    return __add_jh(SB_JOURNAL(inode->i_sb), bh, 1);
}
int reiserfs_add_ordered_list(struct inode *inode, struct buffer_head *bh) {
    return __add_jh(SB_JOURNAL(inode->i_sb), bh, 0);
}

#define JH_ENTRY(l) list_entry((l), struct reiserfs_jh, list)
static int write_ordered_buffers(spinlock_t *lock,
				 struct reiserfs_journal *j,
                                 struct reiserfs_journal_list *jl,
				 struct list_head *list)
{
    struct buffer_head *bh;
    struct reiserfs_jh *jh;
    int ret = j->j_errno;
    struct buffer_chunk chunk;
    struct list_head tmp;
    INIT_LIST_HEAD(&tmp);

    chunk.nr = 0;
    spin_lock(lock);
    while(!list_empty(list)) {
        jh = JH_ENTRY(list->next);
	bh = jh->bh;
	get_bh(bh);
	if (test_set_buffer_locked(bh)) {
	    if (!buffer_dirty(bh)) {
		list_del_init(&jh->list);
		list_add(&jh->list, &tmp);
		goto loop_next;
	    }
	    spin_unlock(lock);
	    if (chunk.nr)
		write_ordered_chunk(&chunk);
	    wait_on_buffer(bh);
	    cond_resched();
	    spin_lock(lock);
	    goto loop_next;
        }
	if (buffer_dirty(bh)) {
	    list_del_init(&jh->list);
	    list_add(&jh->list, &tmp);
            add_to_chunk(&chunk, bh, lock, write_ordered_chunk);
	} else {
	    reiserfs_free_jh(bh);
	    unlock_buffer(bh);
	}
loop_next:
	put_bh(bh);
	cond_resched_lock(lock);
    }
    if (chunk.nr) {
	spin_unlock(lock);
        write_ordered_chunk(&chunk);
	spin_lock(lock);
    }
    while(!list_empty(&tmp)) {
        jh = JH_ENTRY(tmp.prev);
	bh = jh->bh;
	get_bh(bh);
	reiserfs_free_jh(bh);

	if (buffer_locked(bh)) {
	    spin_unlock(lock);
	    wait_on_buffer(bh);
	    spin_lock(lock);
	}
	if (!buffer_uptodate(bh)) {
	    ret = -EIO;
        }
	put_bh(bh);
	cond_resched_lock(lock);
    }
    spin_unlock(lock);
    return ret;
}

static int flush_older_commits(struct super_block *s, struct reiserfs_journal_list *jl) {
    struct reiserfs_journal *journal = SB_JOURNAL (s);
    struct reiserfs_journal_list *other_jl;
    struct reiserfs_journal_list *first_jl;
    struct list_head *entry;
    unsigned long trans_id = jl->j_trans_id;
    unsigned long other_trans_id;
    unsigned long first_trans_id;

find_first:
    /*
     * first we walk backwards to find the oldest uncommitted transation
     */
    first_jl = jl;
    entry = jl->j_list.prev;
    while(1) {
	other_jl = JOURNAL_LIST_ENTRY(entry);
	if (entry == &journal->j_journal_list ||
	    atomic_read(&other_jl->j_older_commits_done))
	    break;

        first_jl = other_jl;
	entry = other_jl->j_list.prev;
    }

    /* if we didn't find any older uncommitted transactions, return now */
    if (first_jl == jl) {
        return 0;
    }

    first_trans_id = first_jl->j_trans_id;

    entry = &first_jl->j_list;
    while(1) {
	other_jl = JOURNAL_LIST_ENTRY(entry);
	other_trans_id = other_jl->j_trans_id;

	if (other_trans_id < trans_id) {
	    if (atomic_read(&other_jl->j_commit_left) != 0) {
		flush_commit_list(s, other_jl, 0);

		/* list we were called with is gone, return */
		if (!journal_list_still_alive(s, trans_id))
		    return 1;

		/* the one we just flushed is gone, this means all
		 * older lists are also gone, so first_jl is no longer
		 * valid either.  Go back to the beginning.
		 */
		if (!journal_list_still_alive(s, other_trans_id)) {
		    goto find_first;
		}
	    }
	    entry = entry->next;
	    if (entry == &journal->j_journal_list)
		return 0;
	} else {
	    return 0;
	}
    }
    return 0;
}
int reiserfs_async_progress_wait(struct super_block *s) {
    DEFINE_WAIT(wait);
    struct reiserfs_journal *j = SB_JOURNAL(s);
    if (atomic_read(&j->j_async_throttle))
    	blk_congestion_wait(WRITE, HZ/10);
    return 0;
}

/*
** if this journal list still has commit blocks unflushed, send them to disk.
**
** log areas must be flushed in order (transaction 2 can't commit before transaction 1)
** Before the commit block can by written, every other log block must be safely on disk
**
*/
static int flush_commit_list(struct super_block *s, struct reiserfs_journal_list *jl, int flushall) {
  int i;
  int bn ;
  struct buffer_head *tbh = NULL ;
  unsigned long trans_id = jl->j_trans_id;
  struct reiserfs_journal *journal = SB_JOURNAL (s);
  int barrier = 0;
  int retval = 0;

  reiserfs_check_lock_depth(s, "flush_commit_list") ;

  if (atomic_read(&jl->j_older_commits_done)) {
    return 0 ;
  }

  /* before we can put our commit blocks on disk, we have to make sure everyone older than
  ** us is on disk too
  */
  BUG_ON (jl->j_len <= 0);
  BUG_ON (trans_id == journal->j_trans_id);

  get_journal_list(jl);
  if (flushall) {
    if (flush_older_commits(s, jl) == 1) {
      /* list disappeared during flush_older_commits.  return */
      goto put_jl;
    }
  }

  /* make sure nobody is trying to flush this one at the same time */
  down(&jl->j_commit_lock);
  if (!journal_list_still_alive(s, trans_id)) {
    up(&jl->j_commit_lock);
    goto put_jl;
  }
  BUG_ON (jl->j_trans_id == 0);

  /* this commit is done, exit */
  if (atomic_read(&(jl->j_commit_left)) <= 0) {
    if (flushall) {
      atomic_set(&(jl->j_older_commits_done), 1) ;
    }
    up(&jl->j_commit_lock);
    goto put_jl;
  }

  if (!list_empty(&jl->j_bh_list)) {
      unlock_kernel();
      write_ordered_buffers(&journal->j_dirty_buffers_lock,
                            journal, jl, &jl->j_bh_list);
      lock_kernel();
  }
  BUG_ON (!list_empty(&jl->j_bh_list));
  /*
   * for the description block and all the log blocks, submit any buffers
   * that haven't already reached the disk
   */
  atomic_inc(&journal->j_async_throttle);
  for (i = 0 ; i < (jl->j_len + 1) ; i++) {
    bn = SB_ONDISK_JOURNAL_1st_BLOCK(s) + (jl->j_start+i) %
         SB_ONDISK_JOURNAL_SIZE(s);
    tbh = journal_find_get_block(s, bn) ;
    if (buffer_dirty(tbh)) /* redundant, ll_rw_block() checks */
	ll_rw_block(WRITE, 1, &tbh) ;
    put_bh(tbh) ;
  }
  atomic_dec(&journal->j_async_throttle);

  /* wait on everything written so far before writing the commit
   * if we are in barrier mode, send the commit down now
   */
  barrier = reiserfs_barrier_flush(s);
  if (barrier) {
      int ret;
      lock_buffer(jl->j_commit_bh);
      ret = submit_barrier_buffer(jl->j_commit_bh);
      if (ret == -EOPNOTSUPP) {
	  set_buffer_uptodate(jl->j_commit_bh);
          disable_barrier(s);
	  barrier = 0;
      }
  }
  for (i = 0 ;  i < (jl->j_len + 1) ; i++) {
    bn = SB_ONDISK_JOURNAL_1st_BLOCK(s) +
	 (jl->j_start + i) % SB_ONDISK_JOURNAL_SIZE(s) ;
    tbh = journal_find_get_block(s, bn) ;
    wait_on_buffer(tbh) ;
    // since we're using ll_rw_blk above, it might have skipped over
    // a locked buffer.  Double check here
    //
    if (buffer_dirty(tbh)) /* redundant, sync_dirty_buffer() checks */
      sync_dirty_buffer(tbh);
    if (unlikely (!buffer_uptodate(tbh))) {
#ifdef CONFIG_REISERFS_CHECK
      reiserfs_warning(s, "journal-601, buffer write failed") ;
#endif
      retval = -EIO;
    }
    put_bh(tbh) ; /* once for journal_find_get_block */
    put_bh(tbh) ;    /* once due to original getblk in do_journal_end */
    atomic_dec(&(jl->j_commit_left)) ;
  }

  BUG_ON (atomic_read(&(jl->j_commit_left)) != 1);

  if (!barrier) {
      if (buffer_dirty(jl->j_commit_bh))
	BUG();
      mark_buffer_dirty(jl->j_commit_bh) ;
      sync_dirty_buffer(jl->j_commit_bh) ;
  } else
      wait_on_buffer(jl->j_commit_bh);

  check_barrier_completion(s, jl->j_commit_bh);

  /* If there was a write error in the journal - we can't commit this
   * transaction - it will be invalid and, if successful, will just end
   * up propogating the write error out to the filesystem. */
  if (unlikely (!buffer_uptodate(jl->j_commit_bh))) {
#ifdef CONFIG_REISERFS_CHECK
    reiserfs_warning(s, "journal-615: buffer write failed") ;
#endif
    retval = -EIO;
  }
  bforget(jl->j_commit_bh) ;
  if (journal->j_last_commit_id != 0 &&
     (jl->j_trans_id - journal->j_last_commit_id) != 1) {
      reiserfs_warning(s, "clm-2200: last commit %lu, current %lu",
                       journal->j_last_commit_id,
		       jl->j_trans_id);
  }
  journal->j_last_commit_id = jl->j_trans_id;

  /* now, every commit block is on the disk.  It is safe to allow blocks freed during this transaction to be reallocated */
  cleanup_freed_for_journal_list(s, jl) ;

  retval = retval ? retval : journal->j_errno;

  /* mark the metadata dirty */
  if (!retval)
    dirty_one_transaction(s, jl);
  atomic_dec(&(jl->j_commit_left)) ;

  if (flushall) {
    atomic_set(&(jl->j_older_commits_done), 1) ;
  }
  up(&jl->j_commit_lock);
put_jl:
  put_journal_list(s, jl);

  if (retval)
    reiserfs_abort (s, retval, "Journal write error in %s", __FUNCTION__);
  return retval;
}

/*
** flush_journal_list frequently needs to find a newer transaction for a given block.  This does that, or 
** returns NULL if it can't find anything 
*/
static struct reiserfs_journal_list *find_newer_jl_for_cn(struct reiserfs_journal_cnode *cn) {
  struct super_block *sb = cn->sb;
  b_blocknr_t blocknr = cn->blocknr ;

  cn = cn->hprev ;
  while(cn) {
    if (cn->sb == sb && cn->blocknr == blocknr && cn->jlist) {
      return cn->jlist ;
    }
    cn = cn->hprev ;
  }
  return NULL ;
}

static void remove_journal_hash(struct super_block *, struct reiserfs_journal_cnode **,
struct reiserfs_journal_list *, unsigned long, int);

/*
** once all the real blocks have been flushed, it is safe to remove them from the
** journal list for this transaction.  Aside from freeing the cnode, this also allows the
** block to be reallocated for data blocks if it had been deleted.
*/
static void remove_all_from_journal_list(struct super_block *p_s_sb, struct reiserfs_journal_list *jl, int debug) {
  struct reiserfs_journal *journal = SB_JOURNAL (p_s_sb);
  struct reiserfs_journal_cnode *cn, *last ;
  cn = jl->j_realblock ;

  /* which is better, to lock once around the whole loop, or
  ** to lock for each call to remove_journal_hash?
  */
  while(cn) {
    if (cn->blocknr != 0) {
      if (debug) {
       reiserfs_warning (p_s_sb, "block %u, bh is %d, state %ld", cn->blocknr,
                         cn->bh ? 1: 0, cn->state) ;
      }
      cn->state = 0 ;
      remove_journal_hash(p_s_sb, journal->j_list_hash_table, jl, cn->blocknr, 1) ;
    }
    last = cn ;
    cn = cn->next ;
    free_cnode(p_s_sb, last) ;
  }
  jl->j_realblock = NULL ;
}

/*
** if this timestamp is greater than the timestamp we wrote last to the header block, write it to the header block.
** once this is done, I can safely say the log area for this transaction won't ever be replayed, and I can start
** releasing blocks in this transaction for reuse as data blocks.
** called by flush_journal_list, before it calls remove_all_from_journal_list
**
*/
static int _update_journal_header_block(struct super_block *p_s_sb, unsigned long offset, unsigned long trans_id) {
  struct reiserfs_journal_header *jh ;
  struct reiserfs_journal *journal = SB_JOURNAL (p_s_sb);

  if (reiserfs_is_journal_aborted (journal))
    return -EIO;

  if (trans_id >= journal->j_last_flush_trans_id) {
    if (buffer_locked((journal->j_header_bh)))  {
      wait_on_buffer((journal->j_header_bh)) ;
      if (unlikely (!buffer_uptodate(journal->j_header_bh))) {
#ifdef CONFIG_REISERFS_CHECK
        reiserfs_warning (p_s_sb, "journal-699: buffer write failed") ;
#endif
        return -EIO;
      }
    }
    journal->j_last_flush_trans_id = trans_id ;
    journal->j_first_unflushed_offset = offset ;
    jh = (struct reiserfs_journal_header *)(journal->j_header_bh->b_data) ;
    jh->j_last_flush_trans_id = cpu_to_le32(trans_id) ;
    jh->j_first_unflushed_offset = cpu_to_le32(offset) ;
    jh->j_mount_id = cpu_to_le32(journal->j_mount_id) ;

    if (reiserfs_barrier_flush(p_s_sb)) {
	int ret;
	lock_buffer(journal->j_header_bh);
	ret = submit_barrier_buffer(journal->j_header_bh);
	if (ret == -EOPNOTSUPP) {
	    set_buffer_uptodate(journal->j_header_bh);
	    disable_barrier(p_s_sb);
	    goto sync;
	}
	wait_on_buffer(journal->j_header_bh);
	check_barrier_completion(p_s_sb, journal->j_header_bh);
    } else {
sync:
	set_buffer_dirty(journal->j_header_bh) ;
	sync_dirty_buffer(journal->j_header_bh) ;
    }
    if (!buffer_uptodate(journal->j_header_bh)) {
      reiserfs_warning (p_s_sb, "journal-837: IO error during journal replay");
      return -EIO ;
    }
  }
  return 0 ;
}

static int update_journal_header_block(struct super_block *p_s_sb, 
                                       unsigned long offset, 
				       unsigned long trans_id) {
    return _update_journal_header_block(p_s_sb, offset, trans_id);
}
/* 
** flush any and all journal lists older than you are 
** can only be called from flush_journal_list
*/
static int flush_older_journal_lists(struct super_block *p_s_sb,
                                     struct reiserfs_journal_list *jl)
{
    struct list_head *entry;
    struct reiserfs_journal_list *other_jl ;
    struct reiserfs_journal *journal = SB_JOURNAL (p_s_sb);
    unsigned long trans_id = jl->j_trans_id;

    /* we know we are the only ones flushing things, no extra race
     * protection is required.
     */
restart:
    entry = journal->j_journal_list.next;
    /* Did we wrap? */
    if (entry == &journal->j_journal_list)
        return 0;
    other_jl = JOURNAL_LIST_ENTRY(entry);
    if (other_jl->j_trans_id < trans_id) {
        BUG_ON (other_jl->j_refcount <= 0);
	/* do not flush all */
	flush_journal_list(p_s_sb, other_jl, 0) ;

	/* other_jl is now deleted from the list */
	goto restart;
    }
    return 0 ;
}

static void del_from_work_list(struct super_block *s,
                               struct reiserfs_journal_list *jl) {
    struct reiserfs_journal *journal = SB_JOURNAL (s);
    if (!list_empty(&jl->j_working_list)) {
	list_del_init(&jl->j_working_list);
	journal->j_num_work_lists--;
    }
}

/* flush a journal list, both commit and real blocks
**
** always set flushall to 1, unless you are calling from inside
** flush_journal_list
**
** IMPORTANT.  This can only be called while there are no journal writers, 
** and the journal is locked.  That means it can only be called from 
** do_journal_end, or by journal_release
*/
static int flush_journal_list(struct super_block *s, 
                              struct reiserfs_journal_list *jl, int flushall) {
  struct reiserfs_journal_list *pjl ;
  struct reiserfs_journal_cnode *cn, *last ;
  int count ;
  int was_jwait = 0 ;
  int was_dirty = 0 ;
  struct buffer_head *saved_bh ; 
  unsigned long j_len_saved = jl->j_len ;
  struct reiserfs_journal *journal = SB_JOURNAL (s);
  int err = 0;

  BUG_ON (j_len_saved <= 0);

  if (atomic_read(&journal->j_wcount) != 0) {
    reiserfs_warning(s, "clm-2048: flush_journal_list called with wcount %d",
                      atomic_read(&journal->j_wcount)) ;
  }
  BUG_ON (jl->j_trans_id == 0);

  /* if flushall == 0, the lock is already held */
  if (flushall) {
      down(&journal->j_flush_sem);
  } else if (!down_trylock(&journal->j_flush_sem)) {
      BUG();
  }

  count = 0 ;
  if (j_len_saved > journal->j_trans_max) {
    reiserfs_panic(s, "journal-715: flush_journal_list, length is %lu, trans id %lu\n", j_len_saved, jl->j_trans_id);
    return 0 ;
  }

  /* if all the work is already done, get out of here */
  if (atomic_read(&(jl->j_nonzerolen)) <= 0 && 
      atomic_read(&(jl->j_commit_left)) <= 0) {
    goto flush_older_and_return ;
  } 

  /* start by putting the commit list on disk.  This will also flush 
  ** the commit lists of any olders transactions
  */
  flush_commit_list(s, jl, 1) ;

  if (!(jl->j_state & LIST_DIRTY) && !reiserfs_is_journal_aborted (journal))
      BUG();

  /* are we done now? */
  if (atomic_read(&(jl->j_nonzerolen)) <= 0 && 
      atomic_read(&(jl->j_commit_left)) <= 0) {
    goto flush_older_and_return ;
  }

  /* loop through each cnode, see if we need to write it, 
  ** or wait on a more recent transaction, or just ignore it 
  */
  if (atomic_read(&(journal->j_wcount)) != 0) {
    reiserfs_panic(s, "journal-844: panic journal list is flushing, wcount is not 0\n") ;
  }
  cn = jl->j_realblock ;
  while(cn) {
    was_jwait = 0 ;
    was_dirty = 0 ;
    saved_bh = NULL ;
    /* blocknr of 0 is no longer in the hash, ignore it */
    if (cn->blocknr == 0) {
      goto free_cnode ;
    }

    /* This transaction failed commit. Don't write out to the disk */
    if (!(jl->j_state & LIST_DIRTY))
        goto free_cnode;

    pjl = find_newer_jl_for_cn(cn) ;
    /* the order is important here.  We check pjl to make sure we
    ** don't clear BH_JDirty_wait if we aren't the one writing this
    ** block to disk
    */
    if (!pjl && cn->bh) {
      saved_bh = cn->bh ;

      /* we do this to make sure nobody releases the buffer while 
      ** we are working with it 
      */
      get_bh(saved_bh) ;

      if (buffer_journal_dirty(saved_bh)) {
        BUG_ON (!can_dirty (cn));
        was_jwait = 1 ;
        was_dirty = 1 ;
      } else if (can_dirty(cn)) {
        /* everything with !pjl && jwait should be writable */
	BUG();
      }
    }

    /* if someone has this block in a newer transaction, just make
    ** sure they are commited, and don't try writing it to disk
    */
    if (pjl) {
      if (atomic_read(&pjl->j_commit_left))
        flush_commit_list(s, pjl, 1) ;
      goto free_cnode ;
    }

    /* bh == NULL when the block got to disk on its own, OR, 
    ** the block got freed in a future transaction 
    */
    if (saved_bh == NULL) {
      goto free_cnode ;
    }

    /* this should never happen.  kupdate_one_transaction has this list
    ** locked while it works, so we should never see a buffer here that
    ** is not marked JDirty_wait
    */
    if ((!was_jwait) && !buffer_locked(saved_bh)) {
	reiserfs_warning (s, "journal-813: BAD! buffer %llu %cdirty %cjwait, "
			  "not in a newer tranasction",
			  (unsigned long long)saved_bh->b_blocknr,
			  was_dirty ? ' ' : '!', was_jwait ? ' ' : '!') ;
    }
    if (was_dirty) { 
      /* we inc again because saved_bh gets decremented at free_cnode */
      get_bh(saved_bh) ;
      set_bit(BLOCK_NEEDS_FLUSH, &cn->state) ;
      lock_buffer(saved_bh);
      BUG_ON (cn->blocknr != saved_bh->b_blocknr);
      if (buffer_dirty(saved_bh))
        submit_logged_buffer(saved_bh) ;
      else
        unlock_buffer(saved_bh);
      count++ ;
    } else {
      reiserfs_warning (s, "clm-2082: Unable to flush buffer %llu in %s",
                        (unsigned long long)saved_bh->b_blocknr, __FUNCTION__);
    }
free_cnode:
    last = cn ;
    cn = cn->next ;
    if (saved_bh) {
      /* we incremented this to keep others from taking the buffer head away */
      put_bh(saved_bh) ;
      if (atomic_read(&(saved_bh->b_count)) < 0) {
        reiserfs_warning (s, "journal-945: saved_bh->b_count < 0");
      }
    }
  }
  if (count > 0) {
    cn = jl->j_realblock ;
    while(cn) {
      if (test_bit(BLOCK_NEEDS_FLUSH, &cn->state)) {
	if (!cn->bh) {
	  reiserfs_panic(s, "journal-1011: cn->bh is NULL\n") ;
	}
	wait_on_buffer(cn->bh) ;
	if (!cn->bh) {
	  reiserfs_panic(s, "journal-1012: cn->bh is NULL\n") ;
	}
	if (unlikely (!buffer_uptodate(cn->bh))) {
#ifdef CONFIG_REISERFS_CHECK
	  reiserfs_warning(s, "journal-949: buffer write failed\n") ;
#endif
          err = -EIO;
  	}
	/* note, we must clear the JDirty_wait bit after the up to date
	** check, otherwise we race against our flushpage routine
	*/
        BUG_ON (!test_clear_buffer_journal_dirty (cn->bh));

        /* undo the inc from journal_mark_dirty */
	put_bh(cn->bh) ;
        brelse(cn->bh) ;
      }
      cn = cn->next ;
    }
  }

  if (err)
    reiserfs_abort (s, -EIO, "Write error while pushing transaction to disk in %s", __FUNCTION__);
flush_older_and_return:


  /* before we can update the journal header block, we _must_ flush all 
  ** real blocks from all older transactions to disk.  This is because
  ** once the header block is updated, this transaction will not be
  ** replayed after a crash
  */
  if (flushall) {
    flush_older_journal_lists(s, jl);
  } 
  
  err = journal->j_errno;
  /* before we can remove everything from the hash tables for this 
  ** transaction, we must make sure it can never be replayed
  **
  ** since we are only called from do_journal_end, we know for sure there
  ** are no allocations going on while we are flushing journal lists.  So,
  ** we only need to update the journal header block for the last list
  ** being flushed
  */
  if (!err && flushall) {
    err = update_journal_header_block(s, (jl->j_start + jl->j_len + 2) % SB_ONDISK_JOURNAL_SIZE(s), jl->j_trans_id) ;
    if (err)
        reiserfs_abort (s, -EIO, "Write error while updating journal header in %s", __FUNCTION__);
  }
  remove_all_from_journal_list(s, jl, 0) ;
  list_del_init(&jl->j_list);
  journal->j_num_lists--;
  del_from_work_list(s, jl);

  if (journal->j_last_flush_id != 0 &&
     (jl->j_trans_id - journal->j_last_flush_id) != 1) {
      reiserfs_warning(s, "clm-2201: last flush %lu, current %lu",
                       journal->j_last_flush_id,
		       jl->j_trans_id);
  }
  journal->j_last_flush_id = jl->j_trans_id;

  /* not strictly required since we are freeing the list, but it should
   * help find code using dead lists later on
   */
  jl->j_len = 0 ;
  atomic_set(&(jl->j_nonzerolen), 0) ;
  jl->j_start = 0 ;
  jl->j_realblock = NULL ;
  jl->j_commit_bh = NULL ;
  jl->j_trans_id = 0 ;
  jl->j_state = 0;
  put_journal_list(s, jl);
  if (flushall)
    up(&journal->j_flush_sem);
  return err ;
} 

static int write_one_transaction(struct super_block *s,
                                 struct reiserfs_journal_list *jl,
				 struct buffer_chunk *chunk)
{
    struct reiserfs_journal_cnode *cn;
    int ret = 0 ;

    jl->j_state |= LIST_TOUCHED;
    del_from_work_list(s, jl);
    if (jl->j_len == 0 || atomic_read(&jl->j_nonzerolen) == 0) {
        return 0;
    }

    cn = jl->j_realblock ;
    while(cn) {
        /* if the blocknr == 0, this has been cleared from the hash,
        ** skip it
        */
        if (cn->blocknr == 0) {
            goto next ;
        }
        if (cn->bh && can_dirty(cn) && buffer_dirty(cn->bh)) {
	    struct buffer_head *tmp_bh;
	    /* we can race against journal_mark_freed when we try
	     * to lock_buffer(cn->bh), so we have to inc the buffer
	     * count, and recheck things after locking
	     */
	    tmp_bh = cn->bh;
	    get_bh(tmp_bh);
	    lock_buffer(tmp_bh);
	    if (cn->bh && can_dirty(cn) && buffer_dirty(tmp_bh)) {
		if (!buffer_journal_dirty(tmp_bh) ||
		    buffer_journal_prepared(tmp_bh))
		    BUG();
		add_to_chunk(chunk, tmp_bh, NULL, write_chunk);
		ret++;
	    } else {
		/* note, cn->bh might be null now */
		unlock_buffer(tmp_bh);
	    }
	    put_bh(tmp_bh);
        }
next:
        cn = cn->next ;
	cond_resched();
    }
    return ret ;
}

/* used by flush_commit_list */
static int dirty_one_transaction(struct super_block *s,
                                 struct reiserfs_journal_list *jl)
{
    struct reiserfs_journal_cnode *cn;
    struct reiserfs_journal_list *pjl;
    int ret = 0 ;

    jl->j_state |= LIST_DIRTY;
    cn = jl->j_realblock ;
    while(cn) {
        /* look for a more recent transaction that logged this
        ** buffer.  Only the most recent transaction with a buffer in
        ** it is allowed to send that buffer to disk
        */
	pjl = find_newer_jl_for_cn(cn) ;
        if (!pjl && cn->blocknr && cn->bh && buffer_journal_dirty(cn->bh))
	{
	    BUG_ON (!can_dirty(cn));
	    /* if the buffer is prepared, it will either be logged
	     * or restored.  If restored, we need to make sure
	     * it actually gets marked dirty
	     */
            clear_buffer_journal_new (cn->bh);
            if (buffer_journal_prepared (cn->bh)) {
                set_buffer_journal_restore_dirty (cn->bh);
	    } else {
                set_buffer_journal_test (cn->bh);
	        mark_buffer_dirty(cn->bh);
	    }
        } 
        cn = cn->next ;
    }
    return ret ;
}

static int kupdate_transactions(struct super_block *s,
                                   struct reiserfs_journal_list *jl,
				   struct reiserfs_journal_list **next_jl,
				   unsigned long *next_trans_id,
				   int num_blocks,
				   int num_trans) {
    int ret = 0;
    int written = 0 ;
    int transactions_flushed = 0;
    unsigned long orig_trans_id = jl->j_trans_id;
    struct buffer_chunk chunk;
    struct list_head *entry;
    struct reiserfs_journal *journal = SB_JOURNAL (s);
    chunk.nr = 0;

    down(&journal->j_flush_sem);
    if (!journal_list_still_alive(s, orig_trans_id)) {
	goto done;
    }

    /* we've got j_flush_sem held, nobody is going to delete any
     * of these lists out from underneath us
     */
    while((num_trans && transactions_flushed < num_trans) ||
          (!num_trans && written < num_blocks)) {

	if (jl->j_len == 0 || (jl->j_state & LIST_TOUCHED) ||
	    atomic_read(&jl->j_commit_left) || !(jl->j_state & LIST_DIRTY))
	{
	    del_from_work_list(s, jl);
	    break;
	}
	ret = write_one_transaction(s, jl, &chunk);

	if (ret < 0)
	    goto done;
	transactions_flushed++;
	written += ret;
	entry = jl->j_list.next;

	/* did we wrap? */
	if (entry == &journal->j_journal_list) {
	    break;
        }
	jl = JOURNAL_LIST_ENTRY(entry);

	/* don't bother with older transactions */
	if (jl->j_trans_id <= orig_trans_id)
	    break;
    }
    if (chunk.nr) {
        write_chunk(&chunk);
    }

done:
    up(&journal->j_flush_sem);
    return ret;
}

/* for o_sync and fsync heavy applications, they tend to use
** all the journa list slots with tiny transactions.  These
** trigger lots and lots of calls to update the header block, which
** adds seeks and slows things down.
**
** This function tries to clear out a large chunk of the journal lists
** at once, which makes everything faster since only the newest journal
** list updates the header block
*/
static int flush_used_journal_lists(struct super_block *s,
                                    struct reiserfs_journal_list *jl) {
    unsigned long len = 0;
    unsigned long cur_len;
    int ret;
    int i;
    int limit = 256;
    struct reiserfs_journal_list *tjl;
    struct reiserfs_journal_list *flush_jl;
    unsigned long trans_id;
    struct reiserfs_journal *journal = SB_JOURNAL (s);

    flush_jl = tjl = jl;

    /* in data logging mode, try harder to flush a lot of blocks */
    if (reiserfs_data_log(s))
	limit = 1024;
    /* flush for 256 transactions or limit blocks, whichever comes first */
    for(i = 0 ; i < 256 && len < limit ; i++) {
	if (atomic_read(&tjl->j_commit_left) ||
	    tjl->j_trans_id < jl->j_trans_id) {
	    break;
	}
	cur_len = atomic_read(&tjl->j_nonzerolen);
	if (cur_len > 0) {
	    tjl->j_state &= ~LIST_TOUCHED;
	}
	len += cur_len;
	flush_jl = tjl;
	if (tjl->j_list.next == &journal->j_journal_list)
	    break;
	tjl = JOURNAL_LIST_ENTRY(tjl->j_list.next);
    }
    /* try to find a group of blocks we can flush across all the
    ** transactions, but only bother if we've actually spanned
    ** across multiple lists
    */
    if (flush_jl != jl) {
        ret = kupdate_transactions(s, jl, &tjl, &trans_id, len, i);
    }
    flush_journal_list(s, flush_jl, 1);
    return 0;
}

/*
** removes any nodes in table with name block and dev as bh.
** only touchs the hnext and hprev pointers.
*/
void remove_journal_hash(struct super_block *sb,
			struct reiserfs_journal_cnode **table,
			struct reiserfs_journal_list *jl,
			unsigned long block, int remove_freed)
{
  struct reiserfs_journal_cnode *cur ;
  struct reiserfs_journal_cnode **head ;

  head= &(journal_hash(table, sb, block)) ;
  if (!head) {
    return ;
  }
  cur = *head ;
  while(cur) {
    if (cur->blocknr == block && cur->sb == sb && (jl == NULL || jl == cur->jlist) && 
        (!test_bit(BLOCK_FREED, &cur->state) || remove_freed)) {
      if (cur->hnext) {
        cur->hnext->hprev = cur->hprev ;
      }
      if (cur->hprev) {
	cur->hprev->hnext = cur->hnext ;
      } else {
	*head = cur->hnext ;
      }
      cur->blocknr = 0 ;
      cur->sb = NULL ;
      cur->state = 0 ;
      if (cur->bh && cur->jlist) /* anybody who clears the cur->bh will also dec the nonzerolen */
	atomic_dec(&(cur->jlist->j_nonzerolen)) ;
      cur->bh = NULL ;
      cur->jlist = NULL ;
    } 
    cur = cur->hnext ;
  }
}

static void free_journal_ram(struct super_block *p_s_sb) {
  struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
  reiserfs_kfree(journal->j_current_jl,
                 sizeof(struct reiserfs_journal_list), p_s_sb);
  journal->j_num_lists--;

  vfree(journal->j_cnode_free_orig) ;
  free_list_bitmaps(p_s_sb, journal->j_list_bitmap) ;
  free_bitmap_nodes(p_s_sb) ; /* must be after free_list_bitmaps */
  if (journal->j_header_bh) {
    brelse(journal->j_header_bh) ;
  }
  /* j_header_bh is on the journal dev, make sure not to release the journal
   * dev until we brelse j_header_bh
   */
  release_journal_dev(p_s_sb, journal);
  vfree(journal) ;
}

/*
** call on unmount.  Only set error to 1 if you haven't made your way out
** of read_super() yet.  Any other caller must keep error at 0.
*/
static int do_journal_release(struct reiserfs_transaction_handle *th, struct super_block *p_s_sb, int error) {
  struct reiserfs_transaction_handle myth ;
  int flushed = 0;
  struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);

  /* we only want to flush out transactions if we were called with error == 0
  */
  if (!error && !(p_s_sb->s_flags & MS_RDONLY)) {
    /* end the current trans */
    BUG_ON (!th->t_trans_id);
    do_journal_end(th, p_s_sb,10, FLUSH_ALL) ;

    /* make sure something gets logged to force our way into the flush code */
    if (!journal_join(&myth, p_s_sb, 1)) {
        reiserfs_prepare_for_journal(p_s_sb, SB_BUFFER_WITH_SB(p_s_sb), 1) ;
        journal_mark_dirty(&myth, p_s_sb, SB_BUFFER_WITH_SB(p_s_sb)) ;
        do_journal_end(&myth, p_s_sb,1, FLUSH_ALL) ;
        flushed = 1;
    }
  }

  /* this also catches errors during the do_journal_end above */
  if (!error && reiserfs_is_journal_aborted(journal)) {
      memset(&myth, 0, sizeof(myth));
      if (!journal_join_abort(&myth, p_s_sb, 1)) {
	  reiserfs_prepare_for_journal(p_s_sb, SB_BUFFER_WITH_SB(p_s_sb), 1) ;
	  journal_mark_dirty(&myth, p_s_sb, SB_BUFFER_WITH_SB(p_s_sb)) ;
          do_journal_end(&myth, p_s_sb, 1, FLUSH_ALL) ;
      }
  }

  reiserfs_mounted_fs_count-- ;
  /* wait for all commits to finish */
  cancel_delayed_work(&SB_JOURNAL(p_s_sb)->j_work);
  flush_workqueue(commit_wq);
  if (!reiserfs_mounted_fs_count) {
    destroy_workqueue(commit_wq);
    commit_wq = NULL;
  }

  free_journal_ram(p_s_sb) ;

  return 0 ;
}

/*
** call on unmount.  flush all journal trans, release all alloc'd ram
*/
int journal_release(struct reiserfs_transaction_handle *th, struct super_block *p_s_sb) {
  return do_journal_release(th, p_s_sb, 0) ;
}
/*
** only call from an error condition inside reiserfs_read_super!
*/
int journal_release_error(struct reiserfs_transaction_handle *th, struct super_block *p_s_sb) {
  return do_journal_release(th, p_s_sb, 1) ;
}

/* compares description block with commit block.  returns 1 if they differ, 0 if they are the same */
static int journal_compare_desc_commit(struct super_block *p_s_sb, struct reiserfs_journal_desc *desc, 
			               struct reiserfs_journal_commit *commit) {
  if (get_commit_trans_id (commit) != get_desc_trans_id (desc) || 
      get_commit_trans_len (commit) != get_desc_trans_len (desc) || 
      get_commit_trans_len (commit) > SB_JOURNAL(p_s_sb)->j_trans_max ||
      get_commit_trans_len (commit) <= 0 
  ) {
    return 1 ;
  }
  return 0 ;
}
/* returns 0 if it did not find a description block  
** returns -1 if it found a corrupt commit block
** returns 1 if both desc and commit were valid 
*/
static int journal_transaction_is_valid(struct super_block *p_s_sb, struct buffer_head *d_bh, unsigned long *oldest_invalid_trans_id, unsigned long *newest_mount_id) {
  struct reiserfs_journal_desc *desc ;
  struct reiserfs_journal_commit *commit ;
  struct buffer_head *c_bh ;
  unsigned long offset ;

  if (!d_bh)
      return 0 ;

  desc = (struct reiserfs_journal_desc *)d_bh->b_data ;
  if (get_desc_trans_len(desc) > 0 && !memcmp(get_journal_desc_magic (d_bh), JOURNAL_DESC_MAGIC, 8)) {
    if (oldest_invalid_trans_id && *oldest_invalid_trans_id && get_desc_trans_id(desc) > *oldest_invalid_trans_id) {
      reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-986: transaction "
	              "is valid returning because trans_id %d is greater than "
		      "oldest_invalid %lu", get_desc_trans_id(desc),
		       *oldest_invalid_trans_id);
      return 0 ;
    }
    if (newest_mount_id && *newest_mount_id > get_desc_mount_id (desc)) {
      reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-1087: transaction "
                     "is valid returning because mount_id %d is less than "
		     "newest_mount_id %lu", get_desc_mount_id (desc),
		     *newest_mount_id) ;
      return -1 ;
    }
    if ( get_desc_trans_len(desc) > SB_JOURNAL(p_s_sb)->j_trans_max ) {
      reiserfs_warning(p_s_sb, "journal-2018: Bad transaction length %d encountered, ignoring transaction", get_desc_trans_len(desc));
      return -1 ;
    }
    offset = d_bh->b_blocknr - SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) ;

    /* ok, we have a journal description block, lets see if the transaction was valid */
    c_bh = journal_bread(p_s_sb, SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) +
		 ((offset + get_desc_trans_len(desc) + 1) % SB_ONDISK_JOURNAL_SIZE(p_s_sb))) ;
    if (!c_bh)
      return 0 ;
    commit = (struct reiserfs_journal_commit *)c_bh->b_data ;
    if (journal_compare_desc_commit(p_s_sb, desc, commit)) {
      reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, 
                     "journal_transaction_is_valid, commit offset %ld had bad "
		     "time %d or length %d",
		     c_bh->b_blocknr -  SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb),
		     get_commit_trans_id (commit), 
		     get_commit_trans_len(commit));
      brelse(c_bh) ;
      if (oldest_invalid_trans_id) {
	*oldest_invalid_trans_id = get_desc_trans_id(desc) ;
	reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-1004: "
		       "transaction_is_valid setting oldest invalid trans_id "
		       "to %d", get_desc_trans_id(desc)) ;
      }
      return -1; 
    }
    brelse(c_bh) ;
    reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-1006: found valid "
                   "transaction start offset %llu, len %d id %d",
		   d_bh->b_blocknr - SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb), 
		   get_desc_trans_len(desc), get_desc_trans_id(desc)) ;
    return 1 ;
  } else {
    return 0 ;
  }
}

static void brelse_array(struct buffer_head **heads, int num) {
  int i ;
  for (i = 0 ; i < num ; i++) {
    brelse(heads[i]) ;
  }
}

/*
** given the start, and values for the oldest acceptable transactions,
** this either reads in a replays a transaction, or returns because the transaction
** is invalid, or too old.
*/
static int journal_read_transaction(struct super_block *p_s_sb, unsigned long cur_dblock, unsigned long oldest_start, 
				    unsigned long oldest_trans_id, unsigned long newest_mount_id) {
  struct reiserfs_journal *journal = SB_JOURNAL (p_s_sb);
  struct reiserfs_journal_desc *desc ;
  struct reiserfs_journal_commit *commit ;
  unsigned long trans_id = 0 ;
  struct buffer_head *c_bh ;
  struct buffer_head *d_bh ;
  struct buffer_head **log_blocks = NULL ;
  struct buffer_head **real_blocks = NULL ;
  unsigned long trans_offset ;
  int i;
  int trans_half;

  d_bh = journal_bread(p_s_sb, cur_dblock) ;
  if (!d_bh)
    return 1 ;
  desc = (struct reiserfs_journal_desc *)d_bh->b_data ;
  trans_offset = d_bh->b_blocknr - SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) ;
  reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-1037: "
                 "journal_read_transaction, offset %llu, len %d mount_id %d",
		 d_bh->b_blocknr - SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb), 
		 get_desc_trans_len(desc), get_desc_mount_id(desc)) ;
  if (get_desc_trans_id(desc) < oldest_trans_id) {
    reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-1039: "
                   "journal_read_trans skipping because %lu is too old",
		   cur_dblock - SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb)) ;
    brelse(d_bh) ;
    return 1 ;
  }
  if (get_desc_mount_id(desc) != newest_mount_id) {
    reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-1146: "
                   "journal_read_trans skipping because %d is != "
		   "newest_mount_id %lu", get_desc_mount_id(desc),
		    newest_mount_id) ;
    brelse(d_bh) ;
    return 1 ;
  }
  c_bh = journal_bread(p_s_sb, SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) +
		((trans_offset + get_desc_trans_len(desc) + 1) % 
		 SB_ONDISK_JOURNAL_SIZE(p_s_sb))) ;
  if (!c_bh) {
    brelse(d_bh) ;
    return 1 ;
  }
  commit = (struct reiserfs_journal_commit *)c_bh->b_data ;
  if (journal_compare_desc_commit(p_s_sb, desc, commit)) {
    reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal_read_transaction, "
                   "commit offset %llu had bad time %d or length %d",
		   c_bh->b_blocknr -  SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb), 
		   get_commit_trans_id(commit), get_commit_trans_len(commit));
    brelse(c_bh) ;
    brelse(d_bh) ;
    return 1; 
  }
  trans_id = get_desc_trans_id(desc) ;
  /* now we know we've got a good transaction, and it was inside the valid time ranges */
  log_blocks = reiserfs_kmalloc(get_desc_trans_len(desc) * sizeof(struct buffer_head *), GFP_NOFS, p_s_sb) ;
  real_blocks = reiserfs_kmalloc(get_desc_trans_len(desc) * sizeof(struct buffer_head *), GFP_NOFS, p_s_sb) ;
  if (!log_blocks  || !real_blocks) {
    brelse(c_bh) ;
    brelse(d_bh) ;
    reiserfs_kfree(log_blocks, get_desc_trans_len(desc) * sizeof(struct buffer_head *), p_s_sb) ;
    reiserfs_kfree(real_blocks, get_desc_trans_len(desc) * sizeof(struct buffer_head *), p_s_sb) ;
    reiserfs_warning(p_s_sb, "journal-1169: kmalloc failed, unable to mount FS") ;
    return -1 ;
  }
  /* get all the buffer heads */
  trans_half = journal_trans_half (p_s_sb->s_blocksize) ;
  for(i = 0 ; i < get_desc_trans_len(desc) ; i++) {
    log_blocks[i] =  journal_getblk(p_s_sb,  SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) + (trans_offset + 1 + i) % SB_ONDISK_JOURNAL_SIZE(p_s_sb));
    if (i < trans_half) {
      real_blocks[i] = sb_getblk(p_s_sb, le32_to_cpu(desc->j_realblock[i])) ;
    } else {
      real_blocks[i] = sb_getblk(p_s_sb, le32_to_cpu(commit->j_realblock[i - trans_half])) ;
    }
    if ( real_blocks[i]->b_blocknr > SB_BLOCK_COUNT(p_s_sb) ) {
      reiserfs_warning(p_s_sb, "journal-1207: REPLAY FAILURE fsck required! Block to replay is outside of filesystem");
      goto abort_replay;
    }
    /* make sure we don't try to replay onto log or reserved area */
    if (is_block_in_log_or_reserved_area(p_s_sb, real_blocks[i]->b_blocknr)) {
      reiserfs_warning(p_s_sb, "journal-1204: REPLAY FAILURE fsck required! Trying to replay onto a log block") ;
abort_replay:
      brelse_array(log_blocks, i) ;
      brelse_array(real_blocks, i) ;
      brelse(c_bh) ;
      brelse(d_bh) ;
      reiserfs_kfree(log_blocks, get_desc_trans_len(desc) * sizeof(struct buffer_head *), p_s_sb) ;
      reiserfs_kfree(real_blocks, get_desc_trans_len(desc) * sizeof(struct buffer_head *), p_s_sb) ;
      return -1 ;
    }
  }
  /* read in the log blocks, memcpy to the corresponding real block */
  ll_rw_block(READ, get_desc_trans_len(desc), log_blocks) ;
  for (i = 0 ; i < get_desc_trans_len(desc) ; i++) {
    wait_on_buffer(log_blocks[i]) ;
    if (!buffer_uptodate(log_blocks[i])) {
      reiserfs_warning(p_s_sb, "journal-1212: REPLAY FAILURE fsck required! buffer write failed") ;
      brelse_array(log_blocks + i, get_desc_trans_len(desc) - i) ;
      brelse_array(real_blocks, get_desc_trans_len(desc)) ;
      brelse(c_bh) ;
      brelse(d_bh) ;
      reiserfs_kfree(log_blocks, get_desc_trans_len(desc) * sizeof(struct buffer_head *), p_s_sb) ;
      reiserfs_kfree(real_blocks, get_desc_trans_len(desc) * sizeof(struct buffer_head *), p_s_sb) ;
      return -1 ;
    }
    memcpy(real_blocks[i]->b_data, log_blocks[i]->b_data, real_blocks[i]->b_size) ;
    set_buffer_uptodate(real_blocks[i]) ;
    brelse(log_blocks[i]) ;
  }
  /* flush out the real blocks */
  for (i = 0 ; i < get_desc_trans_len(desc) ; i++) {
    set_buffer_dirty(real_blocks[i]) ;
    ll_rw_block(WRITE, 1, real_blocks + i) ;
  }
  for (i = 0 ; i < get_desc_trans_len(desc) ; i++) {
    wait_on_buffer(real_blocks[i]) ; 
    if (!buffer_uptodate(real_blocks[i])) {
      reiserfs_warning(p_s_sb, "journal-1226: REPLAY FAILURE, fsck required! buffer write failed") ;
      brelse_array(real_blocks + i, get_desc_trans_len(desc) - i) ;
      brelse(c_bh) ;
      brelse(d_bh) ;
      reiserfs_kfree(log_blocks, get_desc_trans_len(desc) * sizeof(struct buffer_head *), p_s_sb) ;
      reiserfs_kfree(real_blocks, get_desc_trans_len(desc) * sizeof(struct buffer_head *), p_s_sb) ;
      return -1 ;
    }
    brelse(real_blocks[i]) ;
  }
  cur_dblock =  SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) + ((trans_offset + get_desc_trans_len(desc) + 2) % SB_ONDISK_JOURNAL_SIZE(p_s_sb)) ;
  reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-1095: setting journal "
                 "start to offset %ld",
		 cur_dblock -  SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb)) ;
  
  /* init starting values for the first transaction, in case this is the last transaction to be replayed. */
  journal->j_start = cur_dblock - SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) ;
  journal->j_last_flush_trans_id = trans_id ;
  journal->j_trans_id = trans_id + 1;
  brelse(c_bh) ;
  brelse(d_bh) ;
  reiserfs_kfree(log_blocks, le32_to_cpu(desc->j_len) * sizeof(struct buffer_head *), p_s_sb) ;
  reiserfs_kfree(real_blocks, le32_to_cpu(desc->j_len) * sizeof(struct buffer_head *), p_s_sb) ;
  return 0 ;
}

/* This function reads blocks starting from block and to max_block of bufsize
   size (but no more than BUFNR blocks at a time). This proved to improve
   mounting speed on self-rebuilding raid5 arrays at least.
   Right now it is only used from journal code. But later we might use it
   from other places.
   Note: Do not use journal_getblk/sb_getblk functions here! */
static struct buffer_head * reiserfs_breada (struct block_device *dev, int block, int bufsize,
			    unsigned int max_block)
{
	struct buffer_head * bhlist[BUFNR];
	unsigned int blocks = BUFNR;
	struct buffer_head * bh;
	int i, j;
	
	bh = __getblk (dev, block, bufsize );
	if (buffer_uptodate (bh))
		return (bh);   
		
	if (block + BUFNR > max_block) {
		blocks = max_block - block;
	}
	bhlist[0] = bh;
	j = 1;
	for (i = 1; i < blocks; i++) {
		bh = __getblk (dev, block + i, bufsize);
		if (buffer_uptodate (bh)) {
			brelse (bh);
			break;
		}
		else bhlist[j++] = bh;
	}
	ll_rw_block (READ, j, bhlist);
	for(i = 1; i < j; i++) 
		brelse (bhlist[i]);
	bh = bhlist[0];
	wait_on_buffer (bh);
	if (buffer_uptodate (bh))
		return bh;
	brelse (bh);
	return NULL;
}

/*
** read and replay the log
** on a clean unmount, the journal header's next unflushed pointer will be to an invalid
** transaction.  This tests that before finding all the transactions in the log, which makes normal mount times fast.
**
** After a crash, this starts with the next unflushed transaction, and replays until it finds one too old, or invalid.
**
** On exit, it sets things up so the first transaction will work correctly.
*/
static int journal_read(struct super_block *p_s_sb) {
  struct reiserfs_journal *journal = SB_JOURNAL (p_s_sb);
  struct reiserfs_journal_desc *desc ;
  unsigned long oldest_trans_id = 0;
  unsigned long oldest_invalid_trans_id = 0 ;
  time_t start ;
  unsigned long oldest_start = 0;
  unsigned long cur_dblock = 0 ;
  unsigned long newest_mount_id = 9 ;
  struct buffer_head *d_bh ;
  struct reiserfs_journal_header *jh ;
  int valid_journal_header = 0 ;
  int replay_count = 0 ;
  int continue_replay = 1 ;
  int ret ;
  char b[BDEVNAME_SIZE];

  cur_dblock = SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) ;
  reiserfs_info (p_s_sb, "checking transaction log (%s)\n",
	 bdevname(journal->j_dev_bd, b));
  start = get_seconds();

  /* step 1, read in the journal header block.  Check the transaction it says 
  ** is the first unflushed, and if that transaction is not valid, 
  ** replay is done
  */
  journal->j_header_bh = journal_bread(p_s_sb,
					   SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) + 
					   SB_ONDISK_JOURNAL_SIZE(p_s_sb));
  if (!journal->j_header_bh) {
    return 1 ;
  }
  jh = (struct reiserfs_journal_header *)(journal->j_header_bh->b_data) ;
  if (le32_to_cpu(jh->j_first_unflushed_offset) >= 0 && 
      le32_to_cpu(jh->j_first_unflushed_offset) < SB_ONDISK_JOURNAL_SIZE(p_s_sb) && 
      le32_to_cpu(jh->j_last_flush_trans_id) > 0) {
    oldest_start = SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) + 
                       le32_to_cpu(jh->j_first_unflushed_offset) ;
    oldest_trans_id = le32_to_cpu(jh->j_last_flush_trans_id) + 1;
    newest_mount_id = le32_to_cpu(jh->j_mount_id);
    reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-1153: found in "
                   "header: first_unflushed_offset %d, last_flushed_trans_id "
		   "%lu", le32_to_cpu(jh->j_first_unflushed_offset),
		   le32_to_cpu(jh->j_last_flush_trans_id)) ;
    valid_journal_header = 1 ;

    /* now, we try to read the first unflushed offset.  If it is not valid, 
    ** there is nothing more we can do, and it makes no sense to read 
    ** through the whole log.
    */
    d_bh = journal_bread(p_s_sb, SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) + le32_to_cpu(jh->j_first_unflushed_offset)) ;
    ret = journal_transaction_is_valid(p_s_sb, d_bh, NULL, NULL) ;
    if (!ret) {
      continue_replay = 0 ;
    }
    brelse(d_bh) ;
    goto start_log_replay;
  }

  if (continue_replay && bdev_read_only(p_s_sb->s_bdev)) {
    reiserfs_warning (p_s_sb,
		      "clm-2076: device is readonly, unable to replay log") ;
    return -1 ;
  }

  /* ok, there are transactions that need to be replayed.  start with the first log block, find
  ** all the valid transactions, and pick out the oldest.
  */
  while(continue_replay && cur_dblock < (SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) + SB_ONDISK_JOURNAL_SIZE(p_s_sb))) {
    /* Note that it is required for blocksize of primary fs device and journal
       device to be the same */
    d_bh = reiserfs_breada(journal->j_dev_bd, cur_dblock, p_s_sb->s_blocksize,
			   SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) + SB_ONDISK_JOURNAL_SIZE(p_s_sb)) ;
    ret = journal_transaction_is_valid(p_s_sb, d_bh, &oldest_invalid_trans_id, &newest_mount_id) ;
    if (ret == 1) {
      desc = (struct reiserfs_journal_desc *)d_bh->b_data ;
      if (oldest_start == 0) { /* init all oldest_ values */
        oldest_trans_id = get_desc_trans_id(desc) ;
	oldest_start = d_bh->b_blocknr ;
	newest_mount_id = get_desc_mount_id(desc) ;
	reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-1179: Setting "
	               "oldest_start to offset %llu, trans_id %lu",
		       oldest_start - SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb), 
		       oldest_trans_id) ;
      } else if (oldest_trans_id > get_desc_trans_id(desc)) { 
        /* one we just read was older */
        oldest_trans_id = get_desc_trans_id(desc) ;
	oldest_start = d_bh->b_blocknr ;
	reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-1180: Resetting "
	               "oldest_start to offset %lu, trans_id %lu",
			oldest_start - SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb), 
			oldest_trans_id) ;
      }
      if (newest_mount_id < get_desc_mount_id(desc)) {
        newest_mount_id = get_desc_mount_id(desc) ;
	reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-1299: Setting "
	              "newest_mount_id to %d", get_desc_mount_id(desc));
      }
      cur_dblock += get_desc_trans_len(desc) + 2 ;
    } else {
      cur_dblock++ ;
    }
    brelse(d_bh) ;
  }

start_log_replay:
  cur_dblock = oldest_start ;
  if (oldest_trans_id)  {
    reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-1206: Starting replay "
                   "from offset %llu, trans_id %lu",
		   cur_dblock - SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb), 
		   oldest_trans_id) ;

  }
  replay_count = 0 ;
  while(continue_replay && oldest_trans_id > 0) {
    ret = journal_read_transaction(p_s_sb, cur_dblock, oldest_start, oldest_trans_id, newest_mount_id) ;
    if (ret < 0) {
      return ret ;
    } else if (ret != 0) {
      break ;
    }
    cur_dblock = SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) + journal->j_start ;
    replay_count++ ;
   if (cur_dblock == oldest_start)
        break;
  }

  if (oldest_trans_id == 0) {
    reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-1225: No valid "
                   "transactions found") ;
  }
  /* j_start does not get set correctly if we don't replay any transactions.
  ** if we had a valid journal_header, set j_start to the first unflushed transaction value,
  ** copy the trans_id from the header
  */
  if (valid_journal_header && replay_count == 0) { 
    journal->j_start = le32_to_cpu(jh->j_first_unflushed_offset) ;
    journal->j_trans_id = le32_to_cpu(jh->j_last_flush_trans_id) + 1;
    journal->j_last_flush_trans_id = le32_to_cpu(jh->j_last_flush_trans_id) ;
    journal->j_mount_id = le32_to_cpu(jh->j_mount_id) + 1;
  } else {
    journal->j_mount_id = newest_mount_id + 1 ;
  }
  reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-1299: Setting "
                 "newest_mount_id to %lu", journal->j_mount_id) ;
  journal->j_first_unflushed_offset = journal->j_start ;
  if (replay_count > 0) {
    reiserfs_info (p_s_sb, "replayed %d transactions in %lu seconds\n",
		   replay_count, get_seconds() - start) ;
  }
  if (!bdev_read_only(p_s_sb->s_bdev) && 
       _update_journal_header_block(p_s_sb, journal->j_start,
                                   journal->j_last_flush_trans_id))
  {
      /* replay failed, caller must call free_journal_ram and abort
      ** the mount
      */
      return -1 ;
  }
  return 0 ;
}

static struct reiserfs_journal_list *alloc_journal_list(struct super_block *s)
{
    struct reiserfs_journal_list *jl;
retry:
    jl = reiserfs_kmalloc(sizeof(struct reiserfs_journal_list), GFP_NOFS, s);
    if (!jl) {
	yield();
	goto retry;
    }
    memset(jl, 0, sizeof(*jl));
    INIT_LIST_HEAD(&jl->j_list);
    INIT_LIST_HEAD(&jl->j_working_list);
    INIT_LIST_HEAD(&jl->j_tail_bh_list);
    INIT_LIST_HEAD(&jl->j_bh_list);
    sema_init(&jl->j_commit_lock, 1);
    SB_JOURNAL(s)->j_num_lists++;
    get_journal_list(jl);
    return jl;
}

static void journal_list_init(struct super_block *p_s_sb) {
    SB_JOURNAL(p_s_sb)->j_current_jl = alloc_journal_list(p_s_sb);
}

static int release_journal_dev( struct super_block *super,
				struct reiserfs_journal *journal )
{
    int result;
    
    result = 0;

    if( journal -> j_dev_file != NULL ) {
	result = filp_close( journal -> j_dev_file, NULL );
	journal -> j_dev_file = NULL;
	journal -> j_dev_bd = NULL;
    } else if( journal -> j_dev_bd != NULL ) {
	result = blkdev_put( journal -> j_dev_bd );
	journal -> j_dev_bd = NULL;
    }

    if( result != 0 ) {
	reiserfs_warning(super, "sh-457: release_journal_dev: Cannot release journal device: %i", result );
    }
    return result;
}

static int journal_init_dev( struct super_block *super, 
			     struct reiserfs_journal *journal, 
			     const char *jdev_name )
{
	int result;
	dev_t jdev;
	int blkdev_mode = FMODE_READ | FMODE_WRITE;
	char b[BDEVNAME_SIZE];

	result = 0;

	journal -> j_dev_bd = NULL;
	journal -> j_dev_file = NULL;
	jdev = SB_ONDISK_JOURNAL_DEVICE( super ) ?
		new_decode_dev(SB_ONDISK_JOURNAL_DEVICE(super)) : super->s_dev;	

	if (bdev_read_only(super->s_bdev))
	    blkdev_mode = FMODE_READ;

	/* there is no "jdev" option and journal is on separate device */
	if( ( !jdev_name || !jdev_name[ 0 ] ) ) {
		journal->j_dev_bd = open_by_devnum(jdev, blkdev_mode);
		if (IS_ERR(journal->j_dev_bd)) {
			result = PTR_ERR(journal->j_dev_bd);
			journal->j_dev_bd = NULL;
			reiserfs_warning (super, "sh-458: journal_init_dev: "
					  "cannot init journal device '%s': %i",
					  __bdevname(jdev, b), result );
			return result;
		} else if (jdev != super->s_dev)
			set_blocksize(journal->j_dev_bd, super->s_blocksize);
		return 0;
	}

	journal -> j_dev_file = filp_open( jdev_name, 0, 0 );
	if( !IS_ERR( journal -> j_dev_file ) ) {
		struct inode *jdev_inode = journal->j_dev_file->f_mapping->host;
		if( !S_ISBLK( jdev_inode -> i_mode ) ) {
			reiserfs_warning(super, "journal_init_dev: '%s' is "
					 "not a block device", jdev_name );
			result = -ENOTBLK;
			release_journal_dev( super, journal );
		} else  {
			/* ok */
			journal->j_dev_bd = I_BDEV(jdev_inode);
			set_blocksize(journal->j_dev_bd, super->s_blocksize);
			reiserfs_info(super, "journal_init_dev: journal device: %s\n",
				      bdevname(journal->j_dev_bd, b));
		}
	} else {
		result = PTR_ERR( journal -> j_dev_file );
		journal -> j_dev_file = NULL;
		reiserfs_warning (super,
				  "journal_init_dev: Cannot open '%s': %i",
				  jdev_name, result );
	}
	return result;
}

/*
** must be called once on fs mount.  calls journal_read for you
*/
int journal_init(struct super_block *p_s_sb, const char * j_dev_name, int old_format, unsigned int commit_max_age) {
    int num_cnodes = SB_ONDISK_JOURNAL_SIZE(p_s_sb) * 2 ;
    struct buffer_head *bhjh;
    struct reiserfs_super_block * rs;
    struct reiserfs_journal_header *jh;
    struct reiserfs_journal *journal;
    struct reiserfs_journal_list *jl;
    char b[BDEVNAME_SIZE];

    journal = SB_JOURNAL(p_s_sb) = vmalloc(sizeof (struct reiserfs_journal)) ;
    if (!journal) {
	reiserfs_warning (p_s_sb, "journal-1256: unable to get memory for journal structure") ;
	return 1 ;
    }
    memset(journal, 0, sizeof(struct reiserfs_journal)) ;
    INIT_LIST_HEAD(&journal->j_bitmap_nodes) ;
    INIT_LIST_HEAD (&journal->j_prealloc_list);
    INIT_LIST_HEAD(&journal->j_working_list);
    INIT_LIST_HEAD(&journal->j_journal_list);
    journal->j_persistent_trans = 0;
    if (reiserfs_allocate_list_bitmaps(p_s_sb,
				       journal->j_list_bitmap,
 				       SB_BMAP_NR(p_s_sb)))
	goto free_and_return ;
    allocate_bitmap_nodes(p_s_sb) ;

    /* reserved for journal area support */
    SB_JOURNAL_1st_RESERVED_BLOCK(p_s_sb) = (old_format ?
					     REISERFS_OLD_DISK_OFFSET_IN_BYTES / p_s_sb->s_blocksize +
					     SB_BMAP_NR(p_s_sb) + 1 :
					     REISERFS_DISK_OFFSET_IN_BYTES / p_s_sb->s_blocksize + 2); 
    
    /* Sanity check to see is the standard journal fitting withing first bitmap
       (actual for small blocksizes) */
    if ( !SB_ONDISK_JOURNAL_DEVICE( p_s_sb ) &&
         (SB_JOURNAL_1st_RESERVED_BLOCK(p_s_sb) + SB_ONDISK_JOURNAL_SIZE(p_s_sb) > p_s_sb->s_blocksize * 8) ) {
	reiserfs_warning (p_s_sb, "journal-1393: journal does not fit for area "
			  "addressed by first of bitmap blocks. It starts at "
			  "%u and its size is %u. Block size %ld",
			  SB_JOURNAL_1st_RESERVED_BLOCK(p_s_sb),
			  SB_ONDISK_JOURNAL_SIZE(p_s_sb), p_s_sb->s_blocksize);
	goto free_and_return;
    }

    if( journal_init_dev( p_s_sb, journal, j_dev_name ) != 0 ) {
      reiserfs_warning (p_s_sb, "sh-462: unable to initialize jornal device");
      goto free_and_return;
    }

     rs = SB_DISK_SUPER_BLOCK(p_s_sb);
     
     /* read journal header */
     bhjh = journal_bread(p_s_sb,
		   SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) + SB_ONDISK_JOURNAL_SIZE(p_s_sb));
     if (!bhjh) {
	 reiserfs_warning (p_s_sb, "sh-459: unable to read journal header");
	 goto free_and_return;
     }
     jh = (struct reiserfs_journal_header *)(bhjh->b_data);
     
     /* make sure that journal matches to the super block */
     if (is_reiserfs_jr(rs) && (le32_to_cpu(jh->jh_journal.jp_journal_magic) != sb_jp_journal_magic(rs))) {
	 reiserfs_warning (p_s_sb, "sh-460: journal header magic %x "
			   "(device %s) does not match to magic found in super "
			   "block %x",
			   jh->jh_journal.jp_journal_magic,
			   bdevname( journal->j_dev_bd, b),
			   sb_jp_journal_magic(rs));
	 brelse (bhjh);
	 goto free_and_return;
  }
     
  journal->j_trans_max      = le32_to_cpu (jh->jh_journal.jp_journal_trans_max);
  journal->j_max_batch      = le32_to_cpu (jh->jh_journal.jp_journal_max_batch);
  journal->j_max_commit_age = le32_to_cpu (jh->jh_journal.jp_journal_max_commit_age);
  journal->j_max_trans_age = JOURNAL_MAX_TRANS_AGE;

  if (journal->j_trans_max) {
    /* make sure these parameters are available, assign it if they are not */
    __u32 initial = journal->j_trans_max;
    __u32 ratio = 1;
    
    if (p_s_sb->s_blocksize < 4096)
      ratio = 4096 / p_s_sb->s_blocksize;
    
    if (SB_ONDISK_JOURNAL_SIZE(p_s_sb)/journal->j_trans_max < JOURNAL_MIN_RATIO)
      journal->j_trans_max = SB_ONDISK_JOURNAL_SIZE(p_s_sb) / JOURNAL_MIN_RATIO;
    if (journal->j_trans_max > JOURNAL_TRANS_MAX_DEFAULT / ratio)
      journal->j_trans_max = JOURNAL_TRANS_MAX_DEFAULT / ratio;
    if (journal->j_trans_max < JOURNAL_TRANS_MIN_DEFAULT / ratio)
      journal->j_trans_max = JOURNAL_TRANS_MIN_DEFAULT / ratio;
    
    if (journal->j_trans_max != initial)
      reiserfs_warning (p_s_sb, "sh-461: journal_init: wrong transaction max size (%u). Changed to %u",
	      initial, journal->j_trans_max);

    journal->j_max_batch = journal->j_trans_max*
      JOURNAL_MAX_BATCH_DEFAULT/JOURNAL_TRANS_MAX_DEFAULT;
  }  
  
  if (!journal->j_trans_max) {
    /*we have the file system was created by old version of mkreiserfs 
      so this field contains zero value */
    journal->j_trans_max      = JOURNAL_TRANS_MAX_DEFAULT ;
    journal->j_max_batch      = JOURNAL_MAX_BATCH_DEFAULT ;
    journal->j_max_commit_age = JOURNAL_MAX_COMMIT_AGE ;
    
    /* for blocksize >= 4096 - max transaction size is 1024. For block size < 4096
       trans max size is decreased proportionally */
    if (p_s_sb->s_blocksize < 4096) {
      journal->j_trans_max /= (4096 / p_s_sb->s_blocksize) ;
      journal->j_max_batch = (journal->j_trans_max) * 9 / 10 ;
    }
  }

  journal->j_default_max_commit_age = journal->j_max_commit_age;

  if (commit_max_age != 0) {
      journal->j_max_commit_age = commit_max_age;
      journal->j_max_trans_age = commit_max_age;
  }

  reiserfs_info (p_s_sb, "journal params: device %s, size %u, "
		 "journal first block %u, max trans len %u, max batch %u, "
		 "max commit age %u, max trans age %u\n",
		 bdevname( journal->j_dev_bd, b),
		 SB_ONDISK_JOURNAL_SIZE(p_s_sb),
		 SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb),
		 journal->j_trans_max,
		 journal->j_max_batch,
		 journal->j_max_commit_age,
		 journal->j_max_trans_age);

  brelse (bhjh);
     
  journal->j_list_bitmap_index = 0 ;
  journal_list_init(p_s_sb) ;

  memset(journal->j_list_hash_table, 0, JOURNAL_HASH_SIZE * sizeof(struct reiserfs_journal_cnode *)) ;

  INIT_LIST_HEAD(&journal->j_dirty_buffers) ;
  spin_lock_init(&journal->j_dirty_buffers_lock) ;

  journal->j_start = 0 ;
  journal->j_len = 0 ;
  journal->j_len_alloc = 0 ;
  atomic_set(&(journal->j_wcount), 0) ;
  atomic_set(&(journal->j_async_throttle), 0) ;
  journal->j_bcount = 0 ;
  journal->j_trans_start_time = 0 ;
  journal->j_last = NULL ;
  journal->j_first = NULL ;
  init_waitqueue_head(&(journal->j_join_wait)) ;
  sema_init(&journal->j_lock, 1);
  sema_init(&journal->j_flush_sem, 1);

  journal->j_trans_id = 10 ;
  journal->j_mount_id = 10 ;
  journal->j_state = 0 ;
  atomic_set(&(journal->j_jlock), 0) ;
  journal->j_cnode_free_list = allocate_cnodes(num_cnodes) ;
  journal->j_cnode_free_orig = journal->j_cnode_free_list ;
  journal->j_cnode_free = journal->j_cnode_free_list ? num_cnodes : 0 ;
  journal->j_cnode_used = 0 ;
  journal->j_must_wait = 0 ;

  init_journal_hash(p_s_sb) ;
  jl = journal->j_current_jl;
  jl->j_list_bitmap = get_list_bitmap(p_s_sb, jl);
  if (!jl->j_list_bitmap) {
    reiserfs_warning(p_s_sb, "journal-2005, get_list_bitmap failed for journal list 0") ;
    goto free_and_return;
  }
  if (journal_read(p_s_sb) < 0) {
    reiserfs_warning(p_s_sb, "Replay Failure, unable to mount") ;
    goto free_and_return;
  }

  reiserfs_mounted_fs_count++ ;
  if (reiserfs_mounted_fs_count <= 1)
    commit_wq = create_workqueue("reiserfs");

  INIT_WORK(&journal->j_work, flush_async_commits, p_s_sb);
  return 0 ;
free_and_return:
  free_journal_ram(p_s_sb);
  return 1;
}

/*
** test for a polite end of the current transaction.  Used by file_write, and should
** be used by delete to make sure they don't write more than can fit inside a single
** transaction
*/
int journal_transaction_should_end(struct reiserfs_transaction_handle *th, int new_alloc) {
  struct reiserfs_journal *journal = SB_JOURNAL (th->t_super);
  time_t now = get_seconds() ;
  /* cannot restart while nested */
  BUG_ON (!th->t_trans_id);
  if (th->t_refcount > 1)
    return 0 ;
  if ( journal->j_must_wait > 0 ||
       (journal->j_len_alloc + new_alloc) >= journal->j_max_batch ||
       atomic_read(&(journal->j_jlock)) ||
      (now - journal->j_trans_start_time) > journal->j_max_trans_age ||
       journal->j_cnode_free < (journal->j_trans_max * 3)) {
    return 1 ;
  }
  return 0 ;
}

/* this must be called inside a transaction, and requires the 
** kernel_lock to be held
*/
void reiserfs_block_writes(struct reiserfs_transaction_handle *th) {
    struct reiserfs_journal *journal = SB_JOURNAL (th->t_super);
    BUG_ON (!th->t_trans_id);
    journal->j_must_wait = 1 ;
    set_bit(J_WRITERS_BLOCKED, &journal->j_state) ;
    return ;
}

/* this must be called without a transaction started, and does not
** require BKL
*/
void reiserfs_allow_writes(struct super_block *s) {
    struct reiserfs_journal *journal = SB_JOURNAL (s);
    clear_bit(J_WRITERS_BLOCKED, &journal->j_state) ;
    wake_up(&journal->j_join_wait) ;
}

/* this must be called without a transaction started, and does not
** require BKL
*/
void reiserfs_wait_on_write_block(struct super_block *s) {
    struct reiserfs_journal *journal = SB_JOURNAL (s);
    wait_event(journal->j_join_wait,
               !test_bit(J_WRITERS_BLOCKED, &journal->j_state)) ;
}

static void queue_log_writer(struct super_block *s) {
    wait_queue_t wait;
    struct reiserfs_journal *journal = SB_JOURNAL (s);
    set_bit(J_WRITERS_QUEUED, &journal->j_state);

    /*
     * we don't want to use wait_event here because
     * we only want to wait once.
     */
    init_waitqueue_entry(&wait, current);
    add_wait_queue(&journal->j_join_wait, &wait);
    set_current_state(TASK_UNINTERRUPTIBLE);
    if (test_bit(J_WRITERS_QUEUED, &journal->j_state))
        schedule();
    current->state = TASK_RUNNING;
    remove_wait_queue(&journal->j_join_wait, &wait);
}

static void wake_queued_writers(struct super_block *s) {
    struct reiserfs_journal *journal = SB_JOURNAL (s);
    if (test_and_clear_bit(J_WRITERS_QUEUED, &journal->j_state))
        wake_up(&journal->j_join_wait);
}

static void let_transaction_grow(struct super_block *sb,
                                 unsigned long trans_id)
{
    struct reiserfs_journal *journal = SB_JOURNAL (sb);
    unsigned long bcount = journal->j_bcount;
    while(1) {
	set_current_state(TASK_UNINTERRUPTIBLE);
	schedule_timeout(1);
	journal->j_current_jl->j_state |= LIST_COMMIT_PENDING;
        while ((atomic_read(&journal->j_wcount) > 0 ||
	        atomic_read(&journal->j_jlock)) &&
	       journal->j_trans_id == trans_id) {
	    queue_log_writer(sb);
	}
	if (journal->j_trans_id != trans_id)
	    break;
	if (bcount == journal->j_bcount)
	    break;
	bcount = journal->j_bcount;
    }
}

/* join == true if you must join an existing transaction.
** join == false if you can deal with waiting for others to finish
**
** this will block until the transaction is joinable.  send the number of blocks you
** expect to use in nblocks.
*/
static int do_journal_begin_r(struct reiserfs_transaction_handle *th, struct super_block * p_s_sb,unsigned long nblocks,int join) {
  time_t now = get_seconds() ;
  int old_trans_id  ;
  struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
  struct reiserfs_transaction_handle myth;
  int sched_count = 0;
  int retval;

  reiserfs_check_lock_depth(p_s_sb, "journal_begin") ;

  PROC_INFO_INC( p_s_sb, journal.journal_being );
  /* set here for journal_join */
  th->t_refcount = 1;
  th->t_super = p_s_sb ;

relock:
  lock_journal(p_s_sb) ;
  if (join != JBEGIN_ABORT && reiserfs_is_journal_aborted (journal)) {
    unlock_journal (p_s_sb);
    retval = journal->j_errno;
    goto out_fail;
  }
  journal->j_bcount++;

  if (test_bit(J_WRITERS_BLOCKED, &journal->j_state)) {
    unlock_journal(p_s_sb) ;
    reiserfs_wait_on_write_block(p_s_sb) ;
    PROC_INFO_INC( p_s_sb, journal.journal_relock_writers );
    goto relock ;
  }
  now = get_seconds();

  /* if there is no room in the journal OR
  ** if this transaction is too old, and we weren't called joinable, wait for it to finish before beginning 
  ** we don't sleep if there aren't other writers
  */

  if ( (!join && journal->j_must_wait > 0) ||
     ( !join && (journal->j_len_alloc + nblocks + 2) >= journal->j_max_batch) ||
     (!join && atomic_read(&journal->j_wcount) > 0 && journal->j_trans_start_time > 0 &&
      (now - journal->j_trans_start_time) > journal->j_max_trans_age) ||
     (!join && atomic_read(&journal->j_jlock)) ||
     (!join && journal->j_cnode_free < (journal->j_trans_max * 3))) {

    old_trans_id = journal->j_trans_id;
    unlock_journal(p_s_sb) ; /* allow others to finish this transaction */

    if (!join && (journal->j_len_alloc + nblocks + 2) >=
        journal->j_max_batch &&
	((journal->j_len + nblocks + 2) * 100) < (journal->j_len_alloc * 75))
    {
	if (atomic_read(&journal->j_wcount) > 10) {
	    sched_count++;
	    queue_log_writer(p_s_sb);
	    goto relock;
	}
    }
    /* don't mess with joining the transaction if all we have to do is
     * wait for someone else to do a commit
     */
    if (atomic_read(&journal->j_jlock)) {
	while (journal->j_trans_id == old_trans_id &&
	       atomic_read(&journal->j_jlock)) {
	    queue_log_writer(p_s_sb);
        }
	goto relock;
    }
    retval = journal_join(&myth, p_s_sb, 1) ;
    if (retval)
        goto out_fail;

    /* someone might have ended the transaction while we joined */
    if (old_trans_id != journal->j_trans_id) {
        retval = do_journal_end(&myth, p_s_sb, 1, 0) ;
    } else {
        retval = do_journal_end(&myth, p_s_sb, 1, COMMIT_NOW) ;
    }

    if (retval)
        goto out_fail;

    PROC_INFO_INC( p_s_sb, journal.journal_relock_wcount );
    goto relock ;
  }
  /* we are the first writer, set trans_id */
  if (journal->j_trans_start_time == 0) {
    journal->j_trans_start_time = get_seconds();
  }
  atomic_inc(&(journal->j_wcount)) ;
  journal->j_len_alloc += nblocks ;
  th->t_blocks_logged = 0 ;
  th->t_blocks_allocated = nblocks ;
  th->t_trans_id = journal->j_trans_id ;
  unlock_journal(p_s_sb) ;
  INIT_LIST_HEAD (&th->t_list);
  return 0 ;

out_fail:
  memset (th, 0, sizeof (*th));
  /* Re-set th->t_super, so we can properly keep track of how many
   * persistent transactions there are. We need to do this so if this
   * call is part of a failed restart_transaction, we can free it later */
  th->t_super = p_s_sb;
  return retval;
}

struct reiserfs_transaction_handle *
reiserfs_persistent_transaction(struct super_block *s, int nblocks) {
    int ret ;
    struct reiserfs_transaction_handle *th ;

    /* if we're nesting into an existing transaction.  It will be
    ** persistent on its own
    */
    if (reiserfs_transaction_running(s)) {
        th = current->journal_info ;
	th->t_refcount++ ;
	if (th->t_refcount < 2) {
	    BUG() ;
	}
	return th ;
    }
    th = reiserfs_kmalloc(sizeof(struct reiserfs_transaction_handle), GFP_NOFS, s) ;
    if (!th)
       return NULL;
    ret = journal_begin(th, s, nblocks) ;
    if (ret) {
	reiserfs_kfree(th, sizeof(struct reiserfs_transaction_handle), s) ;
        return NULL;
    }

    SB_JOURNAL(s)->j_persistent_trans++;
    return th ;
}

int
reiserfs_end_persistent_transaction(struct reiserfs_transaction_handle *th) {
    struct super_block *s = th->t_super;
    int ret = 0;
    if (th->t_trans_id)
        ret = journal_end(th, th->t_super, th->t_blocks_allocated);
    else
        ret = -EIO;
    if (th->t_refcount == 0) {
        SB_JOURNAL(s)->j_persistent_trans--;
	reiserfs_kfree(th, sizeof(struct reiserfs_transaction_handle), s) ;
    }
    return ret;
}

static int journal_join(struct reiserfs_transaction_handle *th, struct super_block *p_s_sb, unsigned long nblocks) {
  struct reiserfs_transaction_handle *cur_th = current->journal_info;

  /* this keeps do_journal_end from NULLing out the current->journal_info
  ** pointer
  */
  th->t_handle_save = cur_th ;
  if (cur_th && cur_th->t_refcount > 1) {
      BUG() ;
  }
  return do_journal_begin_r(th, p_s_sb, nblocks, JBEGIN_JOIN) ;
}

int journal_join_abort(struct reiserfs_transaction_handle *th, struct super_block *p_s_sb, unsigned long nblocks) {
  struct reiserfs_transaction_handle *cur_th = current->journal_info;

  /* this keeps do_journal_end from NULLing out the current->journal_info
  ** pointer
  */
  th->t_handle_save = cur_th ;
  if (cur_th && cur_th->t_refcount > 1) {
      BUG() ;
  }
  return do_journal_begin_r(th, p_s_sb, nblocks, JBEGIN_ABORT) ;
}

int journal_begin(struct reiserfs_transaction_handle *th, struct super_block  * p_s_sb, unsigned long nblocks) {
    struct reiserfs_transaction_handle *cur_th = current->journal_info ;
    int ret ;

    th->t_handle_save = NULL ;
    if (cur_th) {
	/* we are nesting into the current transaction */
	if (cur_th->t_super == p_s_sb) {
              BUG_ON (!cur_th->t_refcount);
	      cur_th->t_refcount++ ;
	      memcpy(th, cur_th, sizeof(*th));
	      if (th->t_refcount <= 1)
		      reiserfs_warning (p_s_sb, "BAD: refcount <= 1, but journal_info != 0");
	      return 0;
	} else {
	    /* we've ended up with a handle from a different filesystem.
	    ** save it and restore on journal_end.  This should never
	    ** really happen...
	    */
	    reiserfs_warning(p_s_sb, "clm-2100: nesting info a different FS") ;
	    th->t_handle_save = current->journal_info ;
	    current->journal_info = th;
	}
    } else {
	current->journal_info = th;
    }
    ret = do_journal_begin_r(th, p_s_sb, nblocks, JBEGIN_REG) ;
    if (current->journal_info != th)
        BUG() ;

    /* I guess this boils down to being the reciprocal of clm-2100 above.
     * If do_journal_begin_r fails, we need to put it back, since journal_end
     * won't be called to do it. */
    if (ret)
        current->journal_info = th->t_handle_save;
    else
        BUG_ON (!th->t_refcount);

    return ret ;
}

/*
** puts bh into the current transaction.  If it was already there, reorders removes the
** old pointers from the hash, and puts new ones in (to make sure replay happen in the right order).
**
** if it was dirty, cleans and files onto the clean list.  I can't let it be dirty again until the
** transaction is committed.
** 
** if j_len, is bigger than j_len_alloc, it pushes j_len_alloc to 10 + j_len.
*/
int journal_mark_dirty(struct reiserfs_transaction_handle *th, struct super_block *p_s_sb, struct buffer_head *bh) {
  struct reiserfs_journal *journal = SB_JOURNAL (p_s_sb);
  struct reiserfs_journal_cnode *cn = NULL;
  int count_already_incd = 0 ;
  int prepared = 0 ;
  BUG_ON (!th->t_trans_id);

  PROC_INFO_INC( p_s_sb, journal.mark_dirty );
  if (th->t_trans_id != journal->j_trans_id) {
    reiserfs_panic(th->t_super, "journal-1577: handle trans id %ld != current trans id %ld\n", 
                   th->t_trans_id, journal->j_trans_id);
  }

  p_s_sb->s_dirt = 1;

  prepared = test_clear_buffer_journal_prepared (bh);
  clear_buffer_journal_restore_dirty (bh);
  /* already in this transaction, we are done */
  if (buffer_journaled(bh)) {
    PROC_INFO_INC( p_s_sb, journal.mark_dirty_already );
    return 0 ;
  }

  /* this must be turned into a panic instead of a warning.  We can't allow
  ** a dirty or journal_dirty or locked buffer to be logged, as some changes
  ** could get to disk too early.  NOT GOOD.
  */
  if (!prepared || buffer_dirty(bh)) {
    reiserfs_warning (p_s_sb, "journal-1777: buffer %llu bad state "
		      "%cPREPARED %cLOCKED %cDIRTY %cJDIRTY_WAIT",
		      (unsigned long long)bh->b_blocknr, prepared ? ' ' : '!',
			    buffer_locked(bh) ? ' ' : '!',
			    buffer_dirty(bh) ? ' ' : '!',
			    buffer_journal_dirty(bh) ? ' ' : '!') ;
  }

  if (atomic_read(&(journal->j_wcount)) <= 0) {
    reiserfs_warning (p_s_sb, "journal-1409: journal_mark_dirty returning because j_wcount was %d", atomic_read(&(journal->j_wcount))) ;
    return 1 ;
  }
  /* this error means I've screwed up, and we've overflowed the transaction.  
  ** Nothing can be done here, except make the FS readonly or panic.
  */ 
  if (journal->j_len >= journal->j_trans_max) {
    reiserfs_panic(th->t_super, "journal-1413: journal_mark_dirty: j_len (%lu) is too big\n", journal->j_len) ;
  }

  if (buffer_journal_dirty(bh)) {
    count_already_incd = 1 ;
    PROC_INFO_INC( p_s_sb, journal.mark_dirty_notjournal );
    clear_buffer_journal_dirty (bh);
  }

  if (journal->j_len > journal->j_len_alloc) {
    journal->j_len_alloc = journal->j_len + JOURNAL_PER_BALANCE_CNT ;
  }

  set_buffer_journaled (bh);

  /* now put this guy on the end */
  if (!cn) {
    cn = get_cnode(p_s_sb) ;
    if (!cn) {
      reiserfs_panic(p_s_sb, "get_cnode failed!\n"); 
    }

    if (th->t_blocks_logged == th->t_blocks_allocated) {
      th->t_blocks_allocated += JOURNAL_PER_BALANCE_CNT ;
      journal->j_len_alloc += JOURNAL_PER_BALANCE_CNT ;
    }
    th->t_blocks_logged++ ;
    journal->j_len++ ;

    cn->bh = bh ;
    cn->blocknr = bh->b_blocknr ;
    cn->sb = p_s_sb;
    cn->jlist = NULL ;
    insert_journal_hash(journal->j_hash_table, cn) ;
    if (!count_already_incd) {
      get_bh(bh) ;
    }
  }
  cn->next = NULL ;
  cn->prev = journal->j_last ;
  cn->bh = bh ;
  if (journal->j_last) {
    journal->j_last->next = cn ;
    journal->j_last = cn ;
  } else {
    journal->j_first = cn ;
    journal->j_last = cn ;
  }
  return 0 ;
}

int journal_end(struct reiserfs_transaction_handle *th, struct super_block *p_s_sb, unsigned long nblocks) {
  if (!current->journal_info && th->t_refcount > 1)
    reiserfs_warning (p_s_sb, "REISER-NESTING: th NULL, refcount %d",
                      th->t_refcount);

  if (!th->t_trans_id) {
    WARN_ON (1);
    return -EIO;
  }

  th->t_refcount--;
  if (th->t_refcount > 0) {
    struct reiserfs_transaction_handle *cur_th = current->journal_info ;

    /* we aren't allowed to close a nested transaction on a different
    ** filesystem from the one in the task struct
    */
    if (cur_th->t_super != th->t_super)
      BUG() ;

    if (th != cur_th) {
      memcpy(current->journal_info, th, sizeof(*th));
      th->t_trans_id = 0;
    }
    return 0;
  } else {
    return do_journal_end(th, p_s_sb, nblocks, 0) ;
  }
}

/* removes from the current transaction, relsing and descrementing any counters.  
** also files the removed buffer directly onto the clean list
**
** called by journal_mark_freed when a block has been deleted
**
** returns 1 if it cleaned and relsed the buffer. 0 otherwise
*/
static int remove_from_transaction(struct super_block *p_s_sb, b_blocknr_t blocknr, int already_cleaned) {
  struct buffer_head *bh ;
  struct reiserfs_journal_cnode *cn ;
  struct reiserfs_journal *journal = SB_JOURNAL (p_s_sb);
  int ret = 0;

  cn = get_journal_hash_dev(p_s_sb, journal->j_hash_table, blocknr) ;
  if (!cn || !cn->bh) {
    return ret ;
  }
  bh = cn->bh ;
  if (cn->prev) {
    cn->prev->next = cn->next ;
  }
  if (cn->next) {
    cn->next->prev = cn->prev ;
  }
  if (cn == journal->j_first) {
    journal->j_first = cn->next ;
  }
  if (cn == journal->j_last) {
    journal->j_last = cn->prev ;
  }
  if (bh)
	remove_journal_hash(p_s_sb, journal->j_hash_table, NULL, bh->b_blocknr, 0) ;
  clear_buffer_journaled  (bh); /* don't log this one */

  if (!already_cleaned) {
    clear_buffer_journal_dirty (bh);
    clear_buffer_dirty(bh);
    clear_buffer_journal_test (bh);
    put_bh(bh) ;
    if (atomic_read(&(bh->b_count)) < 0) {
      reiserfs_warning (p_s_sb, "journal-1752: remove from trans, b_count < 0");
    }
    ret = 1 ;
  }
  journal->j_len-- ;
  journal->j_len_alloc-- ;
  free_cnode(p_s_sb, cn) ;
  return ret ;
}

/*
** for any cnode in a journal list, it can only be dirtied of all the
** transactions that include it are commited to disk.
** this checks through each transaction, and returns 1 if you are allowed to dirty,
** and 0 if you aren't
**
** it is called by dirty_journal_list, which is called after flush_commit_list has gotten all the log
** blocks for a given transaction on disk
**
*/
static int can_dirty(struct reiserfs_journal_cnode *cn) {
  struct super_block *sb = cn->sb;
  b_blocknr_t blocknr = cn->blocknr  ;
  struct reiserfs_journal_cnode *cur = cn->hprev ;
  int can_dirty = 1 ;
  
  /* first test hprev.  These are all newer than cn, so any node here
  ** with the same block number and dev means this node can't be sent
  ** to disk right now.
  */
  while(cur && can_dirty) {
    if (cur->jlist && cur->bh && cur->blocknr && cur->sb == sb && 
        cur->blocknr == blocknr) {
      can_dirty = 0 ;
    }
    cur = cur->hprev ;
  }
  /* then test hnext.  These are all older than cn.  As long as they
  ** are committed to the log, it is safe to write cn to disk
  */
  cur = cn->hnext ;
  while(cur && can_dirty) {
    if (cur->jlist && cur->jlist->j_len > 0 && 
        atomic_read(&(cur->jlist->j_commit_left)) > 0 && cur->bh && 
        cur->blocknr && cur->sb == sb && cur->blocknr == blocknr) {
      can_dirty = 0 ;
    }
    cur = cur->hnext ;
  }
  return can_dirty ;
}

/* syncs the commit blocks, but does not force the real buffers to disk
** will wait until the current transaction is done/commited before returning 
*/
int journal_end_sync(struct reiserfs_transaction_handle *th, struct super_block *p_s_sb, unsigned long nblocks) {
  struct reiserfs_journal *journal = SB_JOURNAL (p_s_sb);

  BUG_ON (!th->t_trans_id);
  /* you can sync while nested, very, very bad */
  if (th->t_refcount > 1) {
    BUG() ;
  }
  if (journal->j_len == 0) {
    reiserfs_prepare_for_journal(p_s_sb, SB_BUFFER_WITH_SB(p_s_sb), 1) ;
    journal_mark_dirty(th, p_s_sb, SB_BUFFER_WITH_SB(p_s_sb)) ;
  }
  return do_journal_end(th, p_s_sb, nblocks, COMMIT_NOW | WAIT) ;
}

/*
** writeback the pending async commits to disk
*/
static void flush_async_commits(void *p) {
  struct super_block *p_s_sb = p;
  struct reiserfs_journal *journal = SB_JOURNAL (p_s_sb);
  struct reiserfs_journal_list *jl;
  struct list_head *entry;

  lock_kernel();
  if (!list_empty(&journal->j_journal_list)) {
      /* last entry is the youngest, commit it and you get everything */
      entry = journal->j_journal_list.prev;
      jl = JOURNAL_LIST_ENTRY(entry);
      flush_commit_list(p_s_sb, jl, 1);
  }
  unlock_kernel();
  /*
   * this is a little racey, but there's no harm in missing
   * the filemap_fdata_write
   */
  if (!atomic_read(&journal->j_async_throttle) && !reiserfs_is_journal_aborted (journal)) {
      atomic_inc(&journal->j_async_throttle);
      filemap_fdatawrite(p_s_sb->s_bdev->bd_inode->i_mapping);
      atomic_dec(&journal->j_async_throttle);
  }
}

/*
** flushes any old transactions to disk
** ends the current transaction if it is too old
*/
int reiserfs_flush_old_commits(struct super_block *p_s_sb) {
    time_t now ;
    struct reiserfs_transaction_handle th ;
    struct reiserfs_journal *journal = SB_JOURNAL (p_s_sb);

    now = get_seconds();
    /* safety check so we don't flush while we are replaying the log during
     * mount
     */
    if (list_empty(&journal->j_journal_list)) {
	return 0  ;
    }

    /* check the current transaction.  If there are no writers, and it is
     * too old, finish it, and force the commit blocks to disk
     */
    if (atomic_read(&journal->j_wcount) <= 0 &&
        journal->j_trans_start_time > 0 &&
        journal->j_len > 0 &&
        (now - journal->j_trans_start_time) > journal->j_max_trans_age)
    {
	if (!journal_join(&th, p_s_sb, 1)) {
            reiserfs_prepare_for_journal(p_s_sb, SB_BUFFER_WITH_SB(p_s_sb), 1) ;
            journal_mark_dirty(&th, p_s_sb, SB_BUFFER_WITH_SB(p_s_sb)) ;

            /* we're only being called from kreiserfsd, it makes no sense to do
            ** an async commit so that kreiserfsd can do it later
            */
            do_journal_end(&th, p_s_sb,1, COMMIT_NOW | WAIT) ;
        }
    }
    return p_s_sb->s_dirt;
}

/*
** returns 0 if do_journal_end should return right away, returns 1 if do_journal_end should finish the commit
** 
** if the current transaction is too old, but still has writers, this will wait on j_join_wait until all 
** the writers are done.  By the time it wakes up, the transaction it was called has already ended, so it just
** flushes the commit list and returns 0.
**
** Won't batch when flush or commit_now is set.  Also won't batch when others are waiting on j_join_wait.
** 
** Note, we can't allow the journal_end to proceed while there are still writers in the log.
*/
static int check_journal_end(struct reiserfs_transaction_handle *th, struct super_block  * p_s_sb, 
                             unsigned long nblocks, int flags) {

  time_t now ;
  int flush = flags & FLUSH_ALL ;
  int commit_now = flags & COMMIT_NOW ;
  int wait_on_commit = flags & WAIT ;
  struct reiserfs_journal_list *jl;
  struct reiserfs_journal *journal = SB_JOURNAL (p_s_sb);

  BUG_ON (!th->t_trans_id);

  if (th->t_trans_id != journal->j_trans_id) {
    reiserfs_panic(th->t_super, "journal-1577: handle trans id %ld != current trans id %ld\n", 
                   th->t_trans_id, journal->j_trans_id);
  }

  journal->j_len_alloc -= (th->t_blocks_allocated - th->t_blocks_logged) ;
  if (atomic_read(&(journal->j_wcount)) > 0) { /* <= 0 is allowed.  unmounting might not call begin */
    atomic_dec(&(journal->j_wcount)) ;
  }

  /* BUG, deal with case where j_len is 0, but people previously freed blocks need to be released 
  ** will be dealt with by next transaction that actually writes something, but should be taken
  ** care of in this trans
  */
  if (journal->j_len == 0) {
    BUG();
  }
  /* if wcount > 0, and we are called to with flush or commit_now,
  ** we wait on j_join_wait.  We will wake up when the last writer has
  ** finished the transaction, and started it on its way to the disk.
  ** Then, we flush the commit or journal list, and just return 0 
  ** because the rest of journal end was already done for this transaction.
  */
  if (atomic_read(&(journal->j_wcount)) > 0) {
    if (flush || commit_now) {
      unsigned trans_id ;

      jl = journal->j_current_jl;
      trans_id = jl->j_trans_id;
      if (wait_on_commit)
        jl->j_state |= LIST_COMMIT_PENDING;
      atomic_set(&(journal->j_jlock), 1) ;
      if (flush) {
        journal->j_next_full_flush = 1 ;
      }
      unlock_journal(p_s_sb) ;

      /* sleep while the current transaction is still j_jlocked */
      while(journal->j_trans_id == trans_id) {
	if (atomic_read(&journal->j_jlock)) {
	    queue_log_writer(p_s_sb);
        } else {
	    lock_journal(p_s_sb);
	    if (journal->j_trans_id == trans_id) {
	        atomic_set(&(journal->j_jlock), 1) ;
	    }
	    unlock_journal(p_s_sb);
	}
      }
      if (journal->j_trans_id == trans_id) {
          BUG();
      }
      if (commit_now && journal_list_still_alive(p_s_sb, trans_id) &&
          wait_on_commit)
      {
	  flush_commit_list(p_s_sb, jl, 1) ;
      }
      return 0 ;
    } 
    unlock_journal(p_s_sb) ;
    return 0 ;
  }

  /* deal with old transactions where we are the last writers */
  now = get_seconds();
  if ((now - journal->j_trans_start_time) > journal->j_max_trans_age) {
    commit_now = 1 ;
    journal->j_next_async_flush = 1 ;
  }
  /* don't batch when someone is waiting on j_join_wait */
  /* don't batch when syncing the commit or flushing the whole trans */
  if (!(journal->j_must_wait > 0) && !(atomic_read(&(journal->j_jlock))) && !flush && !commit_now &&
      (journal->j_len < journal->j_max_batch)  &&
      journal->j_len_alloc < journal->j_max_batch && journal->j_cnode_free > (journal->j_trans_max * 3)) {
    journal->j_bcount++ ;
    unlock_journal(p_s_sb) ;
    return 0 ;
  }

  if (journal->j_start > SB_ONDISK_JOURNAL_SIZE(p_s_sb)) {
    reiserfs_panic(p_s_sb, "journal-003: journal_end: j_start (%ld) is too high\n", journal->j_start) ;
  }
  return 1 ;
}

/*
** Does all the work that makes deleting blocks safe.
** when deleting a block mark BH_JNew, just remove it from the current transaction, clean it's buffer_head and move on.
** 
** otherwise:
** set a bit for the block in the journal bitmap.  That will prevent it from being allocated for unformatted nodes
** before this transaction has finished.
**
** mark any cnodes for this block as BLOCK_FREED, and clear their bh pointers.  That will prevent any old transactions with
** this block from trying to flush to the real location.  Since we aren't removing the cnode from the journal_list_hash,
** the block can't be reallocated yet.
**
** Then remove it from the current transaction, decrementing any counters and filing it on the clean list.
*/
int journal_mark_freed(struct reiserfs_transaction_handle *th, struct super_block *p_s_sb, b_blocknr_t blocknr) {
  struct reiserfs_journal *journal = SB_JOURNAL (p_s_sb);
  struct reiserfs_journal_cnode *cn = NULL ;
  struct buffer_head *bh = NULL ;
  struct reiserfs_list_bitmap *jb = NULL ;
  int cleaned = 0 ;
  BUG_ON (!th->t_trans_id);

  cn = get_journal_hash_dev(p_s_sb, journal->j_hash_table, blocknr);
  if (cn && cn->bh) {
      bh = cn->bh ;
      get_bh(bh) ;
  }
  /* if it is journal new, we just remove it from this transaction */
  if (bh && buffer_journal_new(bh)) {
    clear_buffer_journal_new (bh);
    clear_prepared_bits(bh) ;
    reiserfs_clean_and_file_buffer(bh) ;
    cleaned = remove_from_transaction(p_s_sb, blocknr, cleaned) ;
  } else {
    /* set the bit for this block in the journal bitmap for this transaction */
    jb = journal->j_current_jl->j_list_bitmap;
    if (!jb) {
      reiserfs_panic(p_s_sb, "journal-1702: journal_mark_freed, journal_list_bitmap is NULL\n") ;
    }
    set_bit_in_list_bitmap(p_s_sb, blocknr, jb) ;

    /* Note, the entire while loop is not allowed to schedule.  */

    if (bh) {
      clear_prepared_bits(bh) ;
      reiserfs_clean_and_file_buffer(bh) ;
    }
    cleaned = remove_from_transaction(p_s_sb, blocknr, cleaned) ;

    /* find all older transactions with this block, make sure they don't try to write it out */
    cn = get_journal_hash_dev(p_s_sb,journal->j_list_hash_table,  blocknr) ;
    while (cn) {
      if (p_s_sb == cn->sb && blocknr == cn->blocknr) {
	set_bit(BLOCK_FREED, &cn->state) ;
	if (cn->bh) {
	  if (!cleaned) {
	    /* remove_from_transaction will brelse the buffer if it was 
	    ** in the current trans
	    */
            clear_buffer_journal_dirty (cn->bh);
	    clear_buffer_dirty(cn->bh);
	    clear_buffer_journal_test(cn->bh);
	    cleaned = 1 ;
	    put_bh(cn->bh) ;
	    if (atomic_read(&(cn->bh->b_count)) < 0) {
	      reiserfs_warning (p_s_sb, "journal-2138: cn->bh->b_count < 0");
	    }
	  }
	  if (cn->jlist) { /* since we are clearing the bh, we MUST dec nonzerolen */
	    atomic_dec(&(cn->jlist->j_nonzerolen)) ;
	  }
	  cn->bh = NULL ; 
	} 
      }
      cn = cn->hnext ;
    }
  }

  if (bh) {
    put_bh(bh) ; /* get_hash grabs the buffer */
    if (atomic_read(&(bh->b_count)) < 0) {
      reiserfs_warning (p_s_sb, "journal-2165: bh->b_count < 0");
    }
  }
  return 0 ;
}

void reiserfs_update_inode_transaction(struct inode *inode) {
  struct reiserfs_journal *journal = SB_JOURNAL (inode->i_sb);
  REISERFS_I(inode)->i_jl = journal->j_current_jl;
  REISERFS_I(inode)->i_trans_id = journal->j_trans_id ;
}

/*
 * returns -1 on error, 0 if no commits/barriers were done and 1
 * if a transaction was actually committed and the barrier was done
 */
static int __commit_trans_jl(struct inode *inode, unsigned long id,
                                 struct reiserfs_journal_list *jl)
{
    struct reiserfs_transaction_handle th ;
    struct super_block *sb = inode->i_sb ;
    struct reiserfs_journal *journal = SB_JOURNAL (sb);
    int ret = 0;

    /* is it from the current transaction, or from an unknown transaction? */
    if (id == journal->j_trans_id) {
	jl = journal->j_current_jl;
	/* try to let other writers come in and grow this transaction */
	let_transaction_grow(sb, id);
	if (journal->j_trans_id != id) {
	    goto flush_commit_only;
	}

	ret = journal_begin(&th, sb, 1) ;
	if (ret)
	    return ret;

	/* someone might have ended this transaction while we joined */
	if (journal->j_trans_id != id) {
	    reiserfs_prepare_for_journal(sb, SB_BUFFER_WITH_SB(sb), 1) ;
	    journal_mark_dirty(&th, sb, SB_BUFFER_WITH_SB(sb)) ;
	    ret = journal_end(&th, sb, 1) ;
	    goto flush_commit_only;
	}

	ret = journal_end_sync(&th, sb, 1) ;
	if (!ret)
	    ret = 1;

    } else {
	/* this gets tricky, we have to make sure the journal list in
	 * the inode still exists.  We know the list is still around
	 * if we've got a larger transaction id than the oldest list
	 */
flush_commit_only:
	if (journal_list_still_alive(inode->i_sb, id)) {
	    /*
	     * we only set ret to 1 when we know for sure
	     * the barrier hasn't been started yet on the commit
	     * block.
	     */
	    if (atomic_read(&jl->j_commit_left) > 1)
	        ret = 1;
	    flush_commit_list(sb, jl, 1) ;
	    if (journal->j_errno)
		ret = journal->j_errno;
	}
    }
    /* otherwise the list is gone, and long since committed */
    return ret;
}

int reiserfs_commit_for_inode(struct inode *inode) {
    unsigned long id = REISERFS_I(inode)->i_trans_id;
    struct reiserfs_journal_list *jl = REISERFS_I(inode)->i_jl;

    /* for the whole inode, assume unset id means it was
     * changed in the current transaction.  More conservative
     */
    if (!id || !jl) {
	reiserfs_update_inode_transaction(inode) ;
	id = REISERFS_I(inode)->i_trans_id;
	/* jl will be updated in __commit_trans_jl */
    }

   return __commit_trans_jl(inode, id, jl);
}

void reiserfs_restore_prepared_buffer(struct super_block *p_s_sb, 
                                      struct buffer_head *bh) {
    struct reiserfs_journal *journal = SB_JOURNAL (p_s_sb);
    PROC_INFO_INC( p_s_sb, journal.restore_prepared );
    if (!bh) {
	return ;
    }
    if (test_clear_buffer_journal_restore_dirty (bh) &&
	buffer_journal_dirty(bh)) {
	struct reiserfs_journal_cnode *cn;
	cn = get_journal_hash_dev(p_s_sb,
	                          journal->j_list_hash_table,
				  bh->b_blocknr);
	if (cn && can_dirty(cn)) {
            set_buffer_journal_test (bh);
	    mark_buffer_dirty(bh);
        }
    }
    clear_buffer_journal_prepared (bh);
}

extern struct tree_balance *cur_tb ;
/*
** before we can change a metadata block, we have to make sure it won't
** be written to disk while we are altering it.  So, we must:
** clean it
** wait on it.
** 
*/
int reiserfs_prepare_for_journal(struct super_block *p_s_sb,
                                  struct buffer_head *bh, int wait) {
  PROC_INFO_INC( p_s_sb, journal.prepare );

    if (test_set_buffer_locked(bh)) {
	if (!wait)
	    return 0;
	lock_buffer(bh);
    }
    set_buffer_journal_prepared (bh);
    if (test_clear_buffer_dirty(bh) && buffer_journal_dirty(bh))  {
        clear_buffer_journal_test (bh);
        set_buffer_journal_restore_dirty (bh);
    }
    unlock_buffer(bh);
    return 1;
}

static void flush_old_journal_lists(struct super_block *s) {
    struct reiserfs_journal *journal = SB_JOURNAL (s);
    struct reiserfs_journal_list *jl;
    struct list_head *entry;
    time_t now = get_seconds();

    while(!list_empty(&journal->j_journal_list)) {
        entry = journal->j_journal_list.next;
	jl = JOURNAL_LIST_ENTRY(entry);
	/* this check should always be run, to send old lists to disk */
	if (jl->j_timestamp < (now - (JOURNAL_MAX_TRANS_AGE * 4))) {
	    flush_used_journal_lists(s, jl);
	} else {
	    break;
	}
    }
}

/* 
** long and ugly.  If flush, will not return until all commit
** blocks and all real buffers in the trans are on disk.
** If no_async, won't return until all commit blocks are on disk.
**
** keep reading, there are comments as you go along
**
** If the journal is aborted, we just clean up. Things like flushing
** journal lists, etc just won't happen.
*/
static int do_journal_end(struct reiserfs_transaction_handle *th, struct super_block  * p_s_sb, unsigned long nblocks, 
		          int flags) {
  struct reiserfs_journal *journal = SB_JOURNAL (p_s_sb);
  struct reiserfs_journal_cnode *cn, *next, *jl_cn; 
  struct reiserfs_journal_cnode *last_cn = NULL;
  struct reiserfs_journal_desc *desc ; 
  struct reiserfs_journal_commit *commit ; 
  struct buffer_head *c_bh ; /* commit bh */
  struct buffer_head *d_bh ; /* desc bh */
  int cur_write_start = 0 ; /* start index of current log write */
  int old_start ;
  int i ;
  int flush = flags & FLUSH_ALL ;
  int wait_on_commit = flags & WAIT ;
  struct reiserfs_journal_list *jl, *temp_jl;
  struct list_head *entry, *safe;
  unsigned long jindex;
  unsigned long commit_trans_id;
  int trans_half;

  BUG_ON (th->t_refcount > 1);
  BUG_ON (!th->t_trans_id);

  current->journal_info = th->t_handle_save;
  reiserfs_check_lock_depth(p_s_sb, "journal end");
  if (journal->j_len == 0) {
      reiserfs_prepare_for_journal(p_s_sb, SB_BUFFER_WITH_SB(p_s_sb), 1) ;
      journal_mark_dirty(th, p_s_sb, SB_BUFFER_WITH_SB(p_s_sb)) ;
  }

  lock_journal(p_s_sb) ;
  if (journal->j_next_full_flush) {
    flags |= FLUSH_ALL ;
    flush = 1 ;
  }
  if (journal->j_next_async_flush) {
    flags |= COMMIT_NOW | WAIT;
    wait_on_commit = 1;
  }

  /* check_journal_end locks the journal, and unlocks if it does not return 1 
  ** it tells us if we should continue with the journal_end, or just return
  */
  if (!check_journal_end(th, p_s_sb, nblocks, flags)) {
    p_s_sb->s_dirt = 1;
    wake_queued_writers(p_s_sb);
    reiserfs_async_progress_wait(p_s_sb);
    goto out ;
  }

  /* check_journal_end might set these, check again */
  if (journal->j_next_full_flush) {
    flush = 1 ;
  }

  /*
  ** j must wait means we have to flush the log blocks, and the real blocks for
  ** this transaction
  */
  if (journal->j_must_wait > 0) {
    flush = 1 ;
  }

#ifdef REISERFS_PREALLOCATE
  /* quota ops might need to nest, setup the journal_info pointer for them */
  current->journal_info = th ;
  reiserfs_discard_all_prealloc(th); /* it should not involve new blocks into
				      * the transaction */
  current->journal_info = th->t_handle_save ;
#endif
  
  /* setup description block */
  d_bh = journal_getblk(p_s_sb, SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) + journal->j_start) ;
  set_buffer_uptodate(d_bh);
  desc = (struct reiserfs_journal_desc *)(d_bh)->b_data ;
  memset(d_bh->b_data, 0, d_bh->b_size) ;
  memcpy(get_journal_desc_magic (d_bh), JOURNAL_DESC_MAGIC, 8) ;
  set_desc_trans_id(desc, journal->j_trans_id) ;

  /* setup commit block.  Don't write (keep it clean too) this one until after everyone else is written */
  c_bh =  journal_getblk(p_s_sb, SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) + 
		 ((journal->j_start + journal->j_len + 1) % SB_ONDISK_JOURNAL_SIZE(p_s_sb))) ;
  commit = (struct reiserfs_journal_commit *)c_bh->b_data ;
  memset(c_bh->b_data, 0, c_bh->b_size) ;
  set_commit_trans_id(commit, journal->j_trans_id) ;
  set_buffer_uptodate(c_bh) ;

  /* init this journal list */
  jl = journal->j_current_jl;

  /* we lock the commit before doing anything because
   * we want to make sure nobody tries to run flush_commit_list until
   * the new transaction is fully setup, and we've already flushed the
   * ordered bh list
   */
  down(&jl->j_commit_lock);

  /* save the transaction id in case we need to commit it later */
  commit_trans_id = jl->j_trans_id;

  atomic_set(&jl->j_older_commits_done, 0) ;
  jl->j_trans_id = journal->j_trans_id ;
  jl->j_timestamp = journal->j_trans_start_time ;
  jl->j_commit_bh = c_bh ;
  jl->j_start = journal->j_start ;
  jl->j_len = journal->j_len ;
  atomic_set(&jl->j_nonzerolen, journal->j_len) ;
  atomic_set(&jl->j_commit_left, journal->j_len + 2);
  jl->j_realblock = NULL ;

  /* The ENTIRE FOR LOOP MUST not cause schedule to occur.
  **  for each real block, add it to the journal list hash,
  ** copy into real block index array in the commit or desc block
  */
  trans_half = journal_trans_half(p_s_sb->s_blocksize);
  for (i = 0, cn = journal->j_first ; cn ; cn = cn->next, i++) {
    if (buffer_journaled (cn->bh)) {
      jl_cn = get_cnode(p_s_sb) ;
      if (!jl_cn) {
        reiserfs_panic(p_s_sb, "journal-1676, get_cnode returned NULL\n") ;
      }
      if (i == 0) {
        jl->j_realblock = jl_cn ;
      }
      jl_cn->prev = last_cn ;
      jl_cn->next = NULL ;
      if (last_cn) {
        last_cn->next = jl_cn ;
      }
      last_cn = jl_cn ;
      /* make sure the block we are trying to log is not a block 
         of journal or reserved area */

      if (is_block_in_log_or_reserved_area(p_s_sb, cn->bh->b_blocknr)) {
        reiserfs_panic(p_s_sb, "journal-2332: Trying to log block %lu, which is a log block\n", cn->bh->b_blocknr) ;
      }
      jl_cn->blocknr = cn->bh->b_blocknr ; 
      jl_cn->state = 0 ;
      jl_cn->sb = p_s_sb;
      jl_cn->bh = cn->bh ;
      jl_cn->jlist = jl;
      insert_journal_hash(journal->j_list_hash_table, jl_cn) ;
      if (i < trans_half) {
	desc->j_realblock[i] = cpu_to_le32(cn->bh->b_blocknr) ;
      } else {
	commit->j_realblock[i - trans_half] = cpu_to_le32(cn->bh->b_blocknr) ;
      }
    } else {
      i-- ;
    }
  }
  set_desc_trans_len(desc, journal->j_len) ;
  set_desc_mount_id(desc, journal->j_mount_id) ;
  set_desc_trans_id(desc, journal->j_trans_id) ;
  set_commit_trans_len(commit, journal->j_len);

  /* special check in case all buffers in the journal were marked for not logging */
  if (journal->j_len == 0) {
    BUG();
  }

  /* we're about to dirty all the log blocks, mark the description block
   * dirty now too.  Don't mark the commit block dirty until all the
   * others are on disk
   */
  mark_buffer_dirty(d_bh);

  /* first data block is j_start + 1, so add one to cur_write_start wherever you use it */
  cur_write_start = journal->j_start ;
  cn = journal->j_first ;
  jindex = 1 ; /* start at one so we don't get the desc again */
  while(cn) {
    clear_buffer_journal_new (cn->bh);
    /* copy all the real blocks into log area.  dirty log blocks */
    if (buffer_journaled (cn->bh)) {
      struct buffer_head *tmp_bh ;
      char *addr;
      struct page *page;
      tmp_bh =  journal_getblk(p_s_sb, SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) + 
		       ((cur_write_start + jindex) % SB_ONDISK_JOURNAL_SIZE(p_s_sb))) ;
      set_buffer_uptodate(tmp_bh);
      page = cn->bh->b_page;
      addr = kmap(page);
      memcpy(tmp_bh->b_data, addr + offset_in_page(cn->bh->b_data),
             cn->bh->b_size);
      kunmap(page);
      mark_buffer_dirty(tmp_bh);
      jindex++ ;
      set_buffer_journal_dirty (cn->bh);
      clear_buffer_journaled (cn->bh);
    } else {
      /* JDirty cleared sometime during transaction.  don't log this one */
      reiserfs_warning(p_s_sb, "journal-2048: do_journal_end: BAD, buffer in journal hash, but not JDirty!") ;
      brelse(cn->bh) ;
    }
    next = cn->next ;
    free_cnode(p_s_sb, cn) ;
    cn = next ;
    cond_resched();
  }

  /* we are done  with both the c_bh and d_bh, but
  ** c_bh must be written after all other commit blocks,
  ** so we dirty/relse c_bh in flush_commit_list, with commit_left <= 1.
  */

  journal->j_current_jl = alloc_journal_list(p_s_sb);

  /* now it is safe to insert this transaction on the main list */
  list_add_tail(&jl->j_list, &journal->j_journal_list);
  list_add_tail(&jl->j_working_list, &journal->j_working_list);
  journal->j_num_work_lists++;

  /* reset journal values for the next transaction */
  old_start = journal->j_start ;
  journal->j_start = (journal->j_start + journal->j_len + 2) % SB_ONDISK_JOURNAL_SIZE(p_s_sb);
  atomic_set(&(journal->j_wcount), 0) ;
  journal->j_bcount = 0 ;
  journal->j_last = NULL ;
  journal->j_first = NULL ;
  journal->j_len = 0 ;
  journal->j_trans_start_time = 0 ;
  journal->j_trans_id++ ;
  journal->j_current_jl->j_trans_id = journal->j_trans_id;
  journal->j_must_wait = 0 ;
  journal->j_len_alloc = 0 ;
  journal->j_next_full_flush = 0 ;
  journal->j_next_async_flush = 0 ;
  init_journal_hash(p_s_sb) ; 

  // make sure reiserfs_add_jh sees the new current_jl before we
  // write out the tails
  smp_mb();

  /* tail conversion targets have to hit the disk before we end the
   * transaction.  Otherwise a later transaction might repack the tail
   * before this transaction commits, leaving the data block unflushed and
   * clean, if we crash before the later transaction commits, the data block
   * is lost.
   */
  if (!list_empty(&jl->j_tail_bh_list)) {
      unlock_kernel();
      write_ordered_buffers(&journal->j_dirty_buffers_lock,
			    journal, jl, &jl->j_tail_bh_list);
      lock_kernel();
  }
  if (!list_empty(&jl->j_tail_bh_list))
      BUG();
  up(&jl->j_commit_lock);

  /* honor the flush wishes from the caller, simple commits can
  ** be done outside the journal lock, they are done below
  **
  ** if we don't flush the commit list right now, we put it into
  ** the work queue so the people waiting on the async progress work
  ** queue don't wait for this proc to flush journal lists and such.
  */
  if (flush) {
    flush_commit_list(p_s_sb, jl, 1) ;
    flush_journal_list(p_s_sb, jl, 1) ;
  } else if (!(jl->j_state & LIST_COMMIT_PENDING))
    queue_delayed_work(commit_wq, &journal->j_work, HZ/10);


  /* if the next transaction has any chance of wrapping, flush 
  ** transactions that might get overwritten.  If any journal lists are very 
  ** old flush them as well.  
  */
first_jl:
  list_for_each_safe(entry, safe, &journal->j_journal_list) {
    temp_jl = JOURNAL_LIST_ENTRY(entry);
    if (journal->j_start <= temp_jl->j_start) {
      if ((journal->j_start + journal->j_trans_max + 1) >=
          temp_jl->j_start)
      {
	flush_used_journal_lists(p_s_sb, temp_jl);
	goto first_jl;
      } else if ((journal->j_start +
                  journal->j_trans_max + 1) <
		  SB_ONDISK_JOURNAL_SIZE(p_s_sb))
      {
          /* if we don't cross into the next transaction and we don't
	   * wrap, there is no way we can overlap any later transactions
	   * break now
	   */
	  break;
      }
    } else if ((journal->j_start +
                journal->j_trans_max + 1) >
		SB_ONDISK_JOURNAL_SIZE(p_s_sb))
    {
      if (((journal->j_start + journal->j_trans_max + 1) %
            SB_ONDISK_JOURNAL_SIZE(p_s_sb)) >= temp_jl->j_start)
      {
	flush_used_journal_lists(p_s_sb, temp_jl);
	goto first_jl;
      } else {
	  /* we don't overlap anything from out start to the end of the
	   * log, and our wrapped portion doesn't overlap anything at
	   * the start of the log.  We can break
	   */
	  break;
      }
    }
  }
  flush_old_journal_lists(p_s_sb);

  journal->j_current_jl->j_list_bitmap = get_list_bitmap(p_s_sb, journal->j_current_jl) ;

  if (!(journal->j_current_jl->j_list_bitmap)) {
    reiserfs_panic(p_s_sb, "journal-1996: do_journal_end, could not get a list bitmap\n") ;
  }

  atomic_set(&(journal->j_jlock), 0) ;
  unlock_journal(p_s_sb) ;
  /* wake up any body waiting to join. */
  clear_bit(J_WRITERS_QUEUED, &journal->j_state);
  wake_up(&(journal->j_join_wait)) ;

  if (!flush && wait_on_commit &&
      journal_list_still_alive(p_s_sb, commit_trans_id)) {
	  flush_commit_list(p_s_sb, jl, 1) ;
  }
out:
  reiserfs_check_lock_depth(p_s_sb, "journal end2");

  memset (th, 0, sizeof (*th));
  /* Re-set th->t_super, so we can properly keep track of how many
   * persistent transactions there are. We need to do this so if this
   * call is part of a failed restart_transaction, we can free it later */
  th->t_super = p_s_sb;

  return journal->j_errno;
}

static void
__reiserfs_journal_abort_hard (struct super_block *sb)
{
    struct reiserfs_journal *journal = SB_JOURNAL (sb);
    if (test_bit (J_ABORTED, &journal->j_state))
        return;

    printk (KERN_CRIT "REISERFS: Aborting journal for filesystem on %s\n",
                      reiserfs_bdevname (sb));

    sb->s_flags |= MS_RDONLY;
    set_bit (J_ABORTED, &journal->j_state);

#ifdef CONFIG_REISERFS_CHECK
    dump_stack();
#endif
}

static void
__reiserfs_journal_abort_soft (struct super_block *sb, int errno)
{
    struct reiserfs_journal *journal = SB_JOURNAL (sb);
    if (test_bit (J_ABORTED, &journal->j_state))
        return;

    if (!journal->j_errno)
        journal->j_errno = errno;

    __reiserfs_journal_abort_hard (sb);
}

void
reiserfs_journal_abort (struct super_block *sb, int errno)
{
    return __reiserfs_journal_abort_soft (sb, errno);
}
