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