diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-03-04 18:13:56 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-03-06 10:32:44 -0500 |
commit | 8e663f0e5fabf57065aed1cfdaff5b13057dce23 (patch) | |
tree | 844f5568113fe1c43a6d4ac93e9dfd5452682e06 | |
parent | a1d0b5eebc4fd6e0edb02688b35f17f67f42aea5 (diff) |
NFSv4.1: Fix matching of the stateids when returning a delegation
nfs41_validate_delegation_stateid is broken if we supply a stateid with
a non-zero sequence id. Instead of trying to match the sequence id,
the function assumes that we always want to error. While this is
true for a delegation callback, it is not true in general.
Also fix a typo in nfs4_callback_recall.
Reported-by: Andy Adamson <andros@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r-- | fs/nfs/callback_proc.c | 10 | ||||
-rw-r--r-- | fs/nfs/delegation.c | 2 |
2 files changed, 6 insertions, 6 deletions
diff --git a/fs/nfs/callback_proc.c b/fs/nfs/callback_proc.c index 1bb297243624..ea8321923f28 100644 --- a/fs/nfs/callback_proc.c +++ b/fs/nfs/callback_proc.c | |||
@@ -87,8 +87,7 @@ __be32 nfs4_callback_recall(struct cb_recallargs *args, void *dummy, | |||
87 | res = 0; | 87 | res = 0; |
88 | break; | 88 | break; |
89 | case -ENOENT: | 89 | case -ENOENT: |
90 | if (res != 0) | 90 | res = htonl(NFS4ERR_BAD_STATEID); |
91 | res = htonl(NFS4ERR_BAD_STATEID); | ||
92 | break; | 91 | break; |
93 | default: | 92 | default: |
94 | res = htonl(NFS4ERR_RESOURCE); | 93 | res = htonl(NFS4ERR_RESOURCE); |
@@ -325,10 +324,11 @@ int nfs41_validate_delegation_stateid(struct nfs_delegation *delegation, const n | |||
325 | if (delegation == NULL) | 324 | if (delegation == NULL) |
326 | return 0; | 325 | return 0; |
327 | 326 | ||
328 | if (stateid->stateid.seqid != 0) | 327 | if (stateid->stateid.seqid != 0 && |
328 | stateid->stateid.seqid != delegation->stateid.stateid.seqid) | ||
329 | return 0; | 329 | return 0; |
330 | if (memcmp(&delegation->stateid.stateid.other, | 330 | if (memcmp(delegation->stateid.stateid.other, |
331 | &stateid->stateid.other, | 331 | stateid->stateid.other, |
332 | NFS4_STATEID_OTHER_SIZE)) | 332 | NFS4_STATEID_OTHER_SIZE)) |
333 | return 0; | 333 | return 0; |
334 | 334 | ||
diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c index ac889af8ccf5..c14512cea798 100644 --- a/fs/nfs/delegation.c +++ b/fs/nfs/delegation.c | |||
@@ -542,7 +542,7 @@ void nfs_expire_unreferenced_delegations(struct nfs_client *clp) | |||
542 | /** | 542 | /** |
543 | * nfs_async_inode_return_delegation - asynchronously return a delegation | 543 | * nfs_async_inode_return_delegation - asynchronously return a delegation |
544 | * @inode: inode to process | 544 | * @inode: inode to process |
545 | * @stateid: state ID information from CB_RECALL arguments | 545 | * @stateid: state ID information |
546 | * | 546 | * |
547 | * Returns zero on success, or a negative errno value. | 547 | * Returns zero on success, or a negative errno value. |
548 | */ | 548 | */ |