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

index ed6a9995a66bfa7f5a227a728af61d4374e71f88..0d7b993f02985a268d8fb1e95e0b542c9b3ad32d 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 aa3129538fe72a5f75f8e59426b87b44fd088db2..f0a5aa66d7939b05f458a41f1eecf0d595a3e678 100644 (file)
@@ -724,11 +724,16 @@ static int fuse_setattr(struct dentry *entry, struct iattr *attr)
 {
        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;
 
index 0b756374ddbb5b2f97ffe2cc344805cbbe8d87c0..4a800e83266dd6e45c0b2438af689b0979c0833e 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)
@@ -85,16 +78,29 @@ 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;
index 59bc0bcde4a6b9f44e1702be518f37061e3dbbcc..f0c1171cbf20de36e0d2019d31df7df535fef584 100644 (file)
@@ -328,6 +328,11 @@ void request_send_nonblock(struct fuse_conn *fc, struct fuse_req *req,
  */
 int fuse_do_getattr(struct inode *inode);
 
+/**
+ * Write dirty pages
+ */
+void fuse_sync_inode(struct inode *inode);
+
 /*
  * Local Variables:
  * indent-tabs-mode: t