[pnfs] Server sessions slot table patches

Benny Halevy bhalevy at panasas.com
Wed Apr 4 08:39:47 EDT 2007


Andy, my comments in "=>"
Benny

0003-Declare-server-sessionid_t-and-rename-server-session.patch:
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
@@ -369,15 +362,15 @@ add_to_sessionid_hashtbl(clientid_t *clientid, sessionid_t *sessionid)
         if (!new)
                 goto out;
 
-        memcpy(&new->clientid, clientid, sizeof(*clientid));
-        memcpy(&new->sessionid, *sessionid, sizeof(sessionid_t));
+        memcpy(&new->se_clientid, clientid, sizeof(*clientid));
+        memcpy(&new->se_sessionid, *sessionid, sizeof(sessionid_t));

=> (isn't dereferencing sessionid a bug here?)
+        memcpy(&new->se_sessionid, sessionid, sizeof(sessionid_t));


0007-Slot-table-sequence-number-processing-for-server.patch:
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
@@ -2181,17 +2200,47 @@ int
 nfsd4_sequence(struct svc_rqst *r, sessionid_t *current_sid, struct nfsd4_sequence *seq)
 {
         struct nfs41_session *elem;
-        elem = find_in_sessionid_hashtbl(&seq->sessionid);
+	struct nfs41_slot *slot;
+	int status = nfserr_stale_clientid;
 
+	nfs4_lock_state();
+        elem = find_in_sessionid_hashtbl(&seq->sessionid);

=> replace leading spaces with tab
+	elem = find_in_sessionid_hashtbl(&seq->sessionid);

@@ -2181,17 +2200,47 @@ int
 nfsd4_sequence(struct svc_rqst *r, sessionid_t *current_sid, struct nfsd4_sequence *seq)
 {
         struct nfs41_session *elem;
-        elem = find_in_sessionid_hashtbl(&seq->sessionid);
+	struct nfs41_slot *slot;
+	int status = nfserr_stale_clientid;
=>	int status = nfserr_badsession;
 
+	nfs4_lock_state();
+        elem = find_in_sessionid_hashtbl(&seq->sessionid);
         if (!elem) {
                 printk(KERN_EMERG "stale clientid supplied to sequence!!\n");
=>		printk(KERN_EMERG "bad sessionid supplied in sequence!!\n");
=>		dump_sessionid(__FUNCTION__, &seq->sessionid);
                 return nfserr_stale_clientid;
=>		goto out;
(need to unlock state)
         }
+	if (STALE_CLIENTID(&elem->se_client->cl_clientid))
=>	{
=>		printk(KERN_EMERG "stale clientid supplied to sequence!!\n");
=>		status = nfserr_stale_clientid;
+		goto out;
=>	}

+
+	/* XXX status = nfserr_badslot; */
+	status = nfserr_inval;
+	if (seq->slotid >= elem->se_fnumslots)
+		goto out;
+
+	slot = &elem->se_slots[seq->slotid];
+	dprintk("%s slotid %d \n", __FUNCTION__, seq->slotid);
=>	dprintk("%s slotid %d\n", __FUNCTION__, seq->slotid);
+	status = check_slot_seqid(seq->seqid, slot);
+	if (status == NFSERR_REPLAY_ME)
+		goto replay;
+	else if (status)
+		goto out;
+
+	/* Success! bump slot seqid */
+	slot->sl_seqid++;
 
 	memcpy(current_sid, &seq->sessionid, sizeof(sessionid_t));
 	renew_client(elem->se_client);
-	return nfs_ok;
+	status = nfs_ok;
+out:
+	dprintk("%s returns %d\n", __FUNCTION__, status);
+	nfs4_unlock_state();
+	return status;
+replay:
+	dprintk("%s REPLAY - AKKKK! no code yet! return STALE CLIENTID\n",
+					__FUNCTION__);
+	status = nfserr_stale_clientid;
=>	status = nfserr_badsession;
(stale_client_id is too strong, restarting the session should be good enough here)
+	goto out;
 }

0008-Expand-current_sid-to-include-the-current-slot.patch:
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c

=> this is not directly related but the calls to kfree() can be conditional
with no additional cost

@@ -968,8 +968,17 @@ out:
 	if (current_fh)
 		fh_put(current_fh);
 	kfree(current_fh);
=> 	if (current_fh) {
=>		fh_put(current_fh);
=>		kfree(current_fh);
=>	}
 	if (save_fh)
 		fh_put(save_fh);
=>	if (save_fh) {
=>		fh_put(save_fh);
=>		kfree(save_fh);
=>	}
-	if (current_sid)
-		kfree(current_sid);
+	if (current_ses) {
+		if (current_ses->cs_slot) {
+			if (op && op->status != nfserr_dropit) {
+				dprintk("%s SET SLOT STATE TO AVAILABLE\n",
+							__FUNCTION__);
+				current_ses->cs_slot->sl_state = NFS4_SLOT_AVAILABLE;
+			}
+			nfs41_put_session(current_ses->cs_slot->sl_session);
+		}
+		kfree(current_ses);
+	}
 	kfree(save_fh);
=> kfree(save_fh) moved into the "if (save_fh) {}" block, where it belongs
 	return status;
 }

0009-Server-exchange_id-to-draft-ietf-nfsv4-minorversion1.patch:
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
@@ -443,16 +446,28 @@ check:
 	return elem;
 }
 
-void
-release_session(struct nfs41_session *ses)
+static void
+nfs41_free_session(struct kref *kref)
 {
+	struct nfs41_session *ses = container_of(kref, struct nfs41_session, se_ref);
+
 	list_del(&ses->se_hash);
 	list_del(&ses->se_perclnt);
-	if (ses->se_slots)
-		kfree(ses->se_slots);
=> I don't get it, this was added in patch 0008 and removed here,
=> who frees se_slots then?
 	kfree(ses);
 }
 

William A. (Andy) Adamson wrote:
> hi
> 
> here are 9 patches that implement the server slot table management. there is
> not DRC yet, but this code has been developed with the DRC in mind. This
> code almost passes the connectathon tests on the 4.1-sessions branch with
> the client patches i just sent out.
> 
> it fails the general connectathon tests with an NFS4ERR_SEQ_MISORDERED. i
> note that the client mostly uses slot 0, and occasionally uses slot 1. the
> slot 1 sequence is out of order - i don't know if it is the client or
> server.
> 
> please review the patches...
> 
> thanks
> 
> -->Andy
> 
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> pNFS mailing list
> pNFS at linux-nfs.org
> http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs



More information about the pNFS mailing list