aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrond Myklebust <trond.myklebust@primarydata.com>2016-06-01 21:32:24 -0400
committerTrond Myklebust <trond.myklebust@primarydata.com>2016-07-05 19:11:01 -0400
commit8fc3c3862728373e0d0f5abccc6afc56c69e0c63 (patch)
tree6d8dcf0fb32de0ba8d78d891832eef421cd69919
parent6712007734cbd64ff924af16fc236751d47ff80b (diff)
NFS: Fix O_DIRECT verifier problems
We should not be interested in looking at the value of the stable field, since that could take any value. Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
-rw-r--r--fs/nfs/direct.c10
-rw-r--r--fs/nfs/internal.h7
-rw-r--r--fs/nfs/write.c2
3 files changed, 16 insertions, 3 deletions
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
index 979b3c4dee6a..d6d43b5eafb3 100644
--- a/fs/nfs/direct.c
+++ b/fs/nfs/direct.c
@@ -196,6 +196,12 @@ static void nfs_direct_set_hdr_verf(struct nfs_direct_req *dreq,
196 WARN_ON_ONCE(verfp->committed < 0); 196 WARN_ON_ONCE(verfp->committed < 0);
197} 197}
198 198
199static int nfs_direct_cmp_verf(const struct nfs_writeverf *v1,
200 const struct nfs_writeverf *v2)
201{
202 return nfs_write_verifier_cmp(&v1->verifier, &v2->verifier);
203}
204
199/* 205/*
200 * nfs_direct_cmp_hdr_verf - compare verifier for pgio header 206 * nfs_direct_cmp_hdr_verf - compare verifier for pgio header
201 * @dreq - direct request possibly spanning multiple servers 207 * @dreq - direct request possibly spanning multiple servers
@@ -215,7 +221,7 @@ static int nfs_direct_set_or_cmp_hdr_verf(struct nfs_direct_req *dreq,
215 nfs_direct_set_hdr_verf(dreq, hdr); 221 nfs_direct_set_hdr_verf(dreq, hdr);
216 return 0; 222 return 0;
217 } 223 }
218 return memcmp(verfp, &hdr->verf, sizeof(struct nfs_writeverf)); 224 return nfs_direct_cmp_verf(verfp, &hdr->verf);
219} 225}
220 226
221/* 227/*
@@ -238,7 +244,7 @@ static int nfs_direct_cmp_commit_data_verf(struct nfs_direct_req *dreq,
238 if (verfp->committed < 0) 244 if (verfp->committed < 0)
239 return 1; 245 return 1;
240 246
241 return memcmp(verfp, &data->verf, sizeof(struct nfs_writeverf)); 247 return nfs_direct_cmp_verf(verfp, &data->verf);
242} 248}
243 249
244/** 250/**
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index 5154fa65a2f2..150a8eb0f323 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -506,6 +506,13 @@ extern int nfs_migrate_page(struct address_space *,
506#define nfs_migrate_page NULL 506#define nfs_migrate_page NULL
507#endif 507#endif
508 508
509static inline int
510nfs_write_verifier_cmp(const struct nfs_write_verifier *v1,
511 const struct nfs_write_verifier *v2)
512{
513 return memcmp(v1->data, v2->data, sizeof(v1->data));
514}
515
509/* unlink.c */ 516/* unlink.c */
510extern struct rpc_task * 517extern struct rpc_task *
511nfs_async_rename(struct inode *old_dir, struct inode *new_dir, 518nfs_async_rename(struct inode *old_dir, struct inode *new_dir,
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index b13d48881d3a..3087fb6f1983 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -1789,7 +1789,7 @@ static void nfs_commit_release_pages(struct nfs_commit_data *data)
1789 1789
1790 /* Okay, COMMIT succeeded, apparently. Check the verifier 1790 /* Okay, COMMIT succeeded, apparently. Check the verifier
1791 * returned by the server against all stored verfs. */ 1791 * returned by the server against all stored verfs. */
1792 if (!memcmp(&req->wb_verf, &data->verf.verifier, sizeof(req->wb_verf))) { 1792 if (!nfs_write_verifier_cmp(&req->wb_verf, &data->verf.verifier)) {
1793 /* We have a match */ 1793 /* We have a match */
1794 nfs_inode_remove_request(req); 1794 nfs_inode_remove_request(req);
1795 dprintk(" OK\n"); 1795 dprintk(" OK\n");