From: Chris Mason <mason@suse.com>

Add conditional schedules to reiserfs to help lower latencies.  Bits of
this orginated long ago in code akpm sent me.


---

 25-akpm/fs/reiserfs/stree.c         |   13 ++++++-------
 25-akpm/include/linux/reiserfs_fs.h |    3 ++-
 2 files changed, 8 insertions(+), 8 deletions(-)

diff -puN fs/reiserfs/stree.c~reiserfs-lock-lat fs/reiserfs/stree.c
--- 25/fs/reiserfs/stree.c~reiserfs-lock-lat	2004-03-12 18:25:20.847488080 -0800
+++ 25-akpm/fs/reiserfs/stree.c	2004-03-12 18:25:20.852487320 -0800
@@ -652,8 +652,8 @@ int search_by_key (struct super_block * 
                                        stop at leaf level - set to
                                        DISK_LEAF_NODE_LEVEL */
     ) {
-    int  n_block_number = SB_ROOT_BLOCK (p_s_sb),
-      expected_level = SB_TREE_HEIGHT (p_s_sb);
+    int  n_block_number;
+    int  expected_level;
     struct buffer_head  *       p_s_bh;
     struct path_element *       p_s_last_element;
     int				n_node_level, n_retval;
@@ -677,6 +677,8 @@ int search_by_key (struct super_block * 
     /* With each iteration of this loop we search through the items in the
        current node, and calculate the next current node(next path element)
        for the next iteration of this loop.. */
+    n_block_number = SB_ROOT_BLOCK (p_s_sb);
+    expected_level = SB_TREE_HEIGHT (p_s_sb);
     while ( 1 ) {
 
 #ifdef CONFIG_REISERFS_CHECK
@@ -706,16 +708,12 @@ int search_by_key (struct super_block * 
 	    return IO_ERROR;
 	}
 
- 	if( fs_changed (fs_gen, p_s_sb) ) {
- 		PROC_INFO_INC( p_s_sb, search_by_key_fs_changed );
- 		PROC_INFO_INC( p_s_sb, sbk_fs_changed[ expected_level - 1 ] );
- 	}
-
 	/* It is possible that schedule occurred. We must check whether the key
 	   to search is still in the tree rooted from the current buffer. If
 	   not then repeat search from the root. */
 	if ( fs_changed (fs_gen, p_s_sb) && 
 	     (!B_IS_IN_TREE (p_s_bh) || !key_in_buffer(p_s_search_path, p_s_key, p_s_sb)) ) {
+	    PROC_INFO_INC( p_s_sb, search_by_key_fs_changed );
  	    PROC_INFO_INC( p_s_sb, search_by_key_restarted );
 	    PROC_INFO_INC( p_s_sb, sbk_restarted[ expected_level - 1 ] );
 	    decrement_counters_in_path(p_s_search_path);
@@ -1103,6 +1101,7 @@ static char  prepare_for_delete_or_cut(
 	    for (n_counter = *p_n_removed;
 		 n_counter < n_unfm_number; n_counter++, p_n_unfm_pointer-- ) {
 
+		cond_resched();
 		if (item_moved (&s_ih, p_s_path)) {
 		    need_research = 1 ;
 		    break;
diff -puN include/linux/reiserfs_fs.h~reiserfs-lock-lat include/linux/reiserfs_fs.h
--- 25/include/linux/reiserfs_fs.h~reiserfs-lock-lat	2004-03-12 18:25:20.849487776 -0800
+++ 25-akpm/include/linux/reiserfs_fs.h	2004-03-12 18:25:20.854487016 -0800
@@ -1335,7 +1335,8 @@ static inline loff_t max_reiserfs_offset
 #define fs_generation(s) (REISERFS_SB(s)->s_generation_counter)
 #define get_generation(s) atomic_read (&fs_generation(s))
 #define FILESYSTEM_CHANGED_TB(tb)  (get_generation((tb)->tb_sb) != (tb)->fs_gen)
-#define fs_changed(gen,s) (gen != get_generation (s))
+#define __fs_changed(gen,s) (gen != get_generation (s))
+#define fs_changed(gen,s) ({cond_resched(); __fs_changed(gen, s);})
 
 
 /***************************************************************************/

_