aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/file.c
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2005-12-13 16:13:54 -0500
committerTrond Myklebust <Trond.Myklebust@netapp.com>2005-12-19 23:12:09 -0500
commit29884df0d89c1df0dec3449405bc41569bb44800 (patch)
treeb836dc3ece80a901d1b7a9e946bf0d51ec0c8c4f /fs/nfs/file.c
parentb079fa7baa86b47579f3f60f86d03d21c76159b8 (diff)
NFS: Fix another O_DIRECT race
Ensure we call unmap_mapping_range() and sync dirty pages to disk before doing an NFS direct write. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/file.c')
-rw-r--r--fs/nfs/file.c23
1 files changed, 4 insertions, 19 deletions
diff --git a/fs/nfs/file.c b/fs/nfs/file.c
index 57d3e77d97ee..eb5cd4c3bbfd 100644
--- a/fs/nfs/file.c
+++ b/fs/nfs/file.c
@@ -433,11 +433,7 @@ static int do_unlk(struct file *filp, int cmd, struct file_lock *fl)
433 * Flush all pending writes before doing anything 433 * Flush all pending writes before doing anything
434 * with locks.. 434 * with locks..
435 */ 435 */
436 filemap_fdatawrite(filp->f_mapping); 436 nfs_sync_mapping(filp->f_mapping);
437 down(&inode->i_sem);
438 nfs_wb_all(inode);
439 up(&inode->i_sem);
440 filemap_fdatawait(filp->f_mapping);
441 437
442 /* NOTE: special case 438 /* NOTE: special case
443 * If we're signalled while cleaning up locks on process exit, we 439 * If we're signalled while cleaning up locks on process exit, we
@@ -465,15 +461,8 @@ static int do_setlk(struct file *filp, int cmd, struct file_lock *fl)
465 * Flush all pending writes before doing anything 461 * Flush all pending writes before doing anything
466 * with locks.. 462 * with locks..
467 */ 463 */
468 status = filemap_fdatawrite(filp->f_mapping); 464 status = nfs_sync_mapping(filp->f_mapping);
469 if (status == 0) { 465 if (status != 0)
470 down(&inode->i_sem);
471 status = nfs_wb_all(inode);
472 up(&inode->i_sem);
473 if (status == 0)
474 status = filemap_fdatawait(filp->f_mapping);
475 }
476 if (status < 0)
477 goto out; 466 goto out;
478 467
479 lock_kernel(); 468 lock_kernel();
@@ -497,11 +486,7 @@ static int do_setlk(struct file *filp, int cmd, struct file_lock *fl)
497 * Make sure we clear the cache whenever we try to get the lock. 486 * Make sure we clear the cache whenever we try to get the lock.
498 * This makes locking act as a cache coherency point. 487 * This makes locking act as a cache coherency point.
499 */ 488 */
500 filemap_fdatawrite(filp->f_mapping); 489 nfs_sync_mapping(filp->f_mapping);
501 down(&inode->i_sem);
502 nfs_wb_all(inode); /* we may have slept */
503 up(&inode->i_sem);
504 filemap_fdatawait(filp->f_mapping);
505 nfs_zap_caches(inode); 490 nfs_zap_caches(inode);
506out: 491out:
507 rpc_clnt_sigunmask(NFS_CLIENT(inode), &oldset); 492 rpc_clnt_sigunmask(NFS_CLIENT(inode), &oldset);