summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/uvm/uvm_swap.c62
1 files changed, 61 insertions, 1 deletions
diff --git a/sys/uvm/uvm_swap.c b/sys/uvm/uvm_swap.c
index 225286a9977..8f205b7655e 100644
--- a/sys/uvm/uvm_swap.c
+++ b/sys/uvm/uvm_swap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uvm_swap.c,v 1.4 1999/06/04 00:15:42 art Exp $ */
+/* $OpenBSD: uvm_swap.c,v 1.5 1999/06/04 00:23:17 art Exp $ */
/* $NetBSD: uvm_swap.c,v 1.23 1998/12/26 06:25:59 marc Exp $ */
/*
@@ -264,6 +264,8 @@ static void uvm_swap_aiodone __P((struct uvm_aiodesc *));
static void uvm_swap_bufdone __P((struct buf *));
static int uvm_swap_io __P((struct vm_page **, int, int, int));
+static void swapmount __P((void));
+
/*
* uvm_swap_init: init the swap system data structures and locks
*
@@ -1948,7 +1950,65 @@ uvm_swap_aiodone(aio)
splx(s);
/*
+ * Setup the initial swap partition
+ */
+ swapmount();
+
+ /*
* done!
*/
}
+static void
+swapmount()
+{
+ struct swapdev *sdp;
+ struct swappri *spp;
+ struct vnode *vp;
+ dev_t swap_dev = swdevt[0].sw_dev;
+
+ /*
+ * No locking here since we happen to know that we will just be called
+ * once before any other process has forked.
+ */
+
+ if (swap_dev == NODEV) {
+ printf("swapmount: no device\n");
+ return;
+ }
+
+ if (bdevvp(swap_dev, &vp)) {
+ printf("swapmount: no device 2\n");
+ return;
+ }
+
+ sdp = malloc(sizeof(*sdp), M_VMSWAP, M_WAITOK);
+ spp = malloc(sizeof(*spp), M_VMSWAP, M_WAITOK);
+ bzero(sdp, sizeof(*sdp));
+
+ sdp->swd_flags = SWF_FAKE;
+ sdp->swd_dev = swap_dev;
+ sdp->swd_vp = vp;
+ swaplist_insert(sdp, spp, 0);
+ sdp->swd_pathlen = strlen("swap_device") + 1;
+ sdp->swd_path = malloc(sdp->swd_pathlen, M_VMSWAP, M_WAITOK);
+ if (copystr("swap_device", sdp->swd_path, sdp->swd_pathlen, 0))
+ panic("swapmount: copystr");
+
+ printf("Adding swap(%d, %d):", major(swap_dev), minor(swap_dev));
+
+ if (swap_on(curproc, sdp)) {
+ printf(" failed!\n");
+ swaplist_find(vp, 1);
+ swaplist_trim();
+ vput(sdp->swd_vp);
+ free(sdp->swd_path, M_VMSWAP);
+ free(sdp, M_VMSWAP);
+ free(spp, M_VMSWAP);
+ return;
+ }
+
+ printf(" ok.\n");
+
+ VOP_UNLOCK(vp, 0, curproc);
+}