Hello
Sander wrote:
> Hesse, Christian wrote (ao):
>>On Wednesday 23 November 2005 13:17, Sander wrote:
>>>Hesse, Christian wrote (ao):
>>>>For Sander's list:
>>>>
>>>>http://www.earthworm.de/tmp/reiser4-fsync.c
>>>>strace -T -e sync,fsync reiser4-fsync
>>>I've added this one, but it segfaults at my system:
>>>
>>>$ gcc -o reiser4-fsync reiser4-fsync.c
>>>$ strace -T -e sync,fsync ./reiser4-fsync
>>>Segmentation fault
>>>
>>>Any idea?
>>I think that is caused by a patch in -mm. You should read
>>"2.6.15-rc1-mm2 breaks strace" on lkml.
>
> I use -mm for Reiser4 obviously :-)
>
> Owh well, it is still useful for other kernels of course.
>
Please unapply the attached patch and check whether it makes any effect.
cd fs/reiser4
cat patch | patch -p1 -R
diff --git a/plugin/file_ops_readdir.c b/plugin/file_ops_readdir.c
index 9926e7c..b85ae7f 100644
--- a/plugin/file_ops_readdir.c
+++ b/plugin/file_ops_readdir.c
@@ -632,6 +632,14 @@ int readdir_common(struct file *f /* dir
tap_done(&tap);
detach_fsdata(f);
+ /* try to update directory's atime */
+ if (reiser4_grab_space(inode_file_plugin(inode)->estimate.update(inode),
+ BA_CAN_COMMIT) != 0)
+ warning("", "failed to update atime on readdir: %llu",
+ get_inode_oid(inode));
+ else
+ update_atime(inode);
+
context_set_commit_async(ctx);
reiser4_exit_context(ctx);
diff --git a/super_ops.c b/super_ops.c
index fe18006..f4b750b 100644
--- a/super_ops.c
+++ b/super_ops.c
@@ -156,6 +156,28 @@ static void reiser4_destroy_inode(struct
}
/**
+ * reiser4_dirty_inode - dirty_inode of super operations
+ * @inode: inode being dirtied
+ *
+ * Updates stat data.
+ */
+static void reiser4_dirty_inode(struct inode *inode)
+{
+ int result;
+
+ if (!is_in_reiser4_context())
+ return;
+ assert("", !IS_RDONLY(inode));
+ assert("", (inode_file_plugin(inode)->estimate.update(inode) <=
+ get_current_context()->grabbed_blocks));
+
+ result = reiser4_update_sd(inode);
+ if (result)
+ warning("", "failed to dirty inode for %llu: %d",
+ get_inode_oid(inode), result);
+}
+
+/**
* reiser4_delete_inode - delete_inode of super operations
* @inode: inode to delete
*
@@ -421,6 +443,7 @@ static int reiser4_show_options(struct s
struct super_operations reiser4_super_operations = {
.alloc_inode = reiser4_alloc_inode,
.destroy_inode = reiser4_destroy_inode,
+ .dirty_inode = reiser4_dirty_inode,
.delete_inode = reiser4_delete_inode,
.put_super = reiser4_put_super,
.write_super = reiser4_write_super,
diff --git a/vfs_ops.c b/vfs_ops.c
index 7adce84..64cc23d 100644
--- a/vfs_ops.c
+++ b/vfs_ops.c
@@ -53,11 +53,6 @@
#include <linux/rcupdate.h>
-extern struct dentry_operations reiser4_dentry_operation;
-
-
-
-
/* update inode stat-data by calling plugin */
int reiser4_update_sd(struct inode *object)
{
@@ -254,8 +249,6 @@ void reiser4_handle_error(void)
}
}
-
-
struct dentry_operations reiser4_dentry_operations = {
.d_revalidate = NULL,
.d_hash = NULL,
diff --git a/vfs_ops.h b/vfs_ops.h
index 9ba968c..f1556a4 100644
--- a/vfs_ops.h
+++ b/vfs_ops.h
@@ -27,7 +27,7 @@ int reiser4_readpages(struct file *, str
int reiser4_invalidatepage(struct page *, unsigned long offset);
int reiser4_releasepage(struct page *, int gfp);
-extern int reiser4_update_sd(struct inode *object);
+extern int reiser4_update_sd(struct inode *);
extern int reiser4_add_nlink(struct inode *, struct inode *, int);
extern int reiser4_del_nlink(struct inode *, struct inode *, int);
======== end ========