diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2004-07-02 21:22:37 +0000 |
---|---|---|
committer | Miklos Szeredi <miklos@szeredi.hu> | 2004-07-02 21:22:37 +0000 |
commit | 014d7d28269067df7c23aa174da84f9f7930de2b (patch) | |
tree | 188056329f9b167cf3accb8886f7be44e99233f4 | |
parent | acb4d36c3c91ffc076e76bd11ef8064bd51b4716 (diff) | |
download | libfuse-014d7d28269067df7c23aa174da84f9f7930de2b.tar.gz |
fix
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | kernel/file.c | 9 |
2 files changed, 7 insertions, 5 deletions
@@ -17,6 +17,9 @@ will allow non root user to specify the 'allow_other' mount option ('-x' option of fusermount) + * Fix deadlock between page writeback completion and truncate + (bug found by Valient Gough with the fsx-linux utility) + 2004-07-01 Miklos Szeredi <mszeredi@inf.bme.hu> * Change passing fuse include dir to 2.6 kernel make system more diff --git a/kernel/file.c b/kernel/file.c index d7b61ea..0b75637 100644 --- a/kernel/file.c +++ b/kernel/file.c @@ -480,7 +480,6 @@ static void write_buffer_end(struct fuse_conn *fc, struct fuse_req *req) req->out.h.error = -EPROTO; } - lock_page(page); if (req->out.h.error) { SetPageError(page); if (req->out.h.error == -ENOSPC) @@ -490,7 +489,6 @@ static void write_buffer_end(struct fuse_conn *fc, struct fuse_req *req) } end_page_writeback(page); kunmap(page); - unlock_page(page); fuse_put_request(fc, req); } @@ -535,10 +533,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; } |