+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 inode *inode = entry->d_inode;
struct fuse_conn *fc = INO_FC(inode);
- struct fuse_req *req = fuse_get_request(fc);
+ struct fuse_req *req;
struct fuse_setattr_in inarg;
struct fuse_attr_out outarg;
int err;
-
+
+ /* FIXME: need to fix race between truncate and writepage */
+ if (attr->ia_valid & ATTR_SIZE)
+ fuse_sync_inode(inode);
+
+ req = fuse_get_request(fc);
if (!req)
return -ERESTARTSYS;
#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 err;
}
+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);
struct fuse_open_in *inarg;
struct fuse_req *req = file->private_data;
+ down(&inode->i_sem);
if (file->f_mode & FMODE_WRITE)
- filemap_fdatawrite(inode->i_mapping);
+ fuse_sync_inode(inode);
- down(&inode->i_sem);
inarg = &req->misc.open_in;
inarg->flags = file->f_flags & ~O_EXCL;
req->in.h.opcode = FUSE_RELEASE;