reiserfs: Fix recursive lock on lchown
[safe/jmp/linux-2.6] / fs / reiserfs / journal.c
index 4f78746..83ac4d3 100644 (file)
@@ -97,7 +97,7 @@ 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);
+                       struct super_block *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,
@@ -113,12 +113,12 @@ enum {
 };
 
 static int do_journal_begin_r(struct reiserfs_transaction_handle *th,
-                             struct super_block *p_s_sb,
+                             struct super_block *sb,
                              unsigned long nblocks, int join);
 
-static void init_journal_hash(struct super_block *p_s_sb)
+static void init_journal_hash(struct super_block *sb)
 {
-       struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
+       struct reiserfs_journal *journal = SB_JOURNAL(sb);
        memset(journal->j_hash_table, 0,
               JOURNAL_HASH_SIZE * sizeof(struct reiserfs_journal_cnode *));
 }
@@ -145,7 +145,7 @@ static void disable_barrier(struct super_block *s)
 }
 
 static struct reiserfs_bitmap_node *allocate_bitmap_node(struct super_block
-                                                        *p_s_sb)
+                                                        *sb)
 {
        struct reiserfs_bitmap_node *bn;
        static int id;
@@ -154,7 +154,7 @@ static struct reiserfs_bitmap_node *allocate_bitmap_node(struct super_block
        if (!bn) {
                return NULL;
        }
-       bn->data = kzalloc(p_s_sb->s_blocksize, GFP_NOFS);
+       bn->data = kzalloc(sb->s_blocksize, GFP_NOFS);
        if (!bn->data) {
                kfree(bn);
                return NULL;
@@ -164,9 +164,9 @@ static struct reiserfs_bitmap_node *allocate_bitmap_node(struct super_block
        return bn;
 }
 
-static struct reiserfs_bitmap_node *get_bitmap_node(struct super_block *p_s_sb)
+static struct reiserfs_bitmap_node *get_bitmap_node(struct super_block *sb)
 {
-       struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
+       struct reiserfs_journal *journal = SB_JOURNAL(sb);
        struct reiserfs_bitmap_node *bn = NULL;
        struct list_head *entry = journal->j_bitmap_nodes.next;
 
@@ -176,21 +176,21 @@ static struct reiserfs_bitmap_node *get_bitmap_node(struct super_block *p_s_sb)
        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);
+               memset(bn->data, 0, sb->s_blocksize);
                journal->j_free_bitmap_nodes--;
                return bn;
        }
-       bn = allocate_bitmap_node(p_s_sb);
+       bn = allocate_bitmap_node(sb);
        if (!bn) {
                yield();
                goto repeat;
        }
        return bn;
 }
-static inline void free_bitmap_node(struct super_block *p_s_sb,
+static inline void free_bitmap_node(struct super_block *sb,
                                    struct reiserfs_bitmap_node *bn)
 {
-       struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
+       struct reiserfs_journal *journal = SB_JOURNAL(sb);
        journal->j_used_bitmap_nodes--;
        if (journal->j_free_bitmap_nodes > REISERFS_MAX_BITMAP_NODES) {
                kfree(bn->data);
@@ -201,13 +201,13 @@ static inline void free_bitmap_node(struct super_block *p_s_sb,
        }
 }
 
-static void allocate_bitmap_nodes(struct super_block *p_s_sb)
+static void allocate_bitmap_nodes(struct super_block *sb)
 {
        int i;
-       struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
+       struct reiserfs_journal *journal = SB_JOURNAL(sb);
        struct reiserfs_bitmap_node *bn = NULL;
        for (i = 0; i < REISERFS_MIN_BITMAP_NODES; i++) {
-               bn = allocate_bitmap_node(p_s_sb);
+               bn = allocate_bitmap_node(sb);
                if (bn) {
                        list_add(&bn->list, &journal->j_bitmap_nodes);
                        journal->j_free_bitmap_nodes++;
@@ -217,30 +217,30 @@ static void allocate_bitmap_nodes(struct super_block *p_s_sb)
        }
 }
 
-static int set_bit_in_list_bitmap(struct super_block *p_s_sb,
+static int set_bit_in_list_bitmap(struct super_block *sb,
                                  b_blocknr_t block,
                                  struct reiserfs_list_bitmap *jb)
 {
-       unsigned int bmap_nr = block / (p_s_sb->s_blocksize << 3);
-       unsigned int bit_nr = block % (p_s_sb->s_blocksize << 3);
+       unsigned int bmap_nr = block / (sb->s_blocksize << 3);
+       unsigned int bit_nr = block % (sb->s_blocksize << 3);
 
        if (!jb->bitmaps[bmap_nr]) {
-               jb->bitmaps[bmap_nr] = get_bitmap_node(p_s_sb);
+               jb->bitmaps[bmap_nr] = get_bitmap_node(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,
+static void cleanup_bitmap_list(struct super_block *sb,
                                struct reiserfs_list_bitmap *jb)
 {
        int i;
        if (jb->bitmaps == NULL)
                return;
 
-       for (i = 0; i < reiserfs_bmap_count(p_s_sb); i++) {
+       for (i = 0; i < reiserfs_bmap_count(sb); i++) {
                if (jb->bitmaps[i]) {
-                       free_bitmap_node(p_s_sb, jb->bitmaps[i]);
+                       free_bitmap_node(sb, jb->bitmaps[i]);
                        jb->bitmaps[i] = NULL;
                }
        }
@@ -249,7 +249,7 @@ static void cleanup_bitmap_list(struct super_block *p_s_sb,
 /*
 ** only call this on FS unmount.
 */
-static int free_list_bitmaps(struct super_block *p_s_sb,
+static int free_list_bitmaps(struct super_block *sb,
                             struct reiserfs_list_bitmap *jb_array)
 {
        int i;
@@ -257,16 +257,16 @@ static int free_list_bitmaps(struct super_block *p_s_sb,
        for (i = 0; i < JOURNAL_NUM_BITMAPS; i++) {
                jb = jb_array + i;
                jb->journal_list = NULL;
-               cleanup_bitmap_list(p_s_sb, jb);
+               cleanup_bitmap_list(sb, jb);
                vfree(jb->bitmaps);
                jb->bitmaps = NULL;
        }
        return 0;
 }
 
-static int free_bitmap_nodes(struct super_block *p_s_sb)
+static int free_bitmap_nodes(struct super_block *sb)
 {
-       struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
+       struct reiserfs_journal *journal = SB_JOURNAL(sb);
        struct list_head *next = journal->j_bitmap_nodes.next;
        struct reiserfs_bitmap_node *bn;
 
@@ -286,7 +286,7 @@ static int free_bitmap_nodes(struct super_block *p_s_sb)
 ** 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,
+int reiserfs_allocate_list_bitmaps(struct super_block *sb,
                                   struct reiserfs_list_bitmap *jb_array,
                                   unsigned int bmap_nr)
 {
@@ -300,7 +300,7 @@ int reiserfs_allocate_list_bitmaps(struct super_block *p_s_sb,
                jb->journal_list = NULL;
                jb->bitmaps = vmalloc(mem);
                if (!jb->bitmaps) {
-                       reiserfs_warning(p_s_sb, "clm-2000", "unable to "
+                       reiserfs_warning(sb, "clm-2000", "unable to "
                                         "allocate bitmaps for journal lists");
                        failed = 1;
                        break;
@@ -308,7 +308,7 @@ int reiserfs_allocate_list_bitmaps(struct super_block *p_s_sb,
                memset(jb->bitmaps, 0, mem);
        }
        if (failed) {
-               free_list_bitmaps(p_s_sb, jb_array);
+               free_list_bitmaps(sb, jb_array);
                return -1;
        }
        return 0;
@@ -318,12 +318,12 @@ int reiserfs_allocate_list_bitmaps(struct super_block *p_s_sb,
 ** 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,
+static struct reiserfs_list_bitmap *get_list_bitmap(struct super_block *sb,
                                                    struct reiserfs_journal_list
                                                    *jl)
 {
        int i, j;
-       struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
+       struct reiserfs_journal *journal = SB_JOURNAL(sb);
        struct reiserfs_list_bitmap *jb = NULL;
 
        for (j = 0; j < (JOURNAL_NUM_BITMAPS * 3); j++) {
@@ -331,7 +331,7 @@ static struct reiserfs_list_bitmap *get_list_bitmap(struct super_block *p_s_sb,
                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,
+                       flush_commit_list(sb,
                                          journal->j_list_bitmap[i].
                                          journal_list, 1);
                        if (!journal->j_list_bitmap[i].journal_list) {
@@ -378,12 +378,12 @@ static struct reiserfs_journal_cnode *allocate_cnodes(int num_cnodes)
 /*
 ** 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)
+static struct reiserfs_journal_cnode *get_cnode(struct super_block *sb)
 {
        struct reiserfs_journal_cnode *cn;
-       struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
+       struct reiserfs_journal *journal = SB_JOURNAL(sb);
 
-       reiserfs_check_lock_depth(p_s_sb, "get_cnode");
+       reiserfs_check_lock_depth(sb, "get_cnode");
 
        if (journal->j_cnode_free <= 0) {
                return NULL;
@@ -405,12 +405,12 @@ static struct reiserfs_journal_cnode *get_cnode(struct super_block *p_s_sb)
 /*
 ** returns a cnode to the free list
 */
-static void free_cnode(struct super_block *p_s_sb,
+static void free_cnode(struct super_block *sb,
                       struct reiserfs_journal_cnode *cn)
 {
-       struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
+       struct reiserfs_journal *journal = SB_JOURNAL(sb);
 
-       reiserfs_check_lock_depth(p_s_sb, "free_cnode");
+       reiserfs_check_lock_depth(sb, "free_cnode");
 
        journal->j_cnode_used--;
        journal->j_cnode_free++;
@@ -429,21 +429,6 @@ static void clear_prepared_bits(struct buffer_head *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, "journal-1", "%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
@@ -481,11 +466,11 @@ static inline struct reiserfs_journal_cnode *get_journal_hash_dev(struct
 ** reject it on the next call to reiserfs_in_journal
 **
 */
-int reiserfs_in_journal(struct super_block *p_s_sb,
+int reiserfs_in_journal(struct super_block *sb,
                        unsigned 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 *journal = SB_JOURNAL(sb);
        struct reiserfs_journal_cnode *cn;
        struct reiserfs_list_bitmap *jb;
        int i;
@@ -493,14 +478,14 @@ int reiserfs_in_journal(struct super_block *p_s_sb,
 
        *next_zero_bit = 0;     /* always start this at zero. */
 
-       PROC_INFO_INC(p_s_sb, journal.in_journal);
+       PROC_INFO_INC(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);
+                       PROC_INFO_INC(sb, journal.in_journal_bitmap);
                        jb = journal->j_list_bitmap + i;
                        if (jb->journal_list && jb->bitmaps[bmap_nr] &&
                            test_bit(bit_nr,
@@ -510,28 +495,28 @@ int reiserfs_in_journal(struct super_block *p_s_sb,
                                    find_next_zero_bit((unsigned long *)
                                                       (jb->bitmaps[bmap_nr]->
                                                        data),
-                                                      p_s_sb->s_blocksize << 3,
+                                                      sb->s_blocksize << 3,
                                                       bit_nr + 1);
                                return 1;
                        }
                }
        }
 
-       bl = bmap_nr * (p_s_sb->s_blocksize << 3) + bit_nr;
+       bl = bmap_nr * (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))) {
+               get_journal_hash_dev(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))) {
+       if ((cn = get_journal_hash_dev(sb, journal->j_hash_table, bl))) {
                BUG();
                return 1;
        }
 
-       PROC_INFO_INC(p_s_sb, journal.in_journal_reusable);
+       PROC_INFO_INC(sb, journal.in_journal_reusable);
        /* safe for reuse */
        return 0;
 }
@@ -553,16 +538,17 @@ static inline void insert_journal_hash(struct reiserfs_journal_cnode **table,
 }
 
 /* lock the current transaction */
-static inline void lock_journal(struct super_block *p_s_sb)
+static inline void lock_journal(struct super_block *sb)
 {
-       PROC_INFO_INC(p_s_sb, journal.lock_journal);
-       mutex_lock(&SB_JOURNAL(p_s_sb)->j_mutex);
+       PROC_INFO_INC(sb, journal.lock_journal);
+
+       reiserfs_mutex_lock_safe(&SB_JOURNAL(sb)->j_mutex, sb);
 }
 
 /* unlock the current transaction */
-static inline void unlock_journal(struct super_block *p_s_sb)
+static inline void unlock_journal(struct super_block *sb)
 {
-       mutex_unlock(&SB_JOURNAL(p_s_sb)->j_mutex);
+       mutex_unlock(&SB_JOURNAL(sb)->j_mutex);
 }
 
 static inline void get_journal_list(struct reiserfs_journal_list *jl)
@@ -586,13 +572,13 @@ static inline void put_journal_list(struct super_block *s,
 ** 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,
+static void cleanup_freed_for_journal_list(struct super_block *sb,
                                           struct reiserfs_journal_list *jl)
 {
 
        struct reiserfs_list_bitmap *jb = jl->j_list_bitmap;
        if (jb) {
-               cleanup_bitmap_list(p_s_sb, jb);
+               cleanup_bitmap_list(sb, jb);
        }
        jl->j_list_bitmap->journal_list = NULL;
        jl->j_list_bitmap = NULL;
@@ -708,7 +694,9 @@ static void check_barrier_completion(struct super_block *s,
                disable_barrier(s);
                set_buffer_uptodate(bh);
                set_buffer_dirty(bh);
+               reiserfs_write_unlock(s);
                sync_dirty_buffer(bh);
+               reiserfs_write_lock(s);
        }
 }
 
@@ -996,8 +984,13 @@ static 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))
-               congestion_wait(WRITE, HZ / 10);
+
+       if (atomic_read(&j->j_async_throttle)) {
+               reiserfs_write_unlock(s);
+               congestion_wait(BLK_RW_ASYNC, HZ / 10);
+               reiserfs_write_lock(s);
+       }
+
        return 0;
 }
 
@@ -1043,7 +1036,8 @@ static int flush_commit_list(struct super_block *s,
        }
 
        /* make sure nobody is trying to flush this one at the same time */
-       mutex_lock(&jl->j_commit_mutex);
+       reiserfs_mutex_lock_safe(&jl->j_commit_mutex, s);
+
        if (!journal_list_still_alive(s, trans_id)) {
                mutex_unlock(&jl->j_commit_mutex);
                goto put_jl;
@@ -1061,12 +1055,17 @@ static int flush_commit_list(struct super_block *s,
 
        if (!list_empty(&jl->j_bh_list)) {
                int ret;
-               unlock_kernel();
+
+               /*
+                * We might sleep in numerous places inside
+                * write_ordered_buffers. Relax the write lock.
+                */
+               reiserfs_write_unlock(s);
                ret = write_ordered_buffers(&journal->j_dirty_buffers_lock,
                                            journal, jl, &jl->j_bh_list);
                if (ret < 0 && retval == 0)
                        retval = ret;
-               lock_kernel();
+               reiserfs_write_lock(s);
        }
        BUG_ON(!list_empty(&jl->j_bh_list));
        /*
@@ -1085,8 +1084,11 @@ static int flush_commit_list(struct super_block *s,
                    SB_ONDISK_JOURNAL_SIZE(s);
                tbh = journal_find_get_block(s, bn);
                if (tbh) {
-                       if (buffer_dirty(tbh))
-                           ll_rw_block(WRITE, 1, &tbh) ;
+                       if (buffer_dirty(tbh)) {
+                           reiserfs_write_unlock(s);
+                           ll_rw_block(WRITE, 1, &tbh);
+                           reiserfs_write_lock(s);
+                       }
                        put_bh(tbh) ;
                }
        }
@@ -1114,12 +1116,19 @@ static int flush_commit_list(struct super_block *s,
                bn = SB_ONDISK_JOURNAL_1st_BLOCK(s) +
                    (jl->j_start + i) % SB_ONDISK_JOURNAL_SIZE(s);
                tbh = journal_find_get_block(s, bn);
+
+               reiserfs_write_unlock(s);
                wait_on_buffer(tbh);
+               reiserfs_write_lock(s);
                // 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 */
+               /* redundant, sync_dirty_buffer() checks */
+               if (buffer_dirty(tbh)) {
+                       reiserfs_write_unlock(s);
                        sync_dirty_buffer(tbh);
+                       reiserfs_write_lock(s);
+               }
                if (unlikely(!buffer_uptodate(tbh))) {
 #ifdef CONFIG_REISERFS_CHECK
                        reiserfs_warning(s, "journal-601",
@@ -1143,10 +1152,15 @@ static int flush_commit_list(struct super_block *s,
                        if (buffer_dirty(jl->j_commit_bh))
                                BUG();
                        mark_buffer_dirty(jl->j_commit_bh) ;
+                       reiserfs_write_unlock(s);
                        sync_dirty_buffer(jl->j_commit_bh) ;
+                       reiserfs_write_lock(s);
                }
-       } else
+       } else {
+               reiserfs_write_unlock(s);
                wait_on_buffer(jl->j_commit_bh);
+               reiserfs_write_lock(s);
+       }
 
        check_barrier_completion(s, jl->j_commit_bh);
 
@@ -1237,11 +1251,11 @@ static void remove_journal_hash(struct super_block *,
 ** 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,
+static void remove_all_from_journal_list(struct super_block *sb,
                                         struct reiserfs_journal_list *jl,
                                         int debug)
 {
-       struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
+       struct reiserfs_journal *journal = SB_JOURNAL(sb);
        struct reiserfs_journal_cnode *cn, *last;
        cn = jl->j_realblock;
 
@@ -1251,18 +1265,18 @@ static void remove_all_from_journal_list(struct super_block *p_s_sb,
        while (cn) {
                if (cn->blocknr != 0) {
                        if (debug) {
-                               reiserfs_warning(p_s_sb, "reiserfs-2201",
+                               reiserfs_warning(sb, "reiserfs-2201",
                                                 "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,
+                       remove_journal_hash(sb, journal->j_list_hash_table,
                                            jl, cn->blocknr, 1);
                }
                last = cn;
                cn = cn->next;
-               free_cnode(p_s_sb, last);
+               free_cnode(sb, last);
        }
        jl->j_realblock = NULL;
 }
@@ -1274,22 +1288,24 @@ static void remove_all_from_journal_list(struct super_block *p_s_sb,
 ** 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,
+static int _update_journal_header_block(struct super_block *sb,
                                        unsigned long offset,
                                        unsigned int trans_id)
 {
        struct reiserfs_journal_header *jh;
-       struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
+       struct reiserfs_journal *journal = SB_JOURNAL(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))) {
+                       reiserfs_write_unlock(sb);
                        wait_on_buffer((journal->j_header_bh));
+                       reiserfs_write_lock(sb);
                        if (unlikely(!buffer_uptodate(journal->j_header_bh))) {
 #ifdef CONFIG_REISERFS_CHECK
-                               reiserfs_warning(p_s_sb, "journal-699",
+                               reiserfs_warning(sb, "journal-699",
                                                 "buffer write failed");
 #endif
                                return -EIO;
@@ -1303,24 +1319,28 @@ static int _update_journal_header_block(struct super_block *p_s_sb,
                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)) {
+               if (reiserfs_barrier_flush(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);
+                               disable_barrier(sb);
                                goto sync;
                        }
+                       reiserfs_write_unlock(sb);
                        wait_on_buffer(journal->j_header_bh);
-                       check_barrier_completion(p_s_sb, journal->j_header_bh);
+                       reiserfs_write_lock(sb);
+                       check_barrier_completion(sb, journal->j_header_bh);
                } else {
                      sync:
                        set_buffer_dirty(journal->j_header_bh);
+                       reiserfs_write_unlock(sb);
                        sync_dirty_buffer(journal->j_header_bh);
+                       reiserfs_write_lock(sb);
                }
                if (!buffer_uptodate(journal->j_header_bh)) {
-                       reiserfs_warning(p_s_sb, "journal-837",
+                       reiserfs_warning(sb, "journal-837",
                                         "IO error during journal replay");
                        return -EIO;
                }
@@ -1328,23 +1348,23 @@ static int _update_journal_header_block(struct super_block *p_s_sb,
        return 0;
 }
 
-static int update_journal_header_block(struct super_block *p_s_sb,
+static int update_journal_header_block(struct super_block *sb,
                                       unsigned long offset,
                                       unsigned int trans_id)
 {
-       return _update_journal_header_block(p_s_sb, offset, trans_id);
+       return _update_journal_header_block(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,
+static int flush_older_journal_lists(struct super_block *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);
+       struct reiserfs_journal *journal = SB_JOURNAL(sb);
        unsigned int trans_id = jl->j_trans_id;
 
        /* we know we are the only ones flushing things, no extra race
@@ -1359,7 +1379,7 @@ static int flush_older_journal_lists(struct super_block *p_s_sb,
        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);
+               flush_journal_list(sb, other_jl, 0);
 
                /* other_jl is now deleted from the list */
                goto restart;
@@ -1409,7 +1429,7 @@ static int flush_journal_list(struct super_block *s,
 
        /* if flushall == 0, the lock is already held */
        if (flushall) {
-               mutex_lock(&journal->j_flush_mutex);
+               reiserfs_mutex_lock_safe(&journal->j_flush_mutex, s);
        } else if (mutex_trylock(&journal->j_flush_mutex)) {
                BUG();
        }
@@ -1553,7 +1573,11 @@ static int flush_journal_list(struct super_block *s,
                                        reiserfs_panic(s, "journal-1011",
                                                       "cn->bh is NULL");
                                }
+
+                               reiserfs_write_unlock(s);
                                wait_on_buffer(cn->bh);
+                               reiserfs_write_lock(s);
+
                                if (!cn->bh) {
                                        reiserfs_panic(s, "journal-1012",
                                                       "cn->bh is NULL");
@@ -1769,7 +1793,7 @@ static int kupdate_transactions(struct super_block *s,
        struct reiserfs_journal *journal = SB_JOURNAL(s);
        chunk.nr = 0;
 
-       mutex_lock(&journal->j_flush_mutex);
+       reiserfs_mutex_lock_safe(&journal->j_flush_mutex, s);
        if (!journal_list_still_alive(s, orig_trans_id)) {
                goto done;
        }
@@ -1908,22 +1932,22 @@ void remove_journal_hash(struct super_block *sb,
        }
 }
 
-static void free_journal_ram(struct super_block *p_s_sb)
+static void free_journal_ram(struct super_block *sb)
 {
-       struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
+       struct reiserfs_journal *journal = SB_JOURNAL(sb);
        kfree(journal->j_current_jl);
        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 */
+       free_list_bitmaps(sb, journal->j_list_bitmap);
+       free_bitmap_nodes(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);
+       release_journal_dev(sb, journal);
        vfree(journal);
 }
 
@@ -1932,27 +1956,27 @@ static void free_journal_ram(struct super_block *p_s_sb)
 ** 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 super_block *sb, int error)
 {
        struct reiserfs_transaction_handle myth;
        int flushed = 0;
-       struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
+       struct reiserfs_journal *journal = SB_JOURNAL(sb);
 
        /* we only want to flush out transactions if we were called with error == 0
         */
-       if (!error && !(p_s_sb->s_flags & MS_RDONLY)) {
+       if (!error && !(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);
+               do_journal_end(th, 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),
+               if (!journal_join(&myth, sb, 1)) {
+                       reiserfs_prepare_for_journal(sb,
+                                                    SB_BUFFER_WITH_SB(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);
+                       journal_mark_dirty(&myth, sb,
+                                          SB_BUFFER_WITH_SB(sb));
+                       do_journal_end(&myth, sb, 1, FLUSH_ALL);
                        flushed = 1;
                }
        }
@@ -1960,26 +1984,35 @@ static int do_journal_release(struct reiserfs_transaction_handle *th,
        /* 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),
+               if (!journal_join_abort(&myth, sb, 1)) {
+                       reiserfs_prepare_for_journal(sb,
+                                                    SB_BUFFER_WITH_SB(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);
+                       journal_mark_dirty(&myth, sb,
+                                          SB_BUFFER_WITH_SB(sb));
+                       do_journal_end(&myth, sb, 1, FLUSH_ALL);
                }
        }
 
        reiserfs_mounted_fs_count--;
        /* wait for all commits to finish */
-       cancel_delayed_work(&SB_JOURNAL(p_s_sb)->j_work);
+       cancel_delayed_work(&SB_JOURNAL(sb)->j_work);
+
+       /*
+        * We must release the write lock here because
+        * the workqueue job (flush_async_commit) needs this lock
+        */
+       reiserfs_write_unlock(sb);
        flush_workqueue(commit_wq);
+
        if (!reiserfs_mounted_fs_count) {
                destroy_workqueue(commit_wq);
                commit_wq = NULL;
        }
 
-       free_journal_ram(p_s_sb);
+       free_journal_ram(sb);
+
+       reiserfs_write_lock(sb);
 
        return 0;
 }
@@ -1988,28 +2021,28 @@ static int do_journal_release(struct reiserfs_transaction_handle *th,
 ** 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)
+                   struct super_block *sb)
 {
-       return do_journal_release(th, p_s_sb, 0);
+       return do_journal_release(th, 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)
+                         struct super_block *sb)
 {
-       return do_journal_release(th, p_s_sb, 1);
+       return do_journal_release(th, 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,
+static int journal_compare_desc_commit(struct super_block *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) > SB_JOURNAL(sb)->j_trans_max ||
            get_commit_trans_len(commit) <= 0) {
                return 1;
        }
@@ -2020,7 +2053,7 @@ static int journal_compare_desc_commit(struct super_block *p_s_sb,
 ** 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,
+static int journal_transaction_is_valid(struct super_block *sb,
                                        struct buffer_head *d_bh,
                                        unsigned int *oldest_invalid_trans_id,
                                        unsigned long *newest_mount_id)
@@ -2038,7 +2071,7 @@ static int journal_transaction_is_valid(struct super_block *p_s_sb,
            && !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,
+                       reiserfs_debug(sb, REISERFS_DEBUG_CODE,
                                       "journal-986: transaction "
                                       "is valid returning because trans_id %d is greater than "
                                       "oldest_invalid %lu",
@@ -2048,7 +2081,7 @@ static int journal_transaction_is_valid(struct super_block *p_s_sb,
                }
                if (newest_mount_id
                    && *newest_mount_id > get_desc_mount_id(desc)) {
-                       reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE,
+                       reiserfs_debug(sb, REISERFS_DEBUG_CODE,
                                       "journal-1087: transaction "
                                       "is valid returning because mount_id %d is less than "
                                       "newest_mount_id %lu",
@@ -2056,37 +2089,37 @@ static int journal_transaction_is_valid(struct super_block *p_s_sb,
                                       *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",
+               if (get_desc_trans_len(desc) > SB_JOURNAL(sb)->j_trans_max) {
+                       reiserfs_warning(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);
+               offset = d_bh->b_blocknr - SB_ONDISK_JOURNAL_1st_BLOCK(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) +
+                   journal_bread(sb,
+                                 SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
                                  ((offset + get_desc_trans_len(desc) +
-                                   1) % SB_ONDISK_JOURNAL_SIZE(p_s_sb)));
+                                   1) % SB_ONDISK_JOURNAL_SIZE(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,
+               if (journal_compare_desc_commit(sb, desc, commit)) {
+                       reiserfs_debug(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),
+                                      SB_ONDISK_JOURNAL_1st_BLOCK(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,
+                               reiserfs_debug(sb, REISERFS_DEBUG_CODE,
                                               "journal-1004: "
                                               "transaction_is_valid setting oldest invalid trans_id "
                                               "to %d",
@@ -2095,11 +2128,11 @@ static int journal_transaction_is_valid(struct super_block *p_s_sb,
                        return -1;
                }
                brelse(c_bh);
-               reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE,
+               reiserfs_debug(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),
+                              SB_ONDISK_JOURNAL_1st_BLOCK(sb),
                               get_desc_trans_len(desc),
                               get_desc_trans_id(desc));
                return 1;
@@ -2121,13 +2154,13 @@ static void brelse_array(struct buffer_head **heads, int num)
 ** 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,
+static int journal_read_transaction(struct super_block *sb,
                                    unsigned long cur_dblock,
                                    unsigned long oldest_start,
                                    unsigned int oldest_trans_id,
                                    unsigned long newest_mount_id)
 {
-       struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
+       struct reiserfs_journal *journal = SB_JOURNAL(sb);
        struct reiserfs_journal_desc *desc;
        struct reiserfs_journal_commit *commit;
        unsigned int trans_id = 0;
@@ -2139,45 +2172,45 @@ static int journal_read_transaction(struct super_block *p_s_sb,
        int i;
        int trans_half;
 
-       d_bh = journal_bread(p_s_sb, cur_dblock);
+       d_bh = journal_bread(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: "
+       trans_offset = d_bh->b_blocknr - SB_ONDISK_JOURNAL_1st_BLOCK(sb);
+       reiserfs_debug(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),
+                      d_bh->b_blocknr - SB_ONDISK_JOURNAL_1st_BLOCK(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: "
+               reiserfs_debug(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));
+                              SB_ONDISK_JOURNAL_1st_BLOCK(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: "
+               reiserfs_debug(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) +
+       c_bh = journal_bread(sb, SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
                             ((trans_offset + get_desc_trans_len(desc) + 1) %
-                             SB_ONDISK_JOURNAL_SIZE(p_s_sb)));
+                             SB_ONDISK_JOURNAL_SIZE(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,
+       if (journal_compare_desc_commit(sb, desc, commit)) {
+               reiserfs_debug(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),
+                              SB_ONDISK_JOURNAL_1st_BLOCK(sb),
                               get_commit_trans_id(commit),
                               get_commit_trans_len(commit));
                brelse(c_bh);
@@ -2195,30 +2228,30 @@ static int journal_read_transaction(struct super_block *p_s_sb,
                brelse(d_bh);
                kfree(log_blocks);
                kfree(real_blocks);
-               reiserfs_warning(p_s_sb, "journal-1169",
+               reiserfs_warning(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);
+       trans_half = journal_trans_half(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) +
+                   journal_getblk(sb,
+                                  SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
                                   (trans_offset + 1 +
-                                   i) % SB_ONDISK_JOURNAL_SIZE(p_s_sb));
+                                   i) % SB_ONDISK_JOURNAL_SIZE(sb));
                if (i < trans_half) {
                        real_blocks[i] =
-                           sb_getblk(p_s_sb,
+                           sb_getblk(sb,
                                      le32_to_cpu(desc->j_realblock[i]));
                } else {
                        real_blocks[i] =
-                           sb_getblk(p_s_sb,
+                           sb_getblk(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",
+               if (real_blocks[i]->b_blocknr > SB_BLOCK_COUNT(sb)) {
+                       reiserfs_warning(sb, "journal-1207",
                                         "REPLAY FAILURE fsck required! "
                                         "Block to replay is outside of "
                                         "filesystem");
@@ -2226,8 +2259,8 @@ static int journal_read_transaction(struct super_block *p_s_sb,
                }
                /* 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",
+                   (sb, real_blocks[i]->b_blocknr)) {
+                       reiserfs_warning(sb, "journal-1204",
                                         "REPLAY FAILURE fsck required! "
                                         "Trying to replay onto a log block");
                      abort_replay:
@@ -2243,9 +2276,13 @@ static int journal_read_transaction(struct super_block *p_s_sb,
        /* 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++) {
+
+               reiserfs_write_unlock(sb);
                wait_on_buffer(log_blocks[i]);
+               reiserfs_write_lock(sb);
+
                if (!buffer_uptodate(log_blocks[i])) {
-                       reiserfs_warning(p_s_sb, "journal-1212",
+                       reiserfs_warning(sb, "journal-1212",
                                         "REPLAY FAILURE fsck required! "
                                         "buffer write failed");
                        brelse_array(log_blocks + i,
@@ -2270,7 +2307,7 @@ static int journal_read_transaction(struct super_block *p_s_sb,
        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",
+                       reiserfs_warning(sb, "journal-1226",
                                         "REPLAY FAILURE, fsck required! "
                                         "buffer write failed");
                        brelse_array(real_blocks + i,
@@ -2284,15 +2321,15 @@ static int journal_read_transaction(struct super_block *p_s_sb,
                brelse(real_blocks[i]);
        }
        cur_dblock =
-           SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) +
+           SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
            ((trans_offset + get_desc_trans_len(desc) +
-             2) % SB_ONDISK_JOURNAL_SIZE(p_s_sb));
-       reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE,
+             2) % SB_ONDISK_JOURNAL_SIZE(sb));
+       reiserfs_debug(sb, REISERFS_DEBUG_CODE,
                       "journal-1095: setting journal " "start to offset %ld",
-                      cur_dblock - SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb));
+                      cur_dblock - SB_ONDISK_JOURNAL_1st_BLOCK(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_start = cur_dblock - SB_ONDISK_JOURNAL_1st_BLOCK(sb);
        journal->j_last_flush_trans_id = trans_id;
        journal->j_trans_id = trans_id + 1;
        /* check for trans_id overflow */
@@ -2357,9 +2394,9 @@ static struct buffer_head *reiserfs_breada(struct block_device *dev,
 **
 ** On exit, it sets things up so the first transaction will work correctly.
 */
-static int journal_read(struct super_block *p_s_sb)
+static int journal_read(struct super_block *sb)
 {
-       struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
+       struct reiserfs_journal *journal = SB_JOURNAL(sb);
        struct reiserfs_journal_desc *desc;
        unsigned int oldest_trans_id = 0;
        unsigned int oldest_invalid_trans_id = 0;
@@ -2375,8 +2412,8 @@ static int journal_read(struct super_block *p_s_sb)
        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",
+       cur_dblock = SB_ONDISK_JOURNAL_1st_BLOCK(sb);
+       reiserfs_info(sb, "checking transaction log (%s)\n",
                      bdevname(journal->j_dev_bd, b));
        start = get_seconds();
 
@@ -2384,22 +2421,22 @@ static int journal_read(struct super_block *p_s_sb)
         ** 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));
+       journal->j_header_bh = journal_bread(sb,
+                                            SB_ONDISK_JOURNAL_1st_BLOCK(sb)
+                                            + SB_ONDISK_JOURNAL_SIZE(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) <
-           SB_ONDISK_JOURNAL_SIZE(p_s_sb)
+           SB_ONDISK_JOURNAL_SIZE(sb)
            && le32_to_cpu(jh->j_last_flush_trans_id) > 0) {
                oldest_start =
-                   SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) +
+                   SB_ONDISK_JOURNAL_1st_BLOCK(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,
+               reiserfs_debug(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),
@@ -2411,10 +2448,10 @@ static int journal_read(struct super_block *p_s_sb)
                 ** through the whole log.
                 */
                d_bh =
-                   journal_bread(p_s_sb,
-                                 SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) +
+                   journal_bread(sb,
+                                 SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
                                  le32_to_cpu(jh->j_first_unflushed_offset));
-               ret = journal_transaction_is_valid(p_s_sb, d_bh, NULL, NULL);
+               ret = journal_transaction_is_valid(sb, d_bh, NULL, NULL);
                if (!ret) {
                        continue_replay = 0;
                }
@@ -2422,8 +2459,8 @@ static int journal_read(struct super_block *p_s_sb)
                goto start_log_replay;
        }
 
-       if (continue_replay && bdev_read_only(p_s_sb->s_bdev)) {
-               reiserfs_warning(p_s_sb, "clm-2076",
+       if (continue_replay && bdev_read_only(sb->s_bdev)) {
+               reiserfs_warning(sb, "clm-2076",
                                 "device is readonly, unable to replay log");
                return -1;
        }
@@ -2433,17 +2470,17 @@ static int journal_read(struct super_block *p_s_sb)
         */
        while (continue_replay
               && cur_dblock <
-              (SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) +
-               SB_ONDISK_JOURNAL_SIZE(p_s_sb))) {
+              (SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
+               SB_ONDISK_JOURNAL_SIZE(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));
+                                   sb->s_blocksize,
+                                   SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
+                                   SB_ONDISK_JOURNAL_SIZE(sb));
                ret =
-                   journal_transaction_is_valid(p_s_sb, d_bh,
+                   journal_transaction_is_valid(sb, d_bh,
                                                 &oldest_invalid_trans_id,
                                                 &newest_mount_id);
                if (ret == 1) {
@@ -2452,26 +2489,26 @@ static int journal_read(struct super_block *p_s_sb)
                                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,
+                               reiserfs_debug(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);
+                                              (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,
+                               reiserfs_debug(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);
+                                              (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,
+                               reiserfs_debug(sb, REISERFS_DEBUG_CODE,
                                               "journal-1299: Setting "
                                               "newest_mount_id to %d",
                                               get_desc_mount_id(desc));
@@ -2486,17 +2523,17 @@ static int journal_read(struct super_block *p_s_sb)
       start_log_replay:
        cur_dblock = oldest_start;
        if (oldest_trans_id) {
-               reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE,
+               reiserfs_debug(sb, REISERFS_DEBUG_CODE,
                               "journal-1206: Starting replay "
                               "from offset %llu, trans_id %lu",
-                              cur_dblock - SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb),
+                              cur_dblock - SB_ONDISK_JOURNAL_1st_BLOCK(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,
+                   journal_read_transaction(sb, cur_dblock, oldest_start,
                                             oldest_trans_id, newest_mount_id);
                if (ret < 0) {
                        return ret;
@@ -2504,14 +2541,14 @@ static int journal_read(struct super_block *p_s_sb)
                        break;
                }
                cur_dblock =
-                   SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) + journal->j_start;
+                   SB_ONDISK_JOURNAL_1st_BLOCK(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,
+               reiserfs_debug(sb, REISERFS_DEBUG_CODE,
                               "journal-1225: No valid " "transactions found");
        }
        /* j_start does not get set correctly if we don't replay any transactions.
@@ -2531,16 +2568,16 @@ static int journal_read(struct super_block *p_s_sb)
        } else {
                journal->j_mount_id = newest_mount_id + 1;
        }
-       reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-1299: Setting "
+       reiserfs_debug(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,
+               reiserfs_info(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,
+       if (!bdev_read_only(sb->s_bdev) &&
+           _update_journal_header_block(sb, journal->j_start,
                                         journal->j_last_flush_trans_id)) {
                /* replay failed, caller must call free_journal_ram and abort
                 ** the mount
@@ -2565,9 +2602,9 @@ static struct reiserfs_journal_list *alloc_journal_list(struct super_block *s)
        return jl;
 }
 
-static void journal_list_init(struct super_block *p_s_sb)
+static void journal_list_init(struct super_block *sb)
 {
-       SB_JOURNAL(p_s_sb)->j_current_jl = alloc_journal_list(p_s_sb);
+       SB_JOURNAL(sb)->j_current_jl = alloc_journal_list(sb);
 }
 
 static int release_journal_dev(struct super_block *super,
@@ -2666,28 +2703,28 @@ static int journal_init_dev(struct super_block *super,
  */
 #define REISERFS_STANDARD_BLKSIZE (4096)
 
-static int check_advise_trans_params(struct super_block *p_s_sb,
+static int check_advise_trans_params(struct super_block *sb,
                                     struct reiserfs_journal *journal)
 {
         if (journal->j_trans_max) {
                /* Non-default journal params.
                   Do sanity check for them. */
                int ratio = 1;
-               if (p_s_sb->s_blocksize < REISERFS_STANDARD_BLKSIZE)
-                       ratio = REISERFS_STANDARD_BLKSIZE / p_s_sb->s_blocksize;
+               if (sb->s_blocksize < REISERFS_STANDARD_BLKSIZE)
+                       ratio = REISERFS_STANDARD_BLKSIZE / sb->s_blocksize;
 
                if (journal->j_trans_max > JOURNAL_TRANS_MAX_DEFAULT / ratio ||
                    journal->j_trans_max < JOURNAL_TRANS_MIN_DEFAULT / ratio ||
-                   SB_ONDISK_JOURNAL_SIZE(p_s_sb) / journal->j_trans_max <
+                   SB_ONDISK_JOURNAL_SIZE(sb) / journal->j_trans_max <
                    JOURNAL_MIN_RATIO) {
-                       reiserfs_warning(p_s_sb, "sh-462",
+                       reiserfs_warning(sb, "sh-462",
                                         "bad transaction max size (%u). "
                                         "FSCK?", journal->j_trans_max);
                        return 1;
                }
                if (journal->j_max_batch != (journal->j_trans_max) *
                        JOURNAL_MAX_BATCH_DEFAULT/JOURNAL_TRANS_MAX_DEFAULT) {
-                       reiserfs_warning(p_s_sb, "sh-463",
+                       reiserfs_warning(sb, "sh-463",
                                         "bad transaction max batch (%u). "
                                         "FSCK?", journal->j_max_batch);
                        return 1;
@@ -2697,9 +2734,9 @@ static int check_advise_trans_params(struct super_block *p_s_sb,
                    The file system was created by old version
                   of mkreiserfs, so some fields contain zeros,
                   and we need to advise proper values for them */
-               if (p_s_sb->s_blocksize != REISERFS_STANDARD_BLKSIZE) {
-                       reiserfs_warning(p_s_sb, "sh-464", "bad blocksize (%u)",
-                                        p_s_sb->s_blocksize);
+               if (sb->s_blocksize != REISERFS_STANDARD_BLKSIZE) {
+                       reiserfs_warning(sb, "sh-464", "bad blocksize (%u)",
+                                        sb->s_blocksize);
                        return 1;
                }
                journal->j_trans_max = JOURNAL_TRANS_MAX_DEFAULT;
@@ -2712,21 +2749,28 @@ static int check_advise_trans_params(struct super_block *p_s_sb,
 /*
 ** 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 journal_init(struct super_block *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;
+       int num_cnodes = SB_ONDISK_JOURNAL_SIZE(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];
+       int ret;
 
-       journal = SB_JOURNAL(p_s_sb) = vmalloc(sizeof(struct reiserfs_journal));
+       /*
+        * Unlock here to avoid various RECLAIM-FS-ON <-> IN-RECLAIM-FS
+        * dependency inversion warnings.
+        */
+       reiserfs_write_unlock(sb);
+       journal = SB_JOURNAL(sb) = vmalloc(sizeof(struct reiserfs_journal));
        if (!journal) {
-               reiserfs_warning(p_s_sb, "journal-1256",
+               reiserfs_warning(sb, "journal-1256",
                                 "unable to get memory for journal structure");
+               reiserfs_write_lock(sb);
                return 1;
        }
        memset(journal, 0, sizeof(struct reiserfs_journal));
@@ -2735,50 +2779,68 @@ int journal_init(struct super_block *p_s_sb, const char *j_dev_name,
        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,
-                                          reiserfs_bmap_count(p_s_sb)))
+       ret = reiserfs_allocate_list_bitmaps(sb, journal->j_list_bitmap,
+                                          reiserfs_bmap_count(sb));
+       reiserfs_write_lock(sb);
+       if (ret)
                goto free_and_return;
-       allocate_bitmap_nodes(p_s_sb);
+
+       allocate_bitmap_nodes(sb);
 
        /* reserved for journal area support */
-       SB_JOURNAL_1st_RESERVED_BLOCK(p_s_sb) = (old_format ?
+       SB_JOURNAL_1st_RESERVED_BLOCK(sb) = (old_format ?
                                                 REISERFS_OLD_DISK_OFFSET_IN_BYTES
-                                                / p_s_sb->s_blocksize +
-                                                reiserfs_bmap_count(p_s_sb) +
+                                                / sb->s_blocksize +
+                                                reiserfs_bmap_count(sb) +
                                                 1 :
                                                 REISERFS_DISK_OFFSET_IN_BYTES /
-                                                p_s_sb->s_blocksize + 2);
+                                                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",
+       if (!SB_ONDISK_JOURNAL_DEVICE(sb) &&
+           (SB_JOURNAL_1st_RESERVED_BLOCK(sb) +
+            SB_ONDISK_JOURNAL_SIZE(sb) > sb->s_blocksize * 8)) {
+               reiserfs_warning(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);
+                                SB_JOURNAL_1st_RESERVED_BLOCK(sb),
+                                SB_ONDISK_JOURNAL_SIZE(sb),
+                                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",
+       /*
+        * We need to unlock here to avoid creating the following
+        * dependency:
+        * reiserfs_lock -> sysfs_mutex
+        * Because the reiserfs mmap path creates the following dependency:
+        * mm->mmap -> reiserfs_lock, hence we have
+        * mm->mmap -> reiserfs_lock ->sysfs_mutex
+        * This would ends up in a circular dependency with sysfs readdir path
+        * which does sysfs_mutex -> mm->mmap_sem
+        * This is fine because the reiserfs lock is useless in mount path,
+        * at least until we call journal_begin. We keep it for paranoid
+        * reasons.
+        */
+       reiserfs_write_unlock(sb);
+       if (journal_init_dev(sb, journal, j_dev_name) != 0) {
+               reiserfs_write_lock(sb);
+               reiserfs_warning(sb, "sh-462",
                                 "unable to initialize jornal device");
                goto free_and_return;
        }
+       reiserfs_write_lock(sb);
 
-       rs = SB_DISK_SUPER_BLOCK(p_s_sb);
+       rs = SB_DISK_SUPER_BLOCK(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));
+       bhjh = journal_bread(sb,
+                            SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
+                            SB_ONDISK_JOURNAL_SIZE(sb));
        if (!bhjh) {
-               reiserfs_warning(p_s_sb, "sh-459",
+               reiserfs_warning(sb, "sh-459",
                                 "unable to read journal header");
                goto free_and_return;
        }
@@ -2788,7 +2850,7 @@ int journal_init(struct super_block *p_s_sb, const char *j_dev_name,
        if (is_reiserfs_jr(rs)
            && (le32_to_cpu(jh->jh_journal.jp_journal_magic) !=
                sb_jp_journal_magic(rs))) {
-               reiserfs_warning(p_s_sb, "sh-460",
+               reiserfs_warning(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,
@@ -2804,7 +2866,7 @@ int journal_init(struct super_block *p_s_sb, const char *j_dev_name,
            le32_to_cpu(jh->jh_journal.jp_journal_max_commit_age);
        journal->j_max_trans_age = JOURNAL_MAX_TRANS_AGE;
 
-       if (check_advise_trans_params(p_s_sb, journal) != 0)
+       if (check_advise_trans_params(sb, journal) != 0)
                goto free_and_return;
        journal->j_default_max_commit_age = journal->j_max_commit_age;
 
@@ -2813,12 +2875,12 @@ int journal_init(struct super_block *p_s_sb, const char *j_dev_name,
                journal->j_max_trans_age = commit_max_age;
        }
 
-       reiserfs_info(p_s_sb, "journal params: device %s, size %u, "
+       reiserfs_info(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),
+                     SB_ONDISK_JOURNAL_SIZE(sb),
+                     SB_ONDISK_JOURNAL_1st_BLOCK(sb),
                      journal->j_trans_max,
                      journal->j_max_batch,
                      journal->j_max_commit_age, journal->j_max_trans_age);
@@ -2826,7 +2888,7 @@ int journal_init(struct super_block *p_s_sb, const char *j_dev_name,
        brelse(bhjh);
 
        journal->j_list_bitmap_index = 0;
-       journal_list_init(p_s_sb);
+       journal_list_init(sb);
 
        memset(journal->j_list_hash_table, 0,
               JOURNAL_HASH_SIZE * sizeof(struct reiserfs_journal_cnode *));
@@ -2858,7 +2920,7 @@ int journal_init(struct super_block *p_s_sb, const char *j_dev_name,
        journal->j_must_wait = 0;
 
        if (journal->j_cnode_free == 0) {
-               reiserfs_warning(p_s_sb, "journal-2004", "Journal cnode memory "
+               reiserfs_warning(sb, "journal-2004", "Journal cnode memory "
                                 "allocation failed (%ld bytes). Journal is "
                                 "too large for available memory. Usually "
                                 "this is due to a journal that is too large.",
@@ -2866,29 +2928,32 @@ int journal_init(struct super_block *p_s_sb, const char *j_dev_name,
                goto free_and_return;
        }
 
-       init_journal_hash(p_s_sb);
+       init_journal_hash(sb);
        jl = journal->j_current_jl;
-       jl->j_list_bitmap = get_list_bitmap(p_s_sb, jl);
+       jl->j_list_bitmap = get_list_bitmap(sb, jl);
        if (!jl->j_list_bitmap) {
-               reiserfs_warning(p_s_sb, "journal-2005",
+               reiserfs_warning(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, "reiserfs-2006",
+       if (journal_read(sb) < 0) {
+               reiserfs_warning(sb, "reiserfs-2006",
                                 "Replay Failure, unable to mount");
                goto free_and_return;
        }
 
        reiserfs_mounted_fs_count++;
-       if (reiserfs_mounted_fs_count <= 1)
+       if (reiserfs_mounted_fs_count <= 1) {
+               reiserfs_write_unlock(sb);
                commit_wq = create_workqueue("reiserfs");
+               reiserfs_write_lock(sb);
+       }
 
        INIT_DELAYED_WORK(&journal->j_work, flush_async_commits);
-       journal->j_work_sb = p_s_sb;
+       journal->j_work_sb = sb;
        return 0;
       free_and_return:
-       free_journal_ram(p_s_sb);
+       free_journal_ram(sb);
        return 1;
 }
 
@@ -2964,8 +3029,11 @@ static void queue_log_writer(struct super_block *s)
        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))
+       if (test_bit(J_WRITERS_QUEUED, &journal->j_state)) {
+               reiserfs_write_unlock(s);
                schedule();
+               reiserfs_write_lock(s);
+       }
        __set_current_state(TASK_RUNNING);
        remove_wait_queue(&journal->j_join_wait, &wait);
 }
@@ -2982,7 +3050,9 @@ static void let_transaction_grow(struct super_block *sb, unsigned int trans_id)
        struct reiserfs_journal *journal = SB_JOURNAL(sb);
        unsigned long bcount = journal->j_bcount;
        while (1) {
+               reiserfs_write_unlock(sb);
                schedule_timeout_uninterruptible(1);
+               reiserfs_write_lock(sb);
                journal->j_current_jl->j_state |= LIST_COMMIT_PENDING;
                while ((atomic_read(&journal->j_wcount) > 0 ||
                        atomic_read(&journal->j_jlock)) &&
@@ -3004,37 +3074,39 @@ static void let_transaction_grow(struct super_block *sb, unsigned int trans_id)
 ** 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,
+                             struct super_block *sb, unsigned long nblocks,
                              int join)
 {
        time_t now = get_seconds();
        unsigned int old_trans_id;
-       struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
+       struct reiserfs_journal *journal = SB_JOURNAL(sb);
        struct reiserfs_transaction_handle myth;
        int sched_count = 0;
        int retval;
 
-       reiserfs_check_lock_depth(p_s_sb, "journal_begin");
+       reiserfs_check_lock_depth(sb, "journal_begin");
        BUG_ON(nblocks > journal->j_trans_max);
 
-       PROC_INFO_INC(p_s_sb, journal.journal_being);
+       PROC_INFO_INC(sb, journal.journal_being);
        /* set here for journal_join */
        th->t_refcount = 1;
-       th->t_super = p_s_sb;
+       th->t_super = sb;
 
       relock:
-       lock_journal(p_s_sb);
+       lock_journal(sb);
        if (join != JBEGIN_ABORT && reiserfs_is_journal_aborted(journal)) {
-               unlock_journal(p_s_sb);
+               unlock_journal(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);
+               unlock_journal(sb);
+               reiserfs_write_unlock(sb);
+               reiserfs_wait_on_write_block(sb);
+               reiserfs_write_lock(sb);
+               PROC_INFO_INC(sb, journal.journal_relock_writers);
                goto relock;
        }
        now = get_seconds();
@@ -3055,7 +3127,7 @@ static int do_journal_begin_r(struct reiserfs_transaction_handle *th,
            || (!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 */
+               unlock_journal(sb);     /* allow others to finish this transaction */
 
                if (!join && (journal->j_len_alloc + nblocks + 2) >=
                    journal->j_max_batch &&
@@ -3063,7 +3135,7 @@ static int do_journal_begin_r(struct reiserfs_transaction_handle *th,
                    (journal->j_len_alloc * 75)) {
                        if (atomic_read(&journal->j_wcount) > 10) {
                                sched_count++;
-                               queue_log_writer(p_s_sb);
+                               queue_log_writer(sb);
                                goto relock;
                        }
                }
@@ -3073,25 +3145,25 @@ static int do_journal_begin_r(struct reiserfs_transaction_handle *th,
                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);
+                               queue_log_writer(sb);
                        }
                        goto relock;
                }
-               retval = journal_join(&myth, p_s_sb, 1);
+               retval = journal_join(&myth, 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);
+                       retval = do_journal_end(&myth, sb, 1, 0);
                } else {
-                       retval = do_journal_end(&myth, p_s_sb, 1, COMMIT_NOW);
+                       retval = do_journal_end(&myth, sb, 1, COMMIT_NOW);
                }
 
                if (retval)
                        goto out_fail;
 
-               PROC_INFO_INC(p_s_sb, journal.journal_relock_wcount);
+               PROC_INFO_INC(sb, journal.journal_relock_wcount);
                goto relock;
        }
        /* we are the first writer, set trans_id */
@@ -3103,7 +3175,7 @@ static int do_journal_begin_r(struct reiserfs_transaction_handle *th,
        th->t_blocks_logged = 0;
        th->t_blocks_allocated = nblocks;
        th->t_trans_id = journal->j_trans_id;
-       unlock_journal(p_s_sb);
+       unlock_journal(sb);
        INIT_LIST_HEAD(&th->t_list);
        get_fs_excl();
        return 0;
@@ -3113,7 +3185,7 @@ static int do_journal_begin_r(struct reiserfs_transaction_handle *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;
+       th->t_super = sb;
        return retval;
 }
 
@@ -3164,7 +3236,7 @@ int reiserfs_end_persistent_transaction(struct reiserfs_transaction_handle *th)
 }
 
 static int journal_join(struct reiserfs_transaction_handle *th,
-                       struct super_block *p_s_sb, unsigned long nblocks)
+                       struct super_block *sb, unsigned long nblocks)
 {
        struct reiserfs_transaction_handle *cur_th = current->journal_info;
 
@@ -3173,11 +3245,11 @@ static int journal_join(struct reiserfs_transaction_handle *th,
         */
        th->t_handle_save = cur_th;
        BUG_ON(cur_th && cur_th->t_refcount > 1);
-       return do_journal_begin_r(th, p_s_sb, nblocks, JBEGIN_JOIN);
+       return do_journal_begin_r(th, sb, nblocks, JBEGIN_JOIN);
 }
 
 int journal_join_abort(struct reiserfs_transaction_handle *th,
-                      struct super_block *p_s_sb, unsigned long nblocks)
+                      struct super_block *sb, unsigned long nblocks)
 {
        struct reiserfs_transaction_handle *cur_th = current->journal_info;
 
@@ -3186,11 +3258,11 @@ int journal_join_abort(struct reiserfs_transaction_handle *th,
         */
        th->t_handle_save = cur_th;
        BUG_ON(cur_th && cur_th->t_refcount > 1);
-       return do_journal_begin_r(th, p_s_sb, nblocks, JBEGIN_ABORT);
+       return do_journal_begin_r(th, sb, nblocks, JBEGIN_ABORT);
 }
 
 int journal_begin(struct reiserfs_transaction_handle *th,
-                 struct super_block *p_s_sb, unsigned long nblocks)
+                 struct super_block *sb, unsigned long nblocks)
 {
        struct reiserfs_transaction_handle *cur_th = current->journal_info;
        int ret;
@@ -3198,12 +3270,12 @@ int journal_begin(struct reiserfs_transaction_handle *th,
        th->t_handle_save = NULL;
        if (cur_th) {
                /* we are nesting into the current transaction */
-               if (cur_th->t_super == p_s_sb) {
+               if (cur_th->t_super == 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, "reiserfs-2005",
+                               reiserfs_warning(sb, "reiserfs-2005",
                                                 "BAD: refcount <= 1, but "
                                                 "journal_info != 0");
                        return 0;
@@ -3212,7 +3284,7 @@ int journal_begin(struct reiserfs_transaction_handle *th,
                         ** save it and restore on journal_end.  This should never
                         ** really happen...
                         */
-                       reiserfs_warning(p_s_sb, "clm-2100",
+                       reiserfs_warning(sb, "clm-2100",
                                         "nesting info a different FS");
                        th->t_handle_save = current->journal_info;
                        current->journal_info = th;
@@ -3220,7 +3292,7 @@ int journal_begin(struct reiserfs_transaction_handle *th,
        } else {
                current->journal_info = th;
        }
-       ret = do_journal_begin_r(th, p_s_sb, nblocks, JBEGIN_REG);
+       ret = do_journal_begin_r(th, sb, nblocks, JBEGIN_REG);
        BUG_ON(current->journal_info != th);
 
        /* I guess this boils down to being the reciprocal of clm-2100 above.
@@ -3244,28 +3316,28 @@ int journal_begin(struct reiserfs_transaction_handle *th,
 ** 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 super_block *sb, struct buffer_head *bh)
 {
-       struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
+       struct reiserfs_journal *journal = SB_JOURNAL(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);
+       PROC_INFO_INC(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",
                               th->t_trans_id, journal->j_trans_id);
        }
 
-       p_s_sb->s_dirt = 1;
+       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);
+               PROC_INFO_INC(sb, journal.mark_dirty_already);
                return 0;
        }
 
@@ -3274,7 +3346,7 @@ int journal_mark_dirty(struct reiserfs_transaction_handle *th,
         ** could get to disk too early.  NOT GOOD.
         */
        if (!prepared || buffer_dirty(bh)) {
-               reiserfs_warning(p_s_sb, "journal-1777",
+               reiserfs_warning(sb, "journal-1777",
                                 "buffer %llu bad state "
                                 "%cPREPARED %cLOCKED %cDIRTY %cJDIRTY_WAIT",
                                 (unsigned long long)bh->b_blocknr,
@@ -3285,7 +3357,7 @@ int journal_mark_dirty(struct reiserfs_transaction_handle *th,
        }
 
        if (atomic_read(&(journal->j_wcount)) <= 0) {
-               reiserfs_warning(p_s_sb, "journal-1409",
+               reiserfs_warning(sb, "journal-1409",
                                 "returning because j_wcount was %d",
                                 atomic_read(&(journal->j_wcount)));
                return 1;
@@ -3301,7 +3373,7 @@ int journal_mark_dirty(struct reiserfs_transaction_handle *th,
 
        if (buffer_journal_dirty(bh)) {
                count_already_incd = 1;
-               PROC_INFO_INC(p_s_sb, journal.mark_dirty_notjournal);
+               PROC_INFO_INC(sb, journal.mark_dirty_notjournal);
                clear_buffer_journal_dirty(bh);
        }
 
@@ -3313,10 +3385,9 @@ int journal_mark_dirty(struct reiserfs_transaction_handle *th,
 
        /* now put this guy on the end */
        if (!cn) {
-               cn = get_cnode(p_s_sb);
+               cn = get_cnode(sb);
                if (!cn) {
-                       reiserfs_panic(p_s_sb, "journal-4",
-                                      "get_cnode failed!");
+                       reiserfs_panic(sb, "journal-4", "get_cnode failed!");
                }
 
                if (th->t_blocks_logged == th->t_blocks_allocated) {
@@ -3328,7 +3399,7 @@ int journal_mark_dirty(struct reiserfs_transaction_handle *th,
 
                cn->bh = bh;
                cn->blocknr = bh->b_blocknr;
-               cn->sb = p_s_sb;
+               cn->sb = sb;
                cn->jlist = NULL;
                insert_journal_hash(journal->j_hash_table, cn);
                if (!count_already_incd) {
@@ -3349,10 +3420,10 @@ int journal_mark_dirty(struct reiserfs_transaction_handle *th,
 }
 
 int journal_end(struct reiserfs_transaction_handle *th,
-               struct super_block *p_s_sb, unsigned long nblocks)
+               struct super_block *sb, unsigned long nblocks)
 {
        if (!current->journal_info && th->t_refcount > 1)
-               reiserfs_warning(p_s_sb, "REISER-NESTING",
+               reiserfs_warning(sb, "REISER-NESTING",
                                 "th NULL, refcount %d", th->t_refcount);
 
        if (!th->t_trans_id) {
@@ -3376,7 +3447,7 @@ int journal_end(struct reiserfs_transaction_handle *th,
                }
                return 0;
        } else {
-               return do_journal_end(th, p_s_sb, nblocks, 0);
+               return do_journal_end(th, sb, nblocks, 0);
        }
 }
 
@@ -3387,15 +3458,15 @@ int journal_end(struct reiserfs_transaction_handle *th,
 **
 ** returns 1 if it cleaned and relsed the buffer. 0 otherwise
 */
-static int remove_from_transaction(struct super_block *p_s_sb,
+static int remove_from_transaction(struct super_block *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);
+       struct reiserfs_journal *journal = SB_JOURNAL(sb);
        int ret = 0;
 
-       cn = get_journal_hash_dev(p_s_sb, journal->j_hash_table, blocknr);
+       cn = get_journal_hash_dev(sb, journal->j_hash_table, blocknr);
        if (!cn || !cn->bh) {
                return ret;
        }
@@ -3413,7 +3484,7 @@ static int remove_from_transaction(struct super_block *p_s_sb,
                journal->j_last = cn->prev;
        }
        if (bh)
-               remove_journal_hash(p_s_sb, journal->j_hash_table, NULL,
+               remove_journal_hash(sb, journal->j_hash_table, NULL,
                                    bh->b_blocknr, 0);
        clear_buffer_journaled(bh);     /* don't log this one */
 
@@ -3423,14 +3494,14 @@ static int remove_from_transaction(struct super_block *p_s_sb,
                clear_buffer_journal_test(bh);
                put_bh(bh);
                if (atomic_read(&(bh->b_count)) < 0) {
-                       reiserfs_warning(p_s_sb, "journal-1752",
+                       reiserfs_warning(sb, "journal-1752",
                                         "b_count < 0");
                }
                ret = 1;
        }
        journal->j_len--;
        journal->j_len_alloc--;
-       free_cnode(p_s_sb, cn);
+       free_cnode(sb, cn);
        return ret;
 }
 
@@ -3481,19 +3552,19 @@ static int can_dirty(struct reiserfs_journal_cnode *cn)
 ** will wait until the current transaction is done/committed before returning
 */
 int journal_end_sync(struct reiserfs_transaction_handle *th,
-                    struct super_block *p_s_sb, unsigned long nblocks)
+                    struct super_block *sb, unsigned long nblocks)
 {
-       struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
+       struct reiserfs_journal *journal = SB_JOURNAL(sb);
 
        BUG_ON(!th->t_trans_id);
        /* you can sync while nested, very, very bad */
        BUG_ON(th->t_refcount > 1);
        if (journal->j_len == 0) {
-               reiserfs_prepare_for_journal(p_s_sb, SB_BUFFER_WITH_SB(p_s_sb),
+               reiserfs_prepare_for_journal(sb, SB_BUFFER_WITH_SB(sb),
                                             1);
-               journal_mark_dirty(th, p_s_sb, SB_BUFFER_WITH_SB(p_s_sb));
+               journal_mark_dirty(th, sb, SB_BUFFER_WITH_SB(sb));
        }
-       return do_journal_end(th, p_s_sb, nblocks, COMMIT_NOW | WAIT);
+       return do_journal_end(th, sb, nblocks, COMMIT_NOW | WAIT);
 }
 
 /*
@@ -3503,29 +3574,29 @@ static void flush_async_commits(struct work_struct *work)
 {
        struct reiserfs_journal *journal =
                container_of(work, struct reiserfs_journal, j_work.work);
-       struct super_block *p_s_sb = journal->j_work_sb;
+       struct super_block *sb = journal->j_work_sb;
        struct reiserfs_journal_list *jl;
        struct list_head *entry;
 
-       lock_kernel();
+       reiserfs_write_lock(sb);
        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);
+               flush_commit_list(sb, jl, 1);
        }
-       unlock_kernel();
+       reiserfs_write_unlock(sb);
 }
 
 /*
 ** 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)
+int reiserfs_flush_old_commits(struct super_block *sb)
 {
        time_t now;
        struct reiserfs_transaction_handle th;
-       struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
+       struct reiserfs_journal *journal = SB_JOURNAL(sb);
 
        now = get_seconds();
        /* safety check so we don't flush while we are replaying the log during
@@ -3542,20 +3613,20 @@ int reiserfs_flush_old_commits(struct super_block *p_s_sb)
            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),
+               if (!journal_join(&th, sb, 1)) {
+                       reiserfs_prepare_for_journal(sb,
+                                                    SB_BUFFER_WITH_SB(sb),
                                                     1);
-                       journal_mark_dirty(&th, p_s_sb,
-                                          SB_BUFFER_WITH_SB(p_s_sb));
+                       journal_mark_dirty(&th, sb,
+                                          SB_BUFFER_WITH_SB(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);
+                       do_journal_end(&th, sb, 1, COMMIT_NOW | WAIT);
                }
        }
-       return p_s_sb->s_dirt;
+       return sb->s_dirt;
 }
 
 /*
@@ -3570,7 +3641,7 @@ int reiserfs_flush_old_commits(struct super_block *p_s_sb)
 ** 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,
+                            struct super_block *sb, unsigned long nblocks,
                             int flags)
 {
 
@@ -3579,7 +3650,7 @@ static int check_journal_end(struct reiserfs_transaction_handle *th,
        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);
+       struct reiserfs_journal *journal = SB_JOURNAL(sb);
 
        BUG_ON(!th->t_trans_id);
 
@@ -3618,31 +3689,31 @@ static int check_journal_end(struct reiserfs_transaction_handle *th,
                        if (flush) {
                                journal->j_next_full_flush = 1;
                        }
-                       unlock_journal(p_s_sb);
+                       unlock_journal(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);
+                                       queue_log_writer(sb);
                                } else {
-                                       lock_journal(p_s_sb);
+                                       lock_journal(sb);
                                        if (journal->j_trans_id == trans_id) {
                                                atomic_set(&(journal->j_jlock),
                                                           1);
                                        }
-                                       unlock_journal(p_s_sb);
+                                       unlock_journal(sb);
                                }
                        }
                        BUG_ON(journal->j_trans_id == trans_id);
                        
                        if (commit_now
-                           && journal_list_still_alive(p_s_sb, trans_id)
+                           && journal_list_still_alive(sb, trans_id)
                            && wait_on_commit) {
-                               flush_commit_list(p_s_sb, jl, 1);
+                               flush_commit_list(sb, jl, 1);
                        }
                        return 0;
                }
-               unlock_journal(p_s_sb);
+               unlock_journal(sb);
                return 0;
        }
 
@@ -3659,12 +3730,12 @@ static int check_journal_end(struct reiserfs_transaction_handle *th,
            && 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);
+               unlock_journal(sb);
                return 0;
        }
 
-       if (journal->j_start > SB_ONDISK_JOURNAL_SIZE(p_s_sb)) {
-               reiserfs_panic(p_s_sb, "journal-003",
+       if (journal->j_start > SB_ONDISK_JOURNAL_SIZE(sb)) {
+               reiserfs_panic(sb, "journal-003",
                               "j_start (%ld) is too high",
                               journal->j_start);
        }
@@ -3686,16 +3757,16 @@ static int check_journal_end(struct reiserfs_transaction_handle *th,
 ** 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 super_block *sb, b_blocknr_t blocknr)
 {
-       struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
+       struct reiserfs_journal *journal = SB_JOURNAL(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);
+       cn = get_journal_hash_dev(sb, journal->j_hash_table, blocknr);
        if (cn && cn->bh) {
                bh = cn->bh;
                get_bh(bh);
@@ -3705,15 +3776,15 @@ int journal_mark_freed(struct reiserfs_transaction_handle *th,
                clear_buffer_journal_new(bh);
                clear_prepared_bits(bh);
                reiserfs_clean_and_file_buffer(bh);
-               cleaned = remove_from_transaction(p_s_sb, blocknr, cleaned);
+               cleaned = remove_from_transaction(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",
+                       reiserfs_panic(sb, "journal-1702",
                                       "journal_list_bitmap is NULL");
                }
-               set_bit_in_list_bitmap(p_s_sb, blocknr, jb);
+               set_bit_in_list_bitmap(sb, blocknr, jb);
 
                /* Note, the entire while loop is not allowed to schedule.  */
 
@@ -3721,13 +3792,13 @@ int journal_mark_freed(struct reiserfs_transaction_handle *th,
                        clear_prepared_bits(bh);
                        reiserfs_clean_and_file_buffer(bh);
                }
-               cleaned = remove_from_transaction(p_s_sb, blocknr, cleaned);
+               cleaned = remove_from_transaction(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,
+               cn = get_journal_hash_dev(sb, journal->j_list_hash_table,
                                          blocknr);
                while (cn) {
-                       if (p_s_sb == cn->sb && blocknr == cn->blocknr) {
+                       if (sb == cn->sb && blocknr == cn->blocknr) {
                                set_bit(BLOCK_FREED, &cn->state);
                                if (cn->bh) {
                                        if (!cleaned) {
@@ -3743,7 +3814,7 @@ int journal_mark_freed(struct reiserfs_transaction_handle *th,
                                                put_bh(cn->bh);
                                                if (atomic_read
                                                    (&(cn->bh->b_count)) < 0) {
-                                                       reiserfs_warning(p_s_sb,
+                                                       reiserfs_warning(sb,
                                                                 "journal-2138",
                                                                 "cn->bh->b_count < 0");
                                                }
@@ -3850,18 +3921,18 @@ int reiserfs_commit_for_inode(struct inode *inode)
        return __commit_trans_jl(inode, id, jl);
 }
 
-void reiserfs_restore_prepared_buffer(struct super_block *p_s_sb,
+void reiserfs_restore_prepared_buffer(struct super_block *sb,
                                      struct buffer_head *bh)
 {
-       struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-       PROC_INFO_INC(p_s_sb, journal.restore_prepared);
+       struct reiserfs_journal *journal = SB_JOURNAL(sb);
+       PROC_INFO_INC(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,
+               cn = get_journal_hash_dev(sb,
                                          journal->j_list_hash_table,
                                          bh->b_blocknr);
                if (cn && can_dirty(cn)) {
@@ -3880,10 +3951,10 @@ extern struct tree_balance *cur_tb;
 ** wait on it.
 **
 */
-int reiserfs_prepare_for_journal(struct super_block *p_s_sb,
+int reiserfs_prepare_for_journal(struct super_block *sb,
                                 struct buffer_head *bh, int wait)
 {
-       PROC_INFO_INC(p_s_sb, journal.prepare);
+       PROC_INFO_INC(sb, journal.prepare);
 
        if (!trylock_buffer(bh)) {
                if (!wait)
@@ -3931,10 +4002,10 @@ static void flush_old_journal_lists(struct super_block *s)
 ** 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,
+                         struct super_block *sb, unsigned long nblocks,
                          int flags)
 {
-       struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
+       struct reiserfs_journal *journal = SB_JOURNAL(sb);
        struct reiserfs_journal_cnode *cn, *next, *jl_cn;
        struct reiserfs_journal_cnode *last_cn = NULL;
        struct reiserfs_journal_desc *desc;
@@ -3964,14 +4035,14 @@ static int do_journal_end(struct reiserfs_transaction_handle *th,
 
        put_fs_excl();
        current->journal_info = th->t_handle_save;
-       reiserfs_check_lock_depth(p_s_sb, "journal end");
+       reiserfs_check_lock_depth(sb, "journal end");
        if (journal->j_len == 0) {
-               reiserfs_prepare_for_journal(p_s_sb, SB_BUFFER_WITH_SB(p_s_sb),
+               reiserfs_prepare_for_journal(sb, SB_BUFFER_WITH_SB(sb),
                                             1);
-               journal_mark_dirty(th, p_s_sb, SB_BUFFER_WITH_SB(p_s_sb));
+               journal_mark_dirty(th, sb, SB_BUFFER_WITH_SB(sb));
        }
 
-       lock_journal(p_s_sb);
+       lock_journal(sb);
        if (journal->j_next_full_flush) {
                flags |= FLUSH_ALL;
                flush = 1;
@@ -3984,10 +4055,10 @@ static int do_journal_end(struct reiserfs_transaction_handle *th,
        /* 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);
+       if (!check_journal_end(th, sb, nblocks, flags)) {
+               sb->s_dirt = 1;
+               wake_queued_writers(sb);
+               reiserfs_async_progress_wait(sb);
                goto out;
        }
 
@@ -4016,8 +4087,8 @@ static int do_journal_end(struct reiserfs_transaction_handle *th,
 
        /* setup description block */
        d_bh =
-           journal_getblk(p_s_sb,
-                          SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) +
+           journal_getblk(sb,
+                          SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
                           journal->j_start);
        set_buffer_uptodate(d_bh);
        desc = (struct reiserfs_journal_desc *)(d_bh)->b_data;
@@ -4026,9 +4097,9 @@ static int do_journal_end(struct reiserfs_transaction_handle *th,
        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) +
+       c_bh = journal_getblk(sb, SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
                              ((journal->j_start + journal->j_len +
-                               1) % SB_ONDISK_JOURNAL_SIZE(p_s_sb)));
+                               1) % SB_ONDISK_JOURNAL_SIZE(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);
@@ -4042,7 +4113,7 @@ static int do_journal_end(struct reiserfs_transaction_handle *th,
         * the new transaction is fully setup, and we've already flushed the
         * ordered bh list
         */
-       mutex_lock(&jl->j_commit_mutex);
+       reiserfs_mutex_lock_safe(&jl->j_commit_mutex, sb);
 
        /* save the transaction id in case we need to commit it later */
        commit_trans_id = jl->j_trans_id;
@@ -4061,12 +4132,12 @@ static int do_journal_end(struct reiserfs_transaction_handle *th,
         **  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);
+       trans_half = journal_trans_half(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);
+                       jl_cn = get_cnode(sb);
                        if (!jl_cn) {
-                               reiserfs_panic(p_s_sb, "journal-1676",
+                               reiserfs_panic(sb, "journal-1676",
                                               "get_cnode returned NULL");
                        }
                        if (i == 0) {
@@ -4082,15 +4153,15 @@ static int do_journal_end(struct reiserfs_transaction_handle *th,
                           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",
+                           (sb, cn->bh->b_blocknr)) {
+                               reiserfs_panic(sb, "journal-2332",
                                               "Trying to log block %lu, "
                                               "which is a log block",
                                               cn->bh->b_blocknr);
                        }
                        jl_cn->blocknr = cn->bh->b_blocknr;
                        jl_cn->state = 0;
-                       jl_cn->sb = p_s_sb;
+                       jl_cn->sb = sb;
                        jl_cn->bh = cn->bh;
                        jl_cn->jlist = jl;
                        insert_journal_hash(journal->j_list_hash_table, jl_cn);
@@ -4131,11 +4202,11 @@ static int do_journal_end(struct reiserfs_transaction_handle *th,
                        char *addr;
                        struct page *page;
                        tmp_bh =
-                           journal_getblk(p_s_sb,
-                                          SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) +
+                           journal_getblk(sb,
+                                          SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
                                           ((cur_write_start +
                                             jindex) %
-                                           SB_ONDISK_JOURNAL_SIZE(p_s_sb)));
+                                           SB_ONDISK_JOURNAL_SIZE(sb)));
                        set_buffer_uptodate(tmp_bh);
                        page = cn->bh->b_page;
                        addr = kmap(page);
@@ -4149,15 +4220,17 @@ static int do_journal_end(struct reiserfs_transaction_handle *th,
                        clear_buffer_journaled(cn->bh);
                } else {
                        /* JDirty cleared sometime during transaction.  don't log this one */
-                       reiserfs_warning(p_s_sb, "journal-2048",
+                       reiserfs_warning(sb, "journal-2048",
                                         "BAD, buffer in journal hash, "
                                         "but not JDirty!");
                        brelse(cn->bh);
                }
                next = cn->next;
-               free_cnode(p_s_sb, cn);
+               free_cnode(sb, cn);
                cn = next;
+               reiserfs_write_unlock(sb);
                cond_resched();
+               reiserfs_write_lock(sb);
        }
 
        /* we are done  with both the c_bh and d_bh, but
@@ -4165,7 +4238,7 @@ static int do_journal_end(struct reiserfs_transaction_handle *th,
         ** so we dirty/relse c_bh in flush_commit_list, with commit_left <= 1.
         */
 
-       journal->j_current_jl = alloc_journal_list(p_s_sb);
+       journal->j_current_jl = alloc_journal_list(sb);
 
        /* now it is safe to insert this transaction on the main list */
        list_add_tail(&jl->j_list, &journal->j_journal_list);
@@ -4176,7 +4249,7 @@ static int do_journal_end(struct reiserfs_transaction_handle *th,
        old_start = journal->j_start;
        journal->j_start =
            (journal->j_start + journal->j_len +
-            2) % SB_ONDISK_JOURNAL_SIZE(p_s_sb);
+            2) % SB_ONDISK_JOURNAL_SIZE(sb);
        atomic_set(&(journal->j_wcount), 0);
        journal->j_bcount = 0;
        journal->j_last = NULL;
@@ -4191,7 +4264,7 @@ static int do_journal_end(struct reiserfs_transaction_handle *th,
        journal->j_len_alloc = 0;
        journal->j_next_full_flush = 0;
        journal->j_next_async_flush = 0;
-       init_journal_hash(p_s_sb);
+       init_journal_hash(sb);
 
        // make sure reiserfs_add_jh sees the new current_jl before we
        // write out the tails
@@ -4204,10 +4277,10 @@ static int do_journal_end(struct reiserfs_transaction_handle *th,
         * is lost.
         */
        if (!list_empty(&jl->j_tail_bh_list)) {
-               unlock_kernel();
+               reiserfs_write_unlock(sb);
                write_ordered_buffers(&journal->j_dirty_buffers_lock,
                                      journal, jl, &jl->j_tail_bh_list);
-               lock_kernel();
+               reiserfs_write_lock(sb);
        }
        BUG_ON(!list_empty(&jl->j_tail_bh_list));
        mutex_unlock(&jl->j_commit_mutex);
@@ -4220,8 +4293,8 @@ static int do_journal_end(struct reiserfs_transaction_handle *th,
         ** 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);
+               flush_commit_list(sb, jl, 1);
+               flush_journal_list(sb, jl, 1);
        } else if (!(jl->j_state & LIST_COMMIT_PENDING))
                queue_delayed_work(commit_wq, &journal->j_work, HZ / 10);
 
@@ -4235,11 +4308,11 @@ static int do_journal_end(struct reiserfs_transaction_handle *th,
                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);
+                               flush_used_journal_lists(sb, temp_jl);
                                goto first_jl;
                        } else if ((journal->j_start +
                                    journal->j_trans_max + 1) <
-                                  SB_ONDISK_JOURNAL_SIZE(p_s_sb)) {
+                                  SB_ONDISK_JOURNAL_SIZE(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
@@ -4248,11 +4321,11 @@ static int do_journal_end(struct reiserfs_transaction_handle *th,
                        }
                } else if ((journal->j_start +
                            journal->j_trans_max + 1) >
-                          SB_ONDISK_JOURNAL_SIZE(p_s_sb)) {
+                          SB_ONDISK_JOURNAL_SIZE(sb)) {
                        if (((journal->j_start + journal->j_trans_max + 1) %
-                            SB_ONDISK_JOURNAL_SIZE(p_s_sb)) >=
+                            SB_ONDISK_JOURNAL_SIZE(sb)) >=
                            temp_jl->j_start) {
-                               flush_used_journal_lists(p_s_sb, temp_jl);
+                               flush_used_journal_lists(sb, temp_jl);
                                goto first_jl;
                        } else {
                                /* we don't overlap anything from out start to the end of the
@@ -4263,34 +4336,34 @@ static int do_journal_end(struct reiserfs_transaction_handle *th,
                        }
                }
        }
-       flush_old_journal_lists(p_s_sb);
+       flush_old_journal_lists(sb);
 
        journal->j_current_jl->j_list_bitmap =
-           get_list_bitmap(p_s_sb, journal->j_current_jl);
+           get_list_bitmap(sb, journal->j_current_jl);
 
        if (!(journal->j_current_jl->j_list_bitmap)) {
-               reiserfs_panic(p_s_sb, "journal-1996",
+               reiserfs_panic(sb, "journal-1996",
                               "could not get a list bitmap");
        }
 
        atomic_set(&(journal->j_jlock), 0);
-       unlock_journal(p_s_sb);
+       unlock_journal(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);
+           journal_list_still_alive(sb, commit_trans_id)) {
+               flush_commit_list(sb, jl, 1);
        }
       out:
-       reiserfs_check_lock_depth(p_s_sb, "journal end2");
+       reiserfs_check_lock_depth(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;
+       th->t_super = sb;
 
        return journal->j_errno;
 }