nfscl: add check for NULL clp and forced dismounts to nfscl_delegreturnvp()

Commit aad780464f added a function called nfscl_delegreturnvp()
to return delegations during the NFS VOP_RECLAIM().
The function erroneously assumed that nm_clp would
be non-NULL. It will be NULL for NFSV4.0 mounts until
a regular file is opened. It will also be NULL during
vflush() in nfs_unmount() for a forced dismount.

This patch adds a check for clp == NULL to fix this.

Also, since it makes no sense to call nfscl_delegreturnvp()
during a forced dismount, the patch adds a check for that
case and does not do the call during forced dismounts.

PR:	255436
Reported by:	ish@amail.plala.or.jp
MFC after:	2 weeks
This commit is contained in:
Rick Macklem 2021-04-27 17:30:16 -07:00
parent db8c27f499
commit f6fec55fe3
2 changed files with 12 additions and 3 deletions

View File

@ -289,8 +289,10 @@ ncl_reclaim(struct vop_reclaim_args *ap)
struct nfsnode *np = VTONFS(vp);
struct nfsdmap *dp, *dp2;
struct thread *td;
struct mount *mp;
td = curthread;
mp = vp->v_mount;
/*
* If the NLM is running, give it a chance to abort pending
@ -317,7 +319,12 @@ ncl_reclaim(struct vop_reclaim_args *ap)
* vfs_hash_remove(), since it cannot be recalled once the
* nfs node is no longer available.
*/
nfscl_delegreturnvp(vp, td);
MNT_ILOCK(mp);
if ((mp->mnt_kern_flag & MNTK_UNMOUNTF) == 0) {
MNT_IUNLOCK(mp);
nfscl_delegreturnvp(vp, td);
} else
MNT_IUNLOCK(mp);
}
vfs_hash_remove(vp);

View File

@ -3300,10 +3300,12 @@ nfscl_delegreturnvp(vnode_t vp, NFSPROC_T *p)
np = VTONFS(vp);
cred = newnfs_getcred();
dp = NULL;
NFSLOCKCLSTATE();
clp = VFSTONFS(vp->v_mount)->nm_clp;
dp = nfscl_finddeleg(clp, np->n_fhp->nfh_fh,
np->n_fhp->nfh_len);
if (clp != NULL)
dp = nfscl_finddeleg(clp, np->n_fhp->nfh_fh,
np->n_fhp->nfh_len);
if (dp != NULL) {
nfscl_cleandeleg(dp);
nfscl_freedeleg(&clp->nfsc_deleg, dp, false);