 fs/reiser4/plugin/file/file.c |   16 +++++++++++-----
 fs/reiser4/vfs_ops.h          |    2 +-
 2 files changed, 12 insertions(+), 6 deletions(-)

diff -puN fs/reiser4/vfs_ops.h~reiser4-tmp2 fs/reiser4/vfs_ops.h
--- linux-2.6.12-rc2-mm3/fs/reiser4/vfs_ops.h~reiser4-tmp2	2005-04-20 18:22:02.838715340 +0400
+++ linux-2.6.12-rc2-mm3-vs/fs/reiser4/vfs_ops.h	2005-04-20 18:48:06.198160287 +0400
@@ -95,7 +95,7 @@ struct reiser4_file_fsdata {
 	} dir;
 	/* hints to speed up operations with regular files: read and write. */
 	struct {
-		hint_t hint;
+		hint_t hint1;
 	} reg;
 	/* */
 	struct {
diff -puN fs/reiser4/vfs_ops.c~reiser4-tmp2 fs/reiser4/vfs_ops.c
diff -puN fs/reiser4/plugin/file/file.c~reiser4-tmp2 fs/reiser4/plugin/file/file.c
--- linux-2.6.12-rc2-mm3/fs/reiser4/plugin/file/file.c~reiser4-tmp2	2005-04-20 18:45:22.213995640 +0400
+++ linux-2.6.12-rc2-mm3-vs/fs/reiser4/plugin/file/file.c	2005-04-20 18:51:02.967926319 +0400
@@ -733,8 +733,10 @@ load_file_hint(struct file *file, hint_t
 		if (IS_ERR(fsdata))
 			return PTR_ERR(fsdata);
 
-		if (seal_is_set(&fsdata->reg.hint.seal)) {
-			*hint = fsdata->reg.hint;
+		spin_lock_inode(file->f_dentry->d_inode);
+		if (seal_is_set(&fsdata->reg.hint1.seal)) {
+			*hint = fsdata->reg.hint1;
+			spin_unlock_inode(file->f_dentry->d_inode);
 			/* force re-validation of the coord on the first
 			 * iteration of the read/write loop. */
 			hint->ext_coord.valid = 0;
@@ -742,7 +744,8 @@ load_file_hint(struct file *file, hint_t
 							    &hint->ext_coord.coord));
 			return 0;
 		}
-		memset(&fsdata->reg.hint, 0, sizeof(hint_t));
+		memset(&fsdata->reg.hint1, 0, sizeof(hint_t));
+		spin_unlock_inode(file->f_dentry->d_inode);
 	}
 	hint_init_zero(hint);
 	return 0;
@@ -762,7 +765,10 @@ save_file_hint(struct file *file, const 
 	assert("vs-965", !IS_ERR(fsdata));
 	assert("nikita-19891",
 	       coords_equal(&hint->seal.coord1, &hint->ext_coord.coord));
-	fsdata->reg.hint = *hint;
+
+	spin_lock_inode(file->f_dentry->d_inode);
+	fsdata->reg.hint1 = *hint;
+	spin_unlock_inode(file->f_dentry->d_inode);
 	return;
 }
 
@@ -2299,9 +2305,9 @@ write_unix_file(struct file *file, /* fi
 				(unsigned long long)get_inode_oid(inode));
 	}
 
+	save_file_hint(file, &hint);
 	up(&uf_info->write);
  	current->backing_dev_info = 0;
-	save_file_hint(file, &hint);
 
 	return count ? count : result;
 }

_
