[PATCH] 2.4 ReiserFS rename bugfix

From: Hans Reiser (reiser@namesys.com)
Date: Thu Jan 31 2002 - 11:04:28 EST


Please apply. The previous version of this bugfix was discovered by a
user to have been a reversed patch, so please use this one.

Hans

--- 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;
 

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Thu Jan 31 2002 - 21:01:35 EST