diff options
author | Trond Myklebust <trond.myklebust@primarydata.com> | 2016-06-26 18:54:58 -0400 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@primarydata.com> | 2016-07-05 19:08:01 -0400 |
commit | 2e18d4d822ea9cc811ea26a880cf2ed47cbf8889 (patch) | |
tree | 1ce746bef1598990b96f6f5b4e0c11017a3c9ee7 /fs/nfs/flexfilelayout/flexfilelayout.c | |
parent | bc28e1c2e3c8a4c5198ebfd8bbae0afd73dfafd5 (diff) | |
download | linux-2e18d4d822ea9cc811ea26a880cf2ed47cbf8889.tar.gz linux-2e18d4d822ea9cc811ea26a880cf2ed47cbf8889.tar.bz2 linux-2e18d4d822ea9cc811ea26a880cf2ed47cbf8889.zip |
pNFS: Files and flexfiles always need to commit before layoutcommit
So ensure that we mark the layout for commit once the write is done,
and then ensure that the commit to ds is finished before sending
layoutcommit.
Note that by doing this, we're able to optimise away the commit
for the case of servers that don't need layoutcommit in order to
return updated attributes.
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Diffstat (limited to 'fs/nfs/flexfilelayout/flexfilelayout.c')
-rw-r--r-- | fs/nfs/flexfilelayout/flexfilelayout.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/fs/nfs/flexfilelayout/flexfilelayout.c b/fs/nfs/flexfilelayout/flexfilelayout.c index 14f2ed3f1a5b..e6206eaf2bdf 100644 --- a/fs/nfs/flexfilelayout/flexfilelayout.c +++ b/fs/nfs/flexfilelayout/flexfilelayout.c @@ -1470,6 +1470,7 @@ static void ff_layout_read_release(void *data) static int ff_layout_write_done_cb(struct rpc_task *task, struct nfs_pgio_header *hdr) { + loff_t end_offs = 0; int err; trace_nfs4_pnfs_write(hdr, task->tk_status); @@ -1495,8 +1496,10 @@ static int ff_layout_write_done_cb(struct rpc_task *task, if (hdr->res.verf->committed == NFS_FILE_SYNC || hdr->res.verf->committed == NFS_DATA_SYNC) - ff_layout_set_layoutcommit(hdr->inode, hdr->lseg, - hdr->mds_offset + (loff_t)hdr->res.count); + end_offs = hdr->mds_offset + (loff_t)hdr->res.count; + + /* Note: if the write is unstable, don't set end_offs until commit */ + ff_layout_set_layoutcommit(hdr->inode, hdr->lseg, end_offs); /* zero out fattr since we don't care DS attr at all */ hdr->fattr.valid = 0; |