From: Trond Myklebust Ensure that we use set_page_writeback() in the appropriate places to help the VM in keeping its page radix_tree in sync. Ensure that we always initiate flushing of data before we exit a single-page ->writepage() call. Signed-off-by: Trond Myklebust Signed-off-by: Andrew Morton --- fs/nfs/write.c | 22 +++++++++------------- 1 files changed, 9 insertions(+), 13 deletions(-) diff -puN fs/nfs/write.c~nfs-work-correctly-with-single-page-writepage-calls fs/nfs/write.c --- devel/fs/nfs/write.c~nfs-work-correctly-with-single-page-writepage-calls 2005-11-16 16:25:22.000000000 -0800 +++ devel-akpm/fs/nfs/write.c 2005-11-16 16:25:22.000000000 -0800 @@ -189,6 +189,7 @@ static int nfs_writepage_sync(struct nfs (long long)NFS_FILEID(inode), count, (long long)(page_offset(page) + offset)); + set_page_writeback(page); nfs_begin_data_update(inode); do { if (count < wsize) @@ -221,6 +222,7 @@ static int nfs_writepage_sync(struct nfs io_error: nfs_end_data_update(inode); + end_page_writeback(page); nfs_writedata_free(wdata); return written ? written : result; } @@ -230,19 +232,16 @@ static int nfs_writepage_async(struct nf unsigned int offset, unsigned int count) { struct nfs_page *req; - int status; req = nfs_update_request(ctx, inode, page, offset, count); - status = (IS_ERR(req)) ? PTR_ERR(req) : 0; - if (status < 0) - goto out; + if (IS_ERR(req)) + return PTR_ERR(req); /* Update file length */ nfs_grow_file(page, offset, count); /* Set the PG_uptodate flag? */ nfs_mark_uptodate(page, offset, count); nfs_unlock_request(req); - out: - return status; + return 0; } static int wb_priority(struct writeback_control *wbc) @@ -302,11 +301,8 @@ do_it: lock_kernel(); if (!IS_SYNC(inode) && inode_referenced) { err = nfs_writepage_async(ctx, inode, page, 0, offset); - if (err >= 0) { - err = 0; - if (wbc->for_reclaim) - nfs_flush_inode(inode, 0, 0, FLUSH_STABLE); - } + if (!wbc->for_writepages) + nfs_flush_inode(inode, 0, 0, wb_priority(wbc)); } else { err = nfs_writepage_sync(ctx, inode, page, 0, offset, priority); @@ -929,7 +925,7 @@ static int nfs_flush_multi(struct list_h atomic_set(&req->wb_complete, requests); ClearPageError(page); - SetPageWriteback(page); + set_page_writeback(page); offset = 0; nbytes = req->wb_bytes; do { @@ -992,7 +988,7 @@ static int nfs_flush_one(struct list_hea nfs_list_remove_request(req); nfs_list_add_request(req, &data->pages); ClearPageError(req->wb_page); - SetPageWriteback(req->wb_page); + set_page_writeback(req->wb_page); *pages++ = req->wb_page; count += req->wb_bytes; } _