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

_