diff options
author | Trond Myklebust <trond.myklebust@primarydata.com> | 2014-01-13 19:34:36 +0100 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@primarydata.com> | 2014-01-13 19:34:36 +0100 |
commit | 71244d9bdf185e5bba1473254241f9f65d4dd0d8 (patch) | |
tree | 054ddd9a95c3ada5243dead8da568471fc7d5137 /fs/nfs/nfs4super.c | |
parent | NFSv4.1: Don't trust attributes if a pNFS LAYOUTCOMMIT is outstanding (diff) | |
download | linux-71244d9bdf185e5bba1473254241f9f65d4dd0d8.tar.xz linux-71244d9bdf185e5bba1473254241f9f65d4dd0d8.zip |
NFSv4.1: Fix a race in nfs4_write_inode
nfs4_write_inode() must not be allowed to exit until the layoutcommit
is done. That means that both NFS_INO_LAYOUTCOMMIT and
NFS_INO_LAYOUTCOMMITTING have to be cleared.
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Diffstat (limited to 'fs/nfs/nfs4super.c')
-rw-r--r-- | fs/nfs/nfs4super.c | 14 |
1 files changed, 3 insertions, 11 deletions
diff --git a/fs/nfs/nfs4super.c b/fs/nfs/nfs4super.c index 65ab0a0ca1c4..808f29574412 100644 --- a/fs/nfs/nfs4super.c +++ b/fs/nfs/nfs4super.c @@ -77,17 +77,9 @@ static int nfs4_write_inode(struct inode *inode, struct writeback_control *wbc) { int ret = nfs_write_inode(inode, wbc); - if (ret >= 0 && test_bit(NFS_INO_LAYOUTCOMMIT, &NFS_I(inode)->flags)) { - int status; - bool sync = true; - - if (wbc->sync_mode == WB_SYNC_NONE) - sync = false; - - status = pnfs_layoutcommit_inode(inode, sync); - if (status < 0) - return status; - } + if (ret == 0) + ret = pnfs_layoutcommit_inode(inode, + wbc->sync_mode == WB_SYNC_ALL); return ret; } |