summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/vm/vm_swap.c13
1 files changed, 10 insertions, 3 deletions
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);