The branch main has been updated by rmacklem:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=f6fec55fe30088bbefd3efe70b62565399a7b9b8

commit f6fec55fe30088bbefd3efe70b62565399a7b9b8
Author:     Rick Macklem <rmack...@freebsd.org>
AuthorDate: 2021-04-28 00:30:16 +0000
Commit:     Rick Macklem <rmack...@freebsd.org>
CommitDate: 2021-04-28 00:30:16 +0000

    nfscl: add check for NULL clp and forced dismounts to nfscl_delegreturnvp()
    
    Commit aad780464fad 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:    i...@amail.plala.or.jp
    MFC after:      2 weeks
---
 sys/fs/nfsclient/nfs_clnode.c  | 9 ++++++++-
 sys/fs/nfsclient/nfs_clstate.c | 6 ++++--
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/sys/fs/nfsclient/nfs_clnode.c b/sys/fs/nfsclient/nfs_clnode.c
index 43c2286726f7..1c0e855ff5a9 100644
--- a/sys/fs/nfsclient/nfs_clnode.c
+++ b/sys/fs/nfsclient/nfs_clnode.c
@@ -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);
diff --git a/sys/fs/nfsclient/nfs_clstate.c b/sys/fs/nfsclient/nfs_clstate.c
index bbc1c6ccbc2f..8b5f07b5aa2a 100644
--- a/sys/fs/nfsclient/nfs_clstate.c
+++ b/sys/fs/nfsclient/nfs_clstate.c
@@ -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);
_______________________________________________
dev-commits-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-all
To unsubscribe, send any mail to "dev-commits-src-all-unsubscr...@freebsd.org"

Reply via email to