SCCS-vsn: sys/miscfs/specfs/spec_vnops.c 8.4
*
* %sccs.include.redist.c%
*
*
* %sccs.include.redist.c%
*
- * @(#)spec_vnops.c 8.3 (Berkeley) %G%
+ * @(#)spec_vnops.c 8.4 (Berkeley) %G%
*/
#include <sys/param.h>
*/
#include <sys/param.h>
daddr_t bn, nextbn;
long bsize, bscale;
struct partinfo dpart;
daddr_t bn, nextbn;
long bsize, bscale;
struct partinfo dpart;
+ int n, on, majordev, (*ioctl)();
#ifdef DIAGNOSTIC
if (uio->uio_rw != UIO_READ)
#ifdef DIAGNOSTIC
if (uio->uio_rw != UIO_READ)
if (uio->uio_offset < 0)
return (EINVAL);
bsize = BLKDEV_IOSIZE;
if (uio->uio_offset < 0)
return (EINVAL);
bsize = BLKDEV_IOSIZE;
- if ((*bdevsw[major(vp->v_rdev)].d_ioctl)(vp->v_rdev, DIOCGPART,
- (caddr_t)&dpart, FREAD, p) == 0) {
- if (dpart.part->p_fstype == FS_BSDFFS &&
- dpart.part->p_frag != 0 && dpart.part->p_fsize != 0)
- bsize = dpart.part->p_frag *
- dpart.part->p_fsize;
- }
+ dev = vp->v_rdev;
+ if ((majordev = major(dev)) < nblkdev &&
+ (ioctl = bdevsw[majordev].d_ioctl) != NULL &&
+ (*ioctl)(dev, DIOCGPART, (caddr_t)&dpart, FREAD, p) == 0 &&
+ dpart.part->p_fstype == FS_BSDFFS &&
+ dpart.part->p_frag != 0 && dpart.part->p_fsize != 0)
+ bsize = dpart.part->p_frag * dpart.part->p_fsize;
bscale = bsize / DEV_BSIZE;
do {
bn = (uio->uio_offset / DEV_BSIZE) &~ (bscale - 1);
bscale = bsize / DEV_BSIZE;
do {
bn = (uio->uio_offset / DEV_BSIZE) &~ (bscale - 1);