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.

MFC after:	2 weeks
This commit is contained in:
Rick Macklem 2017-04-26 21:54:53 +00:00
parent d274bcc661
commit ad81354ceb
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=317465

View file

@ -3560,9 +3560,18 @@ nfscl_docb(struct nfsrv_descript *nd, NFSPROC_T *p)
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;