diff --git a/sys/vm/vm_swap.c b/sys/vm/vm_swap.c index f1a2443f0963..6bde4b1b022e 100644 --- a/sys/vm/vm_swap.c +++ b/sys/vm/vm_swap.c @@ -189,6 +189,7 @@ swapon(p, uap) struct proc *p; struct swapon_args *uap; { + struct vattr attr; struct vnode *vp; struct nameidata nd; int error; @@ -212,10 +213,16 @@ swapon(p, uap) NDFREE(&nd, NDF_ONLY_PNBUF); vp = nd.ni_vp; - vn_isdisk(vp, &error); - - if (!error) + if (vn_isdisk(vp, &error)) error = swaponvp(p, vp, vp->v_rdev, 0); + else if (vp->v_type == VREG && vp->v_tag == VT_NFS && + (error = VOP_GETATTR(vp, &attr, p->p_ucred, p)) == 0) { + /* + * Allow direct swapping to NFS regular files in the same + * way that nfs_mountroot() sets up diskless swapping. + */ + error = swaponvp(p, vp, NODEV, attr.va_size / DEV_BSIZE); + } if (error) vrele(vp);