From: Miklos Szeredi Date: Fri, 2 Jul 2004 21:22:22 +0000 (+0000) Subject: fix X-Git-Tag: fuse_1_3~7 X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=8adcd561f351a9fccaf10dc82dceaeb925358b5b;p=qemu-gpiodev%2Flibfuse.git fix --- diff --git a/ChangeLog b/ChangeLog index 13aac07..2940f60 100644 --- 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 * Released 1.2 diff --git a/kernel/file.c b/kernel/file.c index 7a545ad..ddd80cf 100644 --- a/kernel/file.c +++ b/kernel/file.c @@ -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; }