diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-01-03 03:55:02 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-01-06 14:58:39 -0500 |
commit | abd3e641d5ef9f836ab2f2b04d80b8619b051531 (patch) | |
tree | 053c82b4c23a5fb419691154879acff3f487923b | |
parent | 22905f775dd6a8b73be99826dcad07ceec00244b (diff) |
NFS: Work correctly with single-page ->writepage() calls
Ensure that we always initiate flushing of data before we exit
a single-page ->writepage() call.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r-- | fs/nfs/write.c | 16 |
1 files changed, 5 insertions, 11 deletions
diff --git a/fs/nfs/write.c b/fs/nfs/write.c index 3107908e5f3f..95d00f9132d0 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c | |||
@@ -232,19 +232,16 @@ static int nfs_writepage_async(struct nfs_open_context *ctx, | |||
232 | unsigned int offset, unsigned int count) | 232 | unsigned int offset, unsigned int count) |
233 | { | 233 | { |
234 | struct nfs_page *req; | 234 | struct nfs_page *req; |
235 | int status; | ||
236 | 235 | ||
237 | req = nfs_update_request(ctx, inode, page, offset, count); | 236 | req = nfs_update_request(ctx, inode, page, offset, count); |
238 | status = (IS_ERR(req)) ? PTR_ERR(req) : 0; | 237 | if (IS_ERR(req)) |
239 | if (status < 0) | 238 | return PTR_ERR(req); |
240 | goto out; | ||
241 | /* Update file length */ | 239 | /* Update file length */ |
242 | nfs_grow_file(page, offset, count); | 240 | nfs_grow_file(page, offset, count); |
243 | /* Set the PG_uptodate flag? */ | 241 | /* Set the PG_uptodate flag? */ |
244 | nfs_mark_uptodate(page, offset, count); | 242 | nfs_mark_uptodate(page, offset, count); |
245 | nfs_unlock_request(req); | 243 | nfs_unlock_request(req); |
246 | out: | 244 | return 0; |
247 | return status; | ||
248 | } | 245 | } |
249 | 246 | ||
250 | static int wb_priority(struct writeback_control *wbc) | 247 | static int wb_priority(struct writeback_control *wbc) |
@@ -304,11 +301,8 @@ do_it: | |||
304 | lock_kernel(); | 301 | lock_kernel(); |
305 | if (!IS_SYNC(inode) && inode_referenced) { | 302 | if (!IS_SYNC(inode) && inode_referenced) { |
306 | err = nfs_writepage_async(ctx, inode, page, 0, offset); | 303 | err = nfs_writepage_async(ctx, inode, page, 0, offset); |
307 | if (err >= 0) { | 304 | if (!wbc->for_writepages) |
308 | err = 0; | 305 | nfs_flush_inode(inode, 0, 0, wb_priority(wbc)); |
309 | if (wbc->for_reclaim) | ||
310 | nfs_flush_inode(inode, 0, 0, FLUSH_STABLE); | ||
311 | } | ||
312 | } else { | 306 | } else { |
313 | err = nfs_writepage_sync(ctx, inode, page, 0, | 307 | err = nfs_writepage_sync(ctx, inode, page, 0, |
314 | offset, priority); | 308 | offset, priority); |