Don't follow null bdevsw pointers. The `major(dev) < nblkdev' test rotted
when bdevsw[] became sparse. We still depend on magic to avoid having to check that (v_rdev) device numbers in vnodes are not NODEV. Removed a redundant `major(dev) < nblkdev' test instead of updating it. Don't follow a garbage bdevsw pointer for attempts to swap on empty regular files. This case currently can't happen. Swapping on regular files is ifdefed out in swapon() and isn't attempted for empty files in nfs_mountroot().
This commit is contained in:
parent
5a7ea1209a
commit
9fafc47653
@ -31,7 +31,7 @@
|
|||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* @(#)vm_swap.c 8.5 (Berkeley) 2/17/94
|
* @(#)vm_swap.c 8.5 (Berkeley) 2/17/94
|
||||||
* $Id: vm_swap.c,v 1.55 1998/07/04 20:45:42 julian Exp $
|
* $Id: vm_swap.c,v 1.56 1998/07/04 22:30:26 julian Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "opt_devfs.h"
|
#include "opt_devfs.h"
|
||||||
@ -203,8 +203,8 @@ swapon(p, uap)
|
|||||||
|
|
||||||
switch (vp->v_type) {
|
switch (vp->v_type) {
|
||||||
case VBLK:
|
case VBLK:
|
||||||
dev = (dev_t) vp->v_rdev;
|
dev = vp->v_rdev;
|
||||||
if (major(dev) >= nblkdev) {
|
if (major(dev) >= nblkdev || bdevsw[major(dev)] == NULL) {
|
||||||
error = ENXIO;
|
error = ENXIO;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -264,14 +264,11 @@ swaponvp(p, vp, dev, nblks)
|
|||||||
}
|
}
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
found:
|
found:
|
||||||
if (dev != NODEV && (major(dev) >= nblkdev))
|
|
||||||
return (ENXIO);
|
|
||||||
|
|
||||||
error = VOP_OPEN(vp, FREAD | FWRITE, p->p_ucred, p);
|
error = VOP_OPEN(vp, FREAD | FWRITE, p->p_ucred, p);
|
||||||
if (error)
|
if (error)
|
||||||
return (error);
|
return (error);
|
||||||
|
|
||||||
if (nblks == 0 && (bdevsw[major(dev)]->d_psize == 0 ||
|
if (nblks == 0 && dev != NODEV && (bdevsw[major(dev)]->d_psize == 0 ||
|
||||||
(nblks = (*bdevsw[major(dev)]->d_psize) (dev)) == -1)) {
|
(nblks = (*bdevsw[major(dev)]->d_psize) (dev)) == -1)) {
|
||||||
(void) VOP_CLOSE(vp, FREAD | FWRITE, p->p_ucred, p);
|
(void) VOP_CLOSE(vp, FREAD | FWRITE, p->p_ucred, p);
|
||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user