aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2012-03-04 18:13:56 -0500
committerTrond Myklebust <Trond.Myklebust@netapp.com>2012-03-06 10:32:44 -0500
commit8e663f0e5fabf57065aed1cfdaff5b13057dce23 (patch)
tree844f5568113fe1c43a6d4ac93e9dfd5452682e06
parenta1d0b5eebc4fd6e0edb02688b35f17f67f42aea5 (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.c10
-rw-r--r--fs/nfs/delegation.c2
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 */