Skip to contentSkip to conversation

nfsd41: Deny new lock before RECLAIM_COMPLETE done

PATCH In review Mi Jinlong 2 participants 4 messages Apr 27, 2011 – May 10, 2011

Subsystems (2)
lore
Share & tools
lore

Mi Jinlong

author
#0 lore raw

PATCH 1/1 nfsd41: Deny new lock before RECLAIM_COMPLETE done

Before nfs41 client's RECLAIM_COMPLETE done, nfs server should deny it's new lock.

---
 fs/nfsd/nfs4state.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)
fs/nfsd/nfs4state.c +9 -0
index 4b36ec3..43cda94 100644
@@ -3803,6 +3803,15 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
 		 */
 		struct nfs4_stateid *open_stp = NULL;
 		
+		/*
+		 * RFC5661 18.51.3
+		 * Before RECLAIM_COMPLETE done, return NFS4ERR_GRACE
+		 */
+		status = nfserr_grace;
+		if (nfsd4_has_session(cstate) &&
+		    !cstate->session->se_client->cl_firststate)
+			goto out;
+
 		status = nfserr_stale_clientid;
 		if (!nfsd4_has_session(cstate) &&
 		    STALE_CLIENTID(&lock->lk_new_clientid))
Signature · 1 line
1.7.4.1
#1 lore raw
Quoted 4 lines · Mi Jinlong

Before nfs41 client's RECLAIM_COMPLETE done, nfs server should deny it's new lock.

Is nfserr_grace the right error? (Honest question, I haven't looked it up.)

Also I'd think this check should go in nfsd4_open: opens are also prohibited before RECLAIM_COMPLETE, and if we check there then we don't need to check here, as you have to have open state before you can do a lock.

--b.

Quoted 28 lines
---
 fs/nfsd/nfs4state.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)
fs/nfsd/nfs4state.c +9 -0
index 4b36ec3..43cda94 100644
@@ -3803,6 +3803,15 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
 		 */
 		struct nfs4_stateid *open_stp = NULL;
 
+		/*
+		 * RFC5661 18.51.3
+		 * Before RECLAIM_COMPLETE done, return NFS4ERR_GRACE
+		 */
+		status = nfserr_grace;
+		if (nfsd4_has_session(cstate) &&
+		    !cstate->session->se_client->cl_firststate)
+			goto out;
+
 		status = nfserr_stale_clientid;
 		if (!nfsd4_has_session(cstate) &&
 		    STALE_CLIENTID(&lock->lk_new_clientid))
Signature · 1 line
1.7.4.1
author
#2 lore raw

Hi Bruce,

Sorry for so late to reply you.

J. Bruce Fields:

Quoted 8 lines · Mi Jinlong
Quoted 4 lines

Before nfs41 client's RECLAIM_COMPLETE done, nfs server should deny it's new lock.

Is nfserr_grace the right error? (Honest question, I haven't looked it up.)

Yes, rfc5661 says:

" Whenever a client establishes a new client ID and before it does the
first non-reclaim operation that obtains a lock, it MUST send a RECLAIM_COMPLETE with rca_one_fs set to FALSE, even if there are no locks to reclaim. If non-reclaim locking operations are done before the RECLAIM_COMPLETE, an NFS4ERR_GRACE error will be returned. "

Quoted 5 lines

Also I'd think this check should go in nfsd4_open: opens are also prohibited before RECLAIM_COMPLETE, and if we check there then we don't need to check here, as you have to have open state before you can do a lock.

Agree with you, what about the following one??

Signature · 4 lines
----
thanks
Mi Jinlong
===============================
author
#3 lore raw

Mi Jinlong :

Quoted 21 lines

Hi Bruce,

Sorry for so late to reply you.

J. Bruce Fields:

Quoted 7 lines · Mi Jinlong
Quoted 4 lines

Before nfs41 client's RECLAIM_COMPLETE done, nfs server should deny it's new lock.

Is nfserr_grace the right error? (Honest question, I haven't looked it up.)

Yes, rfc5661 says:

" Whenever a client establishes a new client ID and before it does the
first non-reclaim operation that obtains a lock, it MUST send a RECLAIM_COMPLETE with rca_one_fs set to FALSE, even if there are no locks to reclaim. If non-reclaim locking operations are done before the RECLAIM_COMPLETE, an NFS4ERR_GRACE error will be returned. "

Quoted 6 lines
Quoted 4 lines

Also I'd think this check should go in nfsd4_open: opens are also prohibited before RECLAIM_COMPLETE, and if we check there then we don't need to check here, as you have to have open state before you can do a lock.

Agree with you, what about the following one??

After this patch, we should add a new patch to pynfs41 test site. Otherwise, the test site will walk out.

----
thanks
Mi Jinlong

Quoted 1 line

From baa71190a279f6b35a919088d985482dedf06a71 Mon Sep 17 00:00:00 2001

From: Mi Jinlong <[email protected]>
Date: Tue, 10 May 2011 14:14:38 +0800
Subject: [PATCH] CLNT: Send RECLAIM_COMPLETE to server before do 'maketree'

---
 nfs4.1/server41tests/environment.py |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)
nfs4.1/server41tests/environment.py +4 -0
index 4ce7a70..857b29f 100644
@@ -157,6 +157,10 @@ class Environment(testmod.Environment):
 
     def _maketree(self, sess):
         """Make test tree"""
+        # RECLAIM_COMPLETE
+        res = sess.compound([op.reclaim_complete(FALSE)])
+        check(res)
+
         # ensure /tmp (and path leading up) exists
         path = []
         for comp in self.opts.home:
Signature · 1 line
1.7.4.5