diff options
author | Trond Myklebust <trond.myklebust@primarydata.com> | 2016-06-01 21:32:24 -0400 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@primarydata.com> | 2016-07-05 19:11:01 -0400 |
commit | 8fc3c3862728373e0d0f5abccc6afc56c69e0c63 (patch) | |
tree | 6d8dcf0fb32de0ba8d78d891832eef421cd69919 | |
parent | 6712007734cbd64ff924af16fc236751d47ff80b (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.c | 10 | ||||
-rw-r--r-- | fs/nfs/internal.h | 7 | ||||
-rw-r--r-- | fs/nfs/write.c | 2 |
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 | ||
199 | static 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 | ||
509 | static inline int | ||
510 | nfs_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 */ |
510 | extern struct rpc_task * | 517 | extern struct rpc_task * |
511 | nfs_async_rename(struct inode *old_dir, struct inode *new_dir, | 518 | nfs_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"); |