--- linux/fs/reiserfs/namei.c.orig      Thu Jan 31 14:47:21 2002
+++ linux/fs/reiserfs/namei.c   Thu Jan 31 14:47:38 2002
@@ -1043,7 +1043,7 @@
    INITIALIZE_PATH (old_entry_path);
    INITIALIZE_PATH (new_entry_path);
    INITIALIZE_PATH (dot_dot_entry_path);
-    struct item_head new_entry_ih, old_entry_ih ;
+    struct item_head new_entry_ih, old_entry_ih, dot_dot_ih ;
    struct reiserfs_dir_entry old_de, new_de, dot_dot_de;
    struct inode * old_inode, * new_inode;
    int windex ;
@@ -1132,6 +1132,8 @@

       copy_item_head(&old_entry_ih, get_ih(&old_entry_path)) ;

+       reiserfs_prepare_for_journal(old_inode->i_sb, old_de.de_bh, 1) ;
+
       // look for new name by reiserfs_find_entry
       new_de.de_gen_number_bit_string = 0;
       retval = reiserfs_find_entry (new_dir, new_dentry->d_name.name, new_dentry->d_name.len,
@@ -1146,6 +1148,7 @@
       if (S_ISDIR(old_inode->i_mode)) {
           if (search_by_entry_key (new_dir->i_sb, &dot_dot_de.de_entry_key, &dot_dot_entry_path, &dot_dot_de) != NAME_FOUND)
               BUG ();
+           copy_item_head(&dot_dot_ih, get_ih(&dot_dot_entry_path)) ;
           // node containing ".." gets into transaction
           reiserfs_prepare_for_journal(old_inode->i_sb, dot_dot_de.de_bh, 1) ;
       }
@@ -1162,23 +1165,33 @@
       ** of the above checks could have scheduled.  We have to be
       ** sure our items haven't been shifted by another process.
       */
-       if (!entry_points_to_object(new_dentry->d_name.name,
+       if (item_moved(&new_entry_ih, &new_entry_path) ||
+           !entry_points_to_object(new_dentry->d_name.name,
                                   new_dentry->d_name.len,
                                   &new_de, new_inode) ||
-           item_moved(&new_entry_ih, &new_entry_path) ||
           item_moved(&old_entry_ih, &old_entry_path) ||
           !entry_points_to_object (old_dentry->d_name.name,
                                    old_dentry->d_name.len,
                                    &old_de, old_inode)) {
           reiserfs_restore_prepared_buffer (old_inode->i_sb, new_de.de_bh);
+           reiserfs_restore_prepared_buffer (old_inode->i_sb, old_de.de_bh);
           if (S_ISDIR(old_inode->i_mode))
               reiserfs_restore_prepared_buffer (old_inode->i_sb, dot_dot_de.de_bh);
           continue;
       }
+       if (S_ISDIR(old_inode->i_mode)) {
+           if ( item_moved(&dot_dot_ih, &dot_dot_entry_path) ||
+                !entry_points_to_object ( "..", 2, &dot_dot_de, old_dir) ) {
+               reiserfs_restore_prepared_buffer (old_inode->i_sb, old_de.de_bh);
+               reiserfs_restore_prepared_buffer (old_inode->i_sb, new_de.de_bh);
+               reiserfs_restore_prepared_buffer (old_inode->i_sb, dot_dot_de.de_bh);
+               continue;
+           }
+       }
+

       RFALSE( S_ISDIR(old_inode->i_mode) &&
-               (!entry_points_to_object ("..", 2, &dot_dot_de, old_dir) ||
-                !reiserfs_buffer_prepared(dot_dot_de.de_bh)), "" );
+               !reiserfs_buffer_prepared(dot_dot_de.de_bh), "" );

       break;
    }
@@ -1191,6 +1204,7 @@
    journal_mark_dirty (&th, old_dir->i_sb, new_de.de_bh);

    mark_de_hidden (old_de.de_deh + old_de.de_entry_num);
+    journal_mark_dirty (&th, old_dir->i_sb, old_de.de_bh);
    old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME;
    new_dir->i_ctime = new_dir->i_mtime = CURRENT_TIME;