diff --git a/sys/fs/nfsclient/nfs_clrpcops.c b/sys/fs/nfsclient/nfs_clrpcops.c index 6e4c046cfd60..097006457cd5 100644 --- a/sys/fs/nfsclient/nfs_clrpcops.c +++ b/sys/fs/nfsclient/nfs_clrpcops.c @@ -567,6 +567,11 @@ nfsrpc_close(vnode_t vp, int doclose, NFSPROC_T *p) if (vnode_vtype(vp) != VREG) return (0); + + /* For forced unmounts, just return. */ + if ((vp->v_mount->mnt_kern_flag & MNTK_UNMOUNTF) != 0) + return (0); + if (doclose) error = nfscl_doclose(vp, &clp, p); else diff --git a/sys/fs/nfsclient/nfs_clstate.c b/sys/fs/nfsclient/nfs_clstate.c index 8e9aa6ac885b..65427a73786c 100644 --- a/sys/fs/nfsclient/nfs_clstate.c +++ b/sys/fs/nfsclient/nfs_clstate.c @@ -692,6 +692,10 @@ nfscl_getcl(vnode_t vp, struct ucred *cred, NFSPROC_T *p, int igotlock = 0, error, trystalecnt, clidinusedelay, i; u_int16_t idlen = 0; + /* For forced unmounts, just return an error. */ + if ((vnode_mount(vp)->mnt_kern_flag & MNTK_UNMOUNTF) != 0) + return (EPERM); + if (cred != NULL) { getcredhostuuid(cred, uuid, sizeof uuid); idlen = strlen(uuid); diff --git a/sys/fs/nfsclient/nfs_clvfsops.c b/sys/fs/nfsclient/nfs_clvfsops.c index a37dd51a674d..858677624e7e 100644 --- a/sys/fs/nfsclient/nfs_clvfsops.c +++ b/sys/fs/nfsclient/nfs_clvfsops.c @@ -1386,6 +1386,10 @@ nfs_sync(struct mount *mp, int waitfor) td = curthread; + /* For a forced unmount, just return EPERM. */ + if ((mp->mnt_kern_flag & MNTK_UNMOUNTF) != 0) + return (EPERM); + /* * Force stale buffer cache information to be flushed. */