summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2003-03-02 14:37:52 +0000
committerphk <phk@FreeBSD.org>2003-03-02 14:37:52 +0000
commit48282fba0708f040c0c8c60a7195f9669fc79622 (patch)
tree5aceb0553363d1def951b84e3748b340981849ff /sys/vm
parent3dee40a992d6f8ab4b3b349ea3d2781d756273c4 (diff)
downloadFreeBSD-src-48282fba0708f040c0c8c60a7195f9669fc79622.zip
FreeBSD-src-48282fba0708f040c0c8c60a7195f9669fc79622.tar.gz
NO_GEOM cleanup:
Use VOP_IOCTL(DIOCGMEDIASIZE) to check the size of a potential swap device instead of the cdevsw->d_psize() method.
Diffstat (limited to 'sys/vm')
-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