Skip to content

Commit 8fc3c38

Browse files
committed
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 <[email protected]>
1 parent 6712007 commit 8fc3c38

File tree

3 files changed

+16
-3
lines changed

3 files changed

+16
-3
lines changed

fs/nfs/direct.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,12 @@ static void nfs_direct_set_hdr_verf(struct nfs_direct_req *dreq,
196196
WARN_ON_ONCE(verfp->committed < 0);
197197
}
198198

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+
199205
/*
200206
* nfs_direct_cmp_hdr_verf - compare verifier for pgio header
201207
* @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,
215221
nfs_direct_set_hdr_verf(dreq, hdr);
216222
return 0;
217223
}
218-
return memcmp(verfp, &hdr->verf, sizeof(struct nfs_writeverf));
224+
return nfs_direct_cmp_verf(verfp, &hdr->verf);
219225
}
220226

221227
/*
@@ -238,7 +244,7 @@ static int nfs_direct_cmp_commit_data_verf(struct nfs_direct_req *dreq,
238244
if (verfp->committed < 0)
239245
return 1;
240246

241-
return memcmp(verfp, &data->verf, sizeof(struct nfs_writeverf));
247+
return nfs_direct_cmp_verf(verfp, &data->verf);
242248
}
243249

244250
/**

fs/nfs/internal.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,13 @@ extern int nfs_migrate_page(struct address_space *,
506506
#define nfs_migrate_page NULL
507507
#endif
508508

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+
509516
/* unlink.c */
510517
extern struct rpc_task *
511518
nfs_async_rename(struct inode *old_dir, struct inode *new_dir,

fs/nfs/write.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1789,7 +1789,7 @@ static void nfs_commit_release_pages(struct nfs_commit_data *data)
17891789

17901790
/* Okay, COMMIT succeeded, apparently. Check the verifier
17911791
* 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)) {
17931793
/* We have a match */
17941794
nfs_inode_remove_request(req);
17951795
dprintk(" OK\n");

0 commit comments

Comments
 (0)