Author: rmacklem
Date: Wed May 10 01:39:21 2017
New Revision: 318128
URL: https://svnweb.freebsd.org/changeset/base/318128

Log:
  MFC: r317465
  Fix handling of a NFSv4.1 callback reply from the session cache.
  
  The nfsv4_seqsession() call returns NFSERR_REPLYFROMCACHE when it has a
  reply in the session, due to a requestor retry. The code erroneously
  assumed a return of 0 for this case. This patch fixes this and adds
  a KASSERT(). This would be an extremely rare occurrence. It was found
  during code inspection during the pNFS server development.

Modified:
  stable/10/sys/fs/nfsclient/nfs_clstate.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/fs/nfsclient/nfs_clstate.c
==============================================================================
--- stable/10/sys/fs/nfsclient/nfs_clstate.c    Wed May 10 01:28:58 2017        
(r318127)
+++ stable/10/sys/fs/nfsclient/nfs_clstate.c    Wed May 10 01:39:21 2017        
(r318128)
@@ -3560,9 +3560,18 @@ nfscl_docb(struct nfsrv_descript *nd, NF
                                    tsep->nfsess_backslots);
                        }
                        NFSUNLOCKCLSTATE();
-                       if (error == 0) {
+                       if (error == 0 || error == NFSERR_REPLYFROMCACHE) {
                                gotseq_ok = 1;
                                if (rep != NULL) {
+                                       /*
+                                        * Handle a reply for a retried
+                                        * callback.  The reply will be
+                                        * re-inserted in the session cache
+                                        * by the nfsv4_seqsess_cacherep() call
+                                        * after out:
+                                        */
+                                       KASSERT(error == NFSERR_REPLYFROMCACHE,
+                                           ("cbsequence: non-NULL rep"));
                                        NFSCL_DEBUG(4, "Got cbretry\n");
                                        m_freem(nd->nd_mreq);
                                        nd->nd_mreq = rep;
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to