]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - fs/reiserfs/fix_node.c
Merge tag 'dmaengine-3.12' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw...
[karo-tx-linux.git] / fs / reiserfs / fix_node.c
index 430e0658704c3f1c19d903e78d03e80f4c305484..dc4d415303164934d21b8c0dd416adb52035f311 100644 (file)
@@ -1022,9 +1022,9 @@ static int get_far_parent(struct tree_balance *tb,
        if (buffer_locked(*pcom_father)) {
 
                /* Release the write lock while the buffer is busy */
-               reiserfs_write_unlock(tb->tb_sb);
+               int depth = reiserfs_write_unlock_nested(tb->tb_sb);
                __wait_on_buffer(*pcom_father);
-               reiserfs_write_lock(tb->tb_sb);
+               reiserfs_write_lock_nested(tb->tb_sb, depth);
                if (FILESYSTEM_CHANGED_TB(tb)) {
                        brelse(*pcom_father);
                        return REPEAT_SEARCH;
@@ -1929,9 +1929,9 @@ static int get_direct_parent(struct tree_balance *tb, int h)
                return REPEAT_SEARCH;
 
        if (buffer_locked(bh)) {
-               reiserfs_write_unlock(tb->tb_sb);
+               int depth = reiserfs_write_unlock_nested(tb->tb_sb);
                __wait_on_buffer(bh);
-               reiserfs_write_lock(tb->tb_sb);
+               reiserfs_write_lock_nested(tb->tb_sb, depth);
                if (FILESYSTEM_CHANGED_TB(tb))
                        return REPEAT_SEARCH;
        }
@@ -1952,6 +1952,7 @@ static int get_neighbors(struct tree_balance *tb, int h)
        unsigned long son_number;
        struct super_block *sb = tb->tb_sb;
        struct buffer_head *bh;
+       int depth;
 
        PROC_INFO_INC(sb, get_neighbors[h]);
 
@@ -1969,9 +1970,9 @@ static int get_neighbors(struct tree_balance *tb, int h)
                     tb->FL[h]) ? tb->lkey[h] : B_NR_ITEMS(tb->
                                                                       FL[h]);
                son_number = B_N_CHILD_NUM(tb->FL[h], child_position);
-               reiserfs_write_unlock(sb);
+               depth = reiserfs_write_unlock_nested(tb->tb_sb);
                bh = sb_bread(sb, son_number);
-               reiserfs_write_lock(sb);
+               reiserfs_write_lock_nested(tb->tb_sb, depth);
                if (!bh)
                        return IO_ERROR;
                if (FILESYSTEM_CHANGED_TB(tb)) {
@@ -2009,9 +2010,9 @@ static int get_neighbors(struct tree_balance *tb, int h)
                child_position =
                    (bh == tb->FR[h]) ? tb->rkey[h] + 1 : 0;
                son_number = B_N_CHILD_NUM(tb->FR[h], child_position);
-               reiserfs_write_unlock(sb);
+               depth = reiserfs_write_unlock_nested(tb->tb_sb);
                bh = sb_bread(sb, son_number);
-               reiserfs_write_lock(sb);
+               reiserfs_write_lock_nested(tb->tb_sb, depth);
                if (!bh)
                        return IO_ERROR;
                if (FILESYSTEM_CHANGED_TB(tb)) {
@@ -2272,6 +2273,7 @@ static int wait_tb_buffers_until_unlocked(struct tree_balance *tb)
                }
 
                if (locked) {
+                       int depth;
 #ifdef CONFIG_REISERFS_CHECK
                        repeat_counter++;
                        if ((repeat_counter % 10000) == 0) {
@@ -2286,9 +2288,9 @@ static int wait_tb_buffers_until_unlocked(struct tree_balance *tb)
                                    REPEAT_SEARCH : CARRY_ON;
                        }
 #endif
-                       reiserfs_write_unlock(tb->tb_sb);
+                       depth = reiserfs_write_unlock_nested(tb->tb_sb);
                        __wait_on_buffer(locked);
-                       reiserfs_write_lock(tb->tb_sb);
+                       reiserfs_write_lock_nested(tb->tb_sb, depth);
                        if (FILESYSTEM_CHANGED_TB(tb))
                                return REPEAT_SEARCH;
                }
@@ -2359,9 +2361,9 @@ int fix_nodes(int op_mode, struct tree_balance *tb,
 
        /* if it possible in indirect_to_direct conversion */
        if (buffer_locked(tbS0)) {
-               reiserfs_write_unlock(tb->tb_sb);
+               int depth = reiserfs_write_unlock_nested(tb->tb_sb);
                __wait_on_buffer(tbS0);
-               reiserfs_write_lock(tb->tb_sb);
+               reiserfs_write_lock_nested(tb->tb_sb, depth);
                if (FILESYSTEM_CHANGED_TB(tb))
                        return REPEAT_SEARCH;
        }