summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_swap.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/vm/vm_swap.c')
-rw-r--r--sys/vm/vm_swap.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/sys/vm/vm_swap.c b/sys/vm/vm_swap.c
index 2c3cfde..f968838 100644
--- a/sys/vm/vm_swap.c
+++ b/sys/vm/vm_swap.c
@@ -51,6 +51,7 @@
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/conf.h>
+#include <sys/disk.h>
#include <sys/stat.h>
#include <sys/sysctl.h>
#include <sys/mac.h>
@@ -283,6 +284,7 @@ swaponvp(td, vp, dev, nblks)
swblk_t dvbase;
int error;
u_long aligned_nblks;
+ off_t mediasize;
if (!swapdev_vp) {
error = getnewvnode("none", NULL, swapdev_vnodeop_p,
@@ -312,11 +314,16 @@ swaponvp(td, vp, dev, nblks)
if (error)
return (error);
- if (nblks == 0 && dev != NODEV && (devsw(dev)->d_psize == 0 ||
- (nblks = (*devsw(dev)->d_psize) (dev)) == -1)) {
- (void) VOP_CLOSE(vp, FREAD | FWRITE, td->td_ucred, td);
- return (ENXIO);
- }
+ error = VOP_IOCTL(vp, DIOCGMEDIASIZE, (caddr_t)&mediasize,
+ FREAD, td->td_ucred, td);
+ if (error == 0)
+ nblks = mediasize / DEV_BSIZE;
+ else
+ nblks = 0;
+ /*
+ * XXX: We should also check that the sectorsize makes sense
+ * XXX: it should be a power of two, no larger than the page size.
+ */
if (nblks == 0) {
(void) VOP_CLOSE(vp, FREAD | FWRITE, td->td_ucred, td);
return (ENXIO);
OpenPOWER on IntegriCloud