/*
** 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;
		} else  {
			/* ok */
			journal->j_dev_bd = I_BDEV(jdev_inode);
			set_blocksize(journal->j_dev_bd, super->s_blocksize);
		}
	} 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 );
	}
	if( result != 0 ) {
		release_journal_dev( super, journal );
	}
	reiserfs_info(super, "journal_init_dev: journal device: %s\n",
		bdevname(journal->j_dev_bd, b));
	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) && (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);
}
