From ff17be0864777fe0dfb0a477868a8cb95c1ff90e Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Tue, 1 Oct 2013 16:44:53 +0200 Subject: fuse: writepage: skip already in flight If ->writepage() tries to write back a page whose copy is still in flight, then just skip by calling redirty_page_for_writepage(). This is OK, since now ->writepage() should never be called for data integrity sync. Signed-off-by: Miklos Szeredi --- fs/fuse/file.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'fs/fuse') diff --git a/fs/fuse/file.c b/fs/fuse/file.c index f8ff019cc6ec..135360e2b9e5 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -1591,6 +1591,18 @@ static int fuse_writepage(struct page *page, struct writeback_control *wbc) { int err; + if (fuse_page_is_writeback(page->mapping->host, page->index)) { + /* + * ->writepages() should be called for sync() and friends. We + * should only get here on direct reclaim and then we are + * allowed to skip a page which is already in flight + */ + WARN_ON(wbc->sync_mode == WB_SYNC_ALL); + + redirty_page_for_writepage(wbc, page); + return 0; + } + err = fuse_writepage_locked(page); unlock_page(page); -- cgit v1.2.3