+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
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);
#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)
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);
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)