
From: Nikita Danilov <Nikita@Namesys.COM>

This patches reiserfs_rename.  It adds ctime update of renamed object.  It
also fixes calculation of maximal possible transaction size during rename.

Thanks to Alex Adriaanse <alex_a@caltech.edu> for finding this.



 fs/reiserfs/namei.c |   24 +++++++++++++++++-------
 1 files changed, 17 insertions(+), 7 deletions(-)

diff -puN fs/reiserfs/namei.c~reiserfs_rename-ctime-update fs/reiserfs/namei.c
--- 25/fs/reiserfs/namei.c~reiserfs_rename-ctime-update	2003-12-26 19:45:35.000000000 -0800
+++ 25-akpm/fs/reiserfs/namei.c	2003-12-26 19:45:35.000000000 -0800
@@ -1088,11 +1088,16 @@ static int reiserfs_rename (struct inode
     int jbegin_count ; 
     umode_t old_inode_mode;
     unsigned long savelink = 1;
+    struct timespec ctime;
 
-    /* two balancings: old name removal, new name insertion or "save" link,
-       stat data updates: old directory and new directory and maybe block
-       containing ".." of renamed directory */
-    jbegin_count = JOURNAL_PER_BALANCE_CNT * 3 + 3;
+    /* three balancings: (1) old name removal, (2) new name insertion
+       and (3) maybe "save" link insertion
+       stat data updates: (1) old directory,
+       (2) new directory and (3) maybe old object stat data (when it is
+       directory) and (4) maybe stat data of object to which new entry
+       pointed initially and (5) maybe block containing ".." of
+       renamed directory */
+    jbegin_count = JOURNAL_PER_BALANCE_CNT * 3 + 5;
 
     old_inode = old_dentry->d_inode;
     new_dentry_inode = new_dentry->d_inode;
@@ -1255,8 +1260,12 @@ static int reiserfs_rename (struct inode
 
     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 = 
-    new_dir->i_ctime = new_dir->i_mtime = CURRENT_TIME;
+    ctime = CURRENT_TIME;
+    old_dir->i_ctime = old_dir->i_mtime = ctime;
+    new_dir->i_ctime = new_dir->i_mtime = ctime;
+    /* thanks to Alex Adriaanse <alex_a@caltech.edu> for patch which adds ctime update of
+       renamed object */
+    old_inode->i_ctime = ctime;
 
     if (new_dentry_inode) {
 	// adjust link number of the victim
@@ -1265,7 +1274,7 @@ static int reiserfs_rename (struct inode
 	} else {
 	    new_dentry_inode->i_nlink--;
 	}
-	new_dentry_inode->i_ctime = new_dir->i_ctime;
+	new_dentry_inode->i_ctime = ctime;
 	savelink = new_dentry_inode->i_nlink;
     }
 
@@ -1298,6 +1307,7 @@ static int reiserfs_rename (struct inode
 
     reiserfs_update_sd (&th, old_dir);
     reiserfs_update_sd (&th, new_dir);
+    reiserfs_update_sd (&th, old_inode);
 
     if (new_dentry_inode) {
 	if (savelink == 0)

_
