christos
Index: kern/vfs_subr.c
===================================================================
RCS file: /cvsroot/src/sys/kern/vfs_subr.c,v
retrieving revision 1.355
diff -u -u -r1.355 vfs_subr.c
--- kern/vfs_subr.c 31 Jul 2008 05:38:05 -0000 1.355
+++ kern/vfs_subr.c 28 Aug 2008 15:52:33 -0000
@@ -114,6 +114,7 @@
#include <uvm/uvm.h>
#include <uvm/uvm_readahead.h>
#include <uvm/uvm_ddb.h>
+#include <uvm/uvm_swap.h>
#include <sys/sysctl.h>
@@ -2333,6 +2334,13 @@
if (panicstr != NULL)
return;
+#if defined(_KERNEL) && !defined(_RUMPKERNEL)
+ /*
+ * We need to turn off swap first before we unmount
+ * /dev, because otherwise the spec_vnodes are bad.
+ */
+ uvm_swap_shutdown(l);
+#endif
/* Release inodes held by texts before update. */
#ifdef notdef
vnshutdown();
Index: uvm/uvm_swap.c
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_swap.c,v
retrieving revision 1.139
diff -u -u -r1.139 uvm_swap.c
--- uvm/uvm_swap.c 29 May 2008 14:51:27 -0000 1.139
+++ uvm/uvm_swap.c 28 Aug 2008 15:52:35 -0000
@@ -1073,6 +1073,55 @@
return (0);
}
+void
+uvm_swap_shutdown(struct lwp *l)
+{
+ struct swapdev *sdp;
+ struct swappri *spp;
+ struct vnode *vp;
+ int error;
+
+ printf("turning of swap...");
+ rw_enter(&swap_syscall_lock, RW_WRITER);
+ mutex_enter(&uvm_swap_data_lock);
+again:
+ LIST_FOREACH(spp, &swap_priority, spi_swappri)
+ CIRCLEQ_FOREACH(sdp, &spp->spi_swapdev, swd_next) {
+ if (sdp->swd_flags & SWF_FAKE)
+ continue;
+ if ((sdp->swd_flags & (SWF_INUSE|SWF_ENABLE)) == 0)
+ continue;
+#ifdef DEBUG
+ printf("\nturning off swap on %s...",
+ sdp->swd_path);
+#endif
+ if (vn_lock(vp = sdp->swd_vp, LK_EXCLUSIVE)) {
+ error = EBUSY;
+ vp = NULL;
+ } else
+ error = 0;
+ if (!error) {
+ error = swap_off(l, sdp);
+ mutex_enter(&uvm_swap_data_lock);
+ }
+ if (error) {
+ printf("stopping swap on %s failed "
+ "with error %d\n", sdp->swd_path, error);
+ CIRCLEQ_REMOVE(&spp->spi_swapdev, sdp,
+ swd_next);
+ uvmexp.nswapdev--;
+ swaplist_trim();
+ if (vp)
+ vput(vp);
+ }
+ goto again;
+ }
+ printf(" done\n");
+ mutex_exit(&uvm_swap_data_lock);
+ rw_exit(&swap_syscall_lock);
+}
+
+
/*
* /dev/drum interface and i/o functions
*/
Index: uvm/uvm_swap.h
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_swap.h,v
retrieving revision 1.17
diff -u -u -r1.17 uvm_swap.h
--- uvm/uvm_swap.h 29 May 2008 14:51:27 -0000 1.17
+++ uvm/uvm_swap.h 28 Aug 2008 15:52:35 -0000
@@ -39,6 +39,7 @@
#endif
struct swapent;
+struct lwp;
#if defined(VMSWAP)
int uvm_swap_get(struct vm_page *, int, int);
@@ -51,6 +52,7 @@
#define uvm_swapisfull() true
#endif /* defined(VMSWAP) */
void uvm_swap_stats(int, struct swapent *, int, register_t *);
+void uvm_swap_shutdown(struct lwp *);
#endif /* _KERNEL */