fix
authorMiklos Szeredi <miklos@szeredi.hu>
Fri, 2 Jul 2004 21:22:22 +0000 (21:22 +0000)
committerMiklos Szeredi <miklos@szeredi.hu>
Fri, 2 Jul 2004 21:22:22 +0000 (21:22 +0000)
ChangeLog
kernel/file.c

index 13aac07b81e10ccc3b2f7b4be1a1dc9da81c9317..2940f60e51cf2a32f9165860f115019add28d44f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -8,6 +8,10 @@
        * Change passing fuse include dir to 2.6 kernel make system more
        robust (hopefully fixes problems seen on SuSE 9.1)
 
+       * Fix deadlock between page writeback completion and truncate
+       (bug found by Valient Gough with the fsx-linux utility)
+
+
 2004-06-22  Miklos Szeredi <mszeredi@inf.bme.hu>
 
        * Released 1.2
index 7a545ad7f14bd9d1f0e8da52eb3741c8349d5d5f..ddd80cfe9f23d03b3ecf69ddcfe83bccadbd3731 100644 (file)
@@ -350,7 +350,6 @@ static void write_buffer_end(struct fuse_conn *fc, struct fuse_in *in,
 {
        struct page *page = (struct page *) _page;
        
-       lock_page(page);
        if(out->h.error) {
                SetPageError(page);
                if(out->h.error == -ENOSPC)
@@ -360,7 +359,6 @@ static void write_buffer_end(struct fuse_conn *fc, struct fuse_in *in,
        }
        end_page_writeback(page);
        kunmap(page);
-       unlock_page(page);
        kfree(in);      
 }
 
@@ -416,10 +414,11 @@ static int fuse_writepage(struct page *page, struct writeback_control *wbc)
                /* FIXME: check sync_mode, and wait for previous writes (or
                   signal userspace to do this) */
                if(wbc->nonblocking) {
+                       SetPageWriteback(page);
                        err = write_buffer_nonblock(inode, page, 0, count);
-                       if(!err)
-                               SetPageWriteback(page);
-                       else if(err == -EWOULDBLOCK) {
+                       if (err)
+                               ClearPageWriteback(page);
+                       if(err == -EWOULDBLOCK) {
                                __set_page_dirty_nobuffers(page);
                                err = 0;
                        }