fix
authorMiklos Szeredi <miklos@szeredi.hu>
Sun, 4 Jul 2004 21:23:11 +0000 (21:23 +0000)
committerMiklos Szeredi <miklos@szeredi.hu>
Sun, 4 Jul 2004 21:23:11 +0000 (21:23 +0000)
ChangeLog
kernel/dir.c
kernel/file.c
kernel/fuse_i.h

index 2940f60e51cf2a32f9165860f115019add28d44f..f38ce27c909e8f0506c9e9d722c2fb655e43118a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2004-07-04  Miklos Szeredi <mszeredi@inf.bme.hu>
+
+       * Fix race between truncate and writepage (fsx-linux now runs
+       without error)
+
 2004-07-02  Miklos Szeredi <mszeredi@inf.bme.hu>
 
        * Fix kernel hang on mkfifo under 2.4 kernels (spotted and patch
index d0edd3ba85c24bcaf8d2c97903186a1f6ec20412..6306795f3753c297f56c60ddeb447efc778e607d 100644 (file)
@@ -611,6 +611,10 @@ static int fuse_setattr(struct dentry *entry, struct iattr *attr)
        struct fuse_setattr_in inarg;
        struct fuse_setattr_out outarg;
 
+       /* FIXME: need to fix race between truncate and writepage */
+       if (attr->ia_valid & ATTR_SIZE) 
+               fuse_sync_inode(inode);
+
        memset(&inarg, 0, sizeof(inarg));
        inarg.valid = iattr_to_fattr(attr, &inarg.attr);
        
index ddd80cfe9f23d03b3ecf69ddcfe83bccadbd3731..fcb83c51aa2f581c689ba18bb038f8004ed505b7 100644 (file)
 
 #ifndef KERNEL_2_6
 #define PageUptodate(page) Page_Uptodate(page)
-#ifndef filemap_fdatawrite
-#ifndef NO_MM
-#define filemap_fdatawrite filemap_fdatasync
-#else
-#define filemap_fdatawrite do {} while(0)
-#endif
-#endif
 #endif
 
 static int fuse_open(struct inode *inode, struct file *file)
@@ -65,6 +58,19 @@ static int fuse_open(struct inode *inode, struct file *file)
        return out.h.error;
 }
 
+void fuse_sync_inode(struct inode *inode)
+{
+#ifdef KERNEL_2_6
+       filemap_fdatawrite(inode->i_mapping);
+       filemap_fdatawait(inode->i_mapping);
+#else
+#ifndef NO_MM
+       filemap_fdatasync(inode->i_mapping);
+       filemap_fdatawait(inode->i_mapping);
+#endif
+#endif
+}
+
 static int fuse_release(struct inode *inode, struct file *file)
 {
        struct fuse_conn *fc = INO_FC(inode);
@@ -73,7 +79,7 @@ static int fuse_release(struct inode *inode, struct file *file)
        unsigned int s = sizeof(struct fuse_in) + sizeof(struct fuse_open_in);
 
        if(file->f_mode & FMODE_WRITE)
-               filemap_fdatawrite(inode->i_mapping);
+               fuse_sync_inode(inode);
 
        in = kmalloc(s, GFP_NOFS);
        if(!in)
index b83f6634e5a692b9df3c14daec83425c2c5247e5..de9f92ac7dff7b4183b78392328bad38b6c3f0b2 100644 (file)
@@ -233,6 +233,11 @@ int request_send_nonblock(struct fuse_conn *fc, struct fuse_in *in,
  */
 int fuse_do_getattr(struct inode *inode);
 
+/**
+ * Write dirty pages
+ */
+void fuse_sync_inode(struct inode *inode);
+
 /*
  * Local Variables:
  * indent-tabs-mode: t