|
Lines 81-86
NFSNAMEIDMUTEX;
Link Here
|
| 81 |
NFSSOCKMUTEX; |
81 |
NFSSOCKMUTEX; |
| 82 |
extern int nfsrv_lughashsize; |
82 |
extern int nfsrv_lughashsize; |
| 83 |
extern struct mtx nfsrv_dslock_mtx; |
83 |
extern struct mtx nfsrv_dslock_mtx; |
|
|
84 |
extern struct mtx nfs_clstate_mutex; |
| 84 |
extern volatile int nfsrv_devidcnt; |
85 |
extern volatile int nfsrv_devidcnt; |
| 85 |
extern int nfscl_debuglevel; |
86 |
extern int nfscl_debuglevel; |
| 86 |
extern struct nfsdevicehead nfsrv_devidhead; |
87 |
extern struct nfsdevicehead nfsrv_devidhead; |
|
Lines 4823-4853
nfsv4_sequencelookup(struct nfsmount *nmp, struct nfsc
Link Here
|
| 4823 |
{ |
4824 |
{ |
| 4824 |
int i, maxslot, slotpos; |
4825 |
int i, maxslot, slotpos; |
| 4825 |
uint64_t bitval; |
4826 |
uint64_t bitval; |
|
|
4827 |
bool fnd_okslot; |
| 4826 |
|
4828 |
|
| 4827 |
/* Find an unused slot. */ |
4829 |
/* Find an unused slot. */ |
| 4828 |
slotpos = -1; |
4830 |
slotpos = -1; |
| 4829 |
maxslot = -1; |
4831 |
maxslot = -1; |
| 4830 |
mtx_lock(&sep->nfsess_mtx); |
4832 |
mtx_lock(&sep->nfsess_mtx); |
|
|
4833 |
if (sep->nfsess_badslots != 0) printf("badslots=0x%lx\n", sep->nfsess_badslots); |
| 4831 |
do { |
4834 |
do { |
| 4832 |
if (nmp != NULL && sep->nfsess_defunct != 0) { |
4835 |
fnd_okslot = true; |
| 4833 |
/* Just return the bad session. */ |
4836 |
if (nmp != NULL) { |
| 4834 |
bcopy(sep->nfsess_sessionid, sessionid, |
4837 |
KASSERT(TAILQ_FIRST(&nmp->nm_sess) != NULL, |
| 4835 |
NFSX_V4SESSIONID); |
4838 |
("nfsv4_sequencelookup: no mds sess")); |
| 4836 |
mtx_unlock(&sep->nfsess_mtx); |
4839 |
if (sep->nfsess_defunct != 0) { |
| 4837 |
return (NFSERR_BADSESSION); |
4840 |
/* Just return the bad session. */ |
|
|
4841 |
bcopy(sep->nfsess_sessionid, sessionid, |
| 4842 |
NFSX_V4SESSIONID); |
| 4843 |
mtx_unlock(&sep->nfsess_mtx); |
| 4844 |
return (NFSERR_BADSESSION); |
| 4845 |
} |
| 4846 |
|
| 4847 |
/* Only check for bad slots on the MDS session. */ |
| 4848 |
if (NFSMNT_MDSSESSION(nmp) == sep) |
| 4849 |
fnd_okslot = false; |
| 4838 |
} |
4850 |
} |
| 4839 |
bitval = 1; |
4851 |
bitval = 1; |
| 4840 |
for (i = 0; i < sep->nfsess_foreslots; i++) { |
4852 |
for (i = 0; i < sep->nfsess_foreslots; i++) { |
| 4841 |
if ((bitval & sep->nfsess_slots) == 0) { |
4853 |
if ((bitval & sep->nfsess_badslots) == 0) { |
| 4842 |
slotpos = i; |
4854 |
fnd_okslot = true; |
| 4843 |
sep->nfsess_slots |= bitval; |
4855 |
if ((bitval & sep->nfsess_slots) == 0) { |
| 4844 |
sep->nfsess_slotseq[i]++; |
4856 |
slotpos = i; |
| 4845 |
*slotseqp = sep->nfsess_slotseq[i]; |
4857 |
sep->nfsess_slots |= bitval; |
| 4846 |
break; |
4858 |
sep->nfsess_slotseq[i]++; |
|
|
4859 |
*slotseqp = sep->nfsess_slotseq[i]; |
| 4860 |
break; |
| 4861 |
} |
| 4847 |
} |
4862 |
} |
| 4848 |
bitval <<= 1; |
4863 |
bitval <<= 1; |
| 4849 |
} |
4864 |
} |
| 4850 |
if (slotpos == -1) { |
4865 |
if (slotpos == -1) { |
|
|
4866 |
if (!fnd_okslot) { |
| 4867 |
/* |
| 4868 |
* All slots are broken, so mark the session |
| 4869 |
* defunct. |
| 4870 |
*/ |
| 4871 |
bcopy(sep->nfsess_sessionid, sessionid, |
| 4872 |
NFSX_V4SESSIONID); |
| 4873 |
sep->nfsess_defunct = 1; |
| 4874 |
printf("all badslots\n"); |
| 4875 |
mtx_unlock(&sep->nfsess_mtx); |
| 4876 |
NFSCL_DEBUG(1, "Marked defunct\n"); |
| 4877 |
|
| 4878 |
/* |
| 4879 |
* If this is the current session, |
| 4880 |
* initiate recovery. |
| 4881 |
*/ |
| 4882 |
NFSLOCKCLSTATE(); |
| 4883 |
NFSLOCKMNT(nmp); |
| 4884 |
if (nmp->nm_clp != NULL && |
| 4885 |
NFSMNT_MDSSESSION(nmp) == sep) { |
| 4886 |
nmp->nm_clp->nfsc_flags |= |
| 4887 |
NFSCLFLAGS_RECOVER; |
| 4888 |
wakeup(nmp->nm_clp); |
| 4889 |
} |
| 4890 |
NFSUNLOCKCLSTATE(); |
| 4891 |
NFSUNLOCKMNT(nmp); |
| 4892 |
return (NFSERR_BADSESSION); |
| 4893 |
} |
| 4851 |
/* |
4894 |
/* |
| 4852 |
* If a forced dismount is in progress, just return. |
4895 |
* If a forced dismount is in progress, just return. |
| 4853 |
* This RPC attempt will fail when it calls |
4896 |
* This RPC attempt will fail when it calls |