From owner-freebsd-hackers Wed Feb 14 00:31:04 1996 Return-Path: owner-hackers Received: (from root@localhost) by freefall.freebsd.org (8.7.3/8.7.3) id AAA25237 for hackers-outgoing; Wed, 14 Feb 1996 00:31:04 -0800 (PST) Received: from vcgate1.mei.co.jp (vcgate1.mei.co.jp [202.32.14.51]) by freefall.freebsd.org (8.7.3/8.7.3) with SMTP id AAA25204 for ; Wed, 14 Feb 1996 00:30:30 -0800 (PST) Received: by vcgate1.mei.co.jp (5.65mei1.2g/5.5:4.6:vcgate0:950406) id AA29117; Wed, 14 Feb 96 17:29:24 +0900 Received: by vcmei.vanc.mei.co.jp (5.65mei1.1/5.9:4.9:vcmei:960124) id AA04667; Wed, 14 Feb 96 17:28:42 +0900 Received: by kmegate.kme.mei.co.jp (4.1/5.5:4.6:kmegate:960117) id AA05282; Wed, 14 Feb 96 17:29:35 JST Date: Wed, 14 Feb 96 17:29:35 JST From: akiyama@kme.mei.co.jp (Shunsuke Akiyama) Message-Id: <9602140829.AA05282@kmegate.kme.mei.co.jp> To: hackers@freebsd.org Subject: Optical disk driver update and enhancement patch. Sender: owner-hackers@freebsd.org Precedence: bulk Hi FreeBSD hackers, I made optical disk driver update(1) and enhancement(2) patch for 2.2-960130-SNAP. It's not for -current, sorry. Here are brief descriptions. (1) update patch * some fixes. * add CD device compatible lock/unlock and eject ioctl. * improved ficticious geometry translation. * add bogus sense code handling. (2) enhancement patch * UFS works on 1024 byte/sector optical disk media. Known problem: UFS build on 1024 byte/sector media can not mount as root filesystem. -- Shunsuke Akiyama Kyushu Matsushita Electric Co., Ltd. Fukuoka, Japan. akiyama@kme.mei.co.jp ----- (1) update patch ----- =================================================================== RCS file: etc/etc.i386/RCS/MAKEDEV,v retrieving revision 1.111 diff -u -r1.111 etc/etc.i386/MAKEDEV --- 1.111 1996/01/28 19:10:37 +++ etc/etc.i386/MAKEDEV 1996/02/12 12:59:24 @@ -93,7 +93,7 @@ # isdn* ISDN devices # labpc* National Instrument's Lab-PC and LAB-PC+ # -# $Id: MAKEDEV,v 1.111 1996/01/28 19:10:37 bde Exp $ +# $Id: MAKEDEV,v 1.111.0.1 1996/02/11 12:54:52 shun Exp $ # PATH=/sbin:/bin/:/usr/bin:/usr/sbin: @@ -164,7 +164,7 @@ all) sh MAKEDEV std # standard - sh MAKEDEV wd0 wd1 wd2 wd3 fd0 fd1 sd0 sd1 sd2 sd3 # bdev, disk + sh MAKEDEV wd0 wd1 wd2 wd3 fd0 fd1 sd0 sd1 sd2 sd3 od0 # bdev, disk sh MAKEDEV cd0 mcd0 scd0 matcd0 # bdev, cdrom sh MAKEDEV ft0 wt0 st0 # bdev, tape sh MAKEDEV ttyd0 ttyd1 ttyd2 ttyd3 # cdev, serial =================================================================== RCS file: sys/scsi/RCS/cd.c,v retrieving revision 1.60 diff -u -r1.60 sys/scsi/cd.c --- 1.60 1996/01/30 16:38:30 +++ sys/scsi/cd.c 1996/02/12 12:59:25 @@ -14,7 +14,7 @@ * * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992 * - * $Id: cd.c,v 1.60 1996/01/30 16:38:30 ache Exp $ + * $Id: cd.c,v 1.60.0.1 1996/02/12 12:57:14 shun Exp $ */ #include "opt_bounce.h" @@ -237,7 +237,7 @@ if (sc_link->quirks & CD_Q_NO_TOUCH) { dp->disksize = 0; } else { - cd_get_parms(unit, SCSI_NOSLEEP | SCSI_NOMASK); + cd_get_parms(unit, SCSI_NOSLEEP | SCSI_NOMASK | SCSI_SILENT); } if (dp->disksize) { printf("cd present [%ld x %ld byte records]", =================================================================== RCS file: sys/scsi/RCS/od.c,v retrieving revision 1.12 diff -u -r1.12 sys/scsi/od.c --- 1.12 1996/01/27 04:18:00 +++ sys/scsi/od.c 1996/02/12 12:59:25 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995 Shunsuke Akiyama. All rights reserved. + * Copyright (c) 1995, 1996 Shunsuke Akiyama. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -28,12 +28,17 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: od.c,v 1.12 1996/01/27 04:18:00 bde Exp $ + * $Id: od.c,v 1.12.0.4 1996/02/11 13:38:06 shun Exp $ */ /* - * TODO: - * 1. Add optical disk specific ioctl functions, such as eject etc. + * Compile option defines: + * OD_BOGUS_NOT_READY - If drive returns sense key as 0x02 with + * vendor specific additional sense code (ASC) + * and additional sense code qualifier (ASCQ), + * or illegal ASC and ASCQ. This cause an error + * (NOT READY) and retrying. + * To suppress this, define "OD_BOGUS_NOT_READY". */ #include "opt_bounce.h" @@ -53,6 +58,7 @@ #include #include #include +#include #include #include #ifdef DEVFS @@ -68,7 +74,7 @@ static u_int32 odstrats, odqueues; -#define SECSIZE 512 +#define SECSIZE 512 #define ODOUTSTANDING 4 #define OD_RETRIES 4 #define MAXTRANSFER 8 /* 1 page at a time */ @@ -142,18 +148,18 @@ static struct scsi_device od_switch = { - od_sense_handler, - odstart, /* have a queue, served by this */ - NULL, /* have no async handler */ - NULL, /* Use default 'done' routine */ - "od", - 0, + od_sense_handler, + odstart, /* have a queue, served by this */ + NULL, /* have no async handler */ + NULL, /* Use default 'done' routine */ + "od", + 0, {0, 0}, - 0, /* Link flags */ + 0, /* Link flags */ odattach, "Optical", odopen, - sizeof(struct scsi_data), + sizeof(struct scsi_data), T_OPTICAL, odunit, odsetunit, @@ -191,7 +197,7 @@ dev_attach(kdc); if(dk_ndrive < DK_NDRIVE) { sprintf(dk_names[dk_ndrive], "od%d", unit); - dk_wpms[dk_ndrive] = (8*1024*1024/2); + dk_wpms[dk_ndrive] = (1*1024*1024/2); /* 1MB/sec */ SCSI_DATA(&od_switch, unit)->dkunit = dk_ndrive++; } else { SCSI_DATA(&od_switch, unit)->dkunit = -1; @@ -293,7 +299,7 @@ * to look for a new device if we are not initted */ if ((!od) || (!(od->flags & ODINIT))) { - return (ENXIO); + return ENXIO; } SC_DEBUG(sc_link, SDEV_DB1, @@ -351,7 +357,7 @@ if (errcode) { goto bad; } - if (od->params.secsiz != SECSIZE) { /* XXX One day... */ + if (od->params.secsiz != SECSIZE) { printf("od%ld: Can't deal with %d bytes logical blocks\n", unit, od->params.secsiz); Debugger("od"); @@ -368,8 +374,10 @@ label.d_ncylinders = od->params.cyls; label.d_secpercyl = od->params.heads * od->params.sectors; if (label.d_secpercyl == 0) - label.d_secpercyl = 100; - /* XXX as long as it's not 0 - readdisklabel divides by it (?) */ + label.d_secpercyl = (64 * 32); + /* XXX as long as it's not 0 + * - readdisklabel divides by it (?) + */ label.d_secperunit = od->params.disksize; /* Initialize slice tables. */ @@ -411,7 +419,7 @@ scsi_prevent(sc_link, PR_ALLOW, SCSI_SILENT | SCSI_ERR_OK); sc_link->flags &= ~SDEV_OPEN; } - return (0); + return 0; } /* @@ -439,6 +447,11 @@ } /* + * check it's not too big a transfer for our adapter + */ + scsi_minphys(bp, &od_switch); + + /* * Odd number of bytes */ if (bp->b_bcount % DEV_BSIZE != 0) { @@ -566,7 +579,6 @@ /* * Fill out the scsi command */ - bzero(&cmd, sizeof(cmd)); cmd.op_code = (bp->b_flags & B_READ) ? READ_BIG : WRITE_BIG; cmd.addr_3 = (blkno & 0xff000000UL) >> 24; @@ -575,6 +587,7 @@ cmd.addr_0 = blkno & 0xff; cmd.length2 = (nblk & 0xff00) >> 8; cmd.length1 = (nblk & 0xff); + cmd.byte2 = cmd.reserved = cmd.control = 0; /* * Call the routine that chats with the adapter. * Note: we cannot sleep as we may be an interrupt @@ -624,27 +637,40 @@ od = sc_link->sd; SC_DEBUG(sc_link, SDEV_DB1, ("odioctl (0x%x)", cmd)); -#if 0 - /* Wait until we have exclusive access to the device. */ - /* XXX this is how wd does it. How did we work without this? */ - wdsleep(du->dk_ctrlr, "wdioct"); -#endif - /* * If the device is not valid.. abandon ship */ if (!(sc_link->flags & SDEV_MEDIA_LOADED)) - return (EIO); + return EIO; + + switch (cmd) { + case DIOCSBAD: + error = EINVAL; /* XXX */ + break; + case CDIOCEJECT: + error = scsi_stop_unit(sc_link, 1, 0); + break; + case CDIOCALLOW: + error = scsi_prevent(sc_link, PR_ALLOW, 0); + break; + case CDIOCPREVENT: + error = scsi_prevent(sc_link, PR_PREVENT, 0); + break; + default: + error = dsioctl("od", dev, cmd, addr, flag, &od->dk_slices, + odstrategy1, (ds_setgeom_t *)NULL); + if (error == -1) { + if (PARTITION(dev) != RAW_PART) { + error = ENOTTY; + } else { + error = scsi_do_ioctl(dev, cmd, addr, + flag, p, sc_link); + } + } + break; + } - if (cmd == DIOCSBAD) - return (EINVAL); /* XXX */ - error = dsioctl("od", dev, cmd, addr, flag, &od->dk_slices, - odstrategy1, (ds_setgeom_t *)NULL); - if (error != -1) - return (error); - if (PARTITION(dev) != RAW_PART) - return (ENOTTY); - return (scsi_do_ioctl(dev, cmd, addr, flag, p, sc_link)); + return error; } /* @@ -657,7 +683,9 @@ struct scsi_read_cap_data rdcap; struct scsi_read_capacity scsi_cmd; u_int32 size; + u_int32 secsize; struct scsi_link *sc_link = SCSI_LINK(&od_switch, unit); + struct scsi_data *od = sc_link->sd; /* * make up a scsi command and ask the scsi driver to do @@ -679,14 +707,21 @@ 20000, NULL, flags | SCSI_DATA_IN) != 0) { - return (0); + return 0; } else { - size = rdcap.addr_0 + 1; + size = rdcap.addr_0; size += rdcap.addr_1 << 8; size += rdcap.addr_2 << 16; size += rdcap.addr_3 << 24; - } - return (size); + size += 1; + secsize = rdcap.length_0; + secsize += rdcap.length_1 << 8; + secsize += rdcap.length_2 << 16; + secsize += rdcap.length_3 << 24; + } + od->params.disksize = size; + od->params.secsiz = secsize; + return size; } #ifdef notyet @@ -712,7 +747,7 @@ rbdata.defect_descriptor[0].dlbaddr_1 = ((block >> 8) & 0xff); rbdata.defect_descriptor[0].dlbaddr_0 = ((block) & 0xff); - return (scsi_scsi_cmd(sc_link, + return scsi_scsi_cmd(sc_link, (struct scsi_generic *) &scsi_cmd, sizeof(scsi_cmd), (u_char *) & rbdata, @@ -720,7 +755,7 @@ OD_RETRIES, 20000, NULL, - SCSI_DATA_OUT)); + SCSI_DATA_OUT); } #endif #define b2tol(a) (((unsigned)(a##_1) << 8) + (unsigned)a##_0 ) @@ -747,16 +782,28 @@ return 0; /* - * use adaptec standard ficticious geometry - * this depends on which controller (e.g. 1542C is - * different. but we have to put SOMETHING here..) + * Use ficticious geometry, this depends on the size of medium. */ sectors = od_size(unit, flags); + /* od_size() sets secsiz and disksize */ disk_parms->heads = 64; disk_parms->sectors = 32; disk_parms->cyls = sectors / (64 * 32); - disk_parms->secsiz = SECSIZE; - disk_parms->disksize = sectors; + while (disk_parms->cyls >= 1024) { + if (disk_parms->heads < 128) { + disk_parms->heads *= 2; + } else { + if (disk_parms->sectors < 128) { + disk_parms->sectors *= 2; + } else { + disk_parms->cyls + = sectors / (disk_parms->heads * disk_parms->sectors); + break; + } + } + disk_parms->cyls + = sectors / (disk_parms->heads * disk_parms->sectors); + } if (sectors != 0) { sc_link->flags |= SDEV_MEDIA_LOADED; @@ -788,6 +835,13 @@ if ((sense->error_code & SSD_ERRCODE) == 0x71) return SCSIRET_CONTINUE; +#ifdef OD_BOGUS_NOT_READY + if (((sense->error_code & SSD_ERRCODE) == 0x70) && + ((sense->ext.extended.flags & SSD_KEY) == 0x02)) + /* No point in retrying Not Ready */ + return SCSIRET_CONTINUE; +#endif + if (((sense->error_code & SSD_ERRCODE) == 0x70) && ((sense->ext.extended.flags & SSD_KEY) == 0x04)) /* No point in retrying Hardware Failure */ @@ -851,5 +905,3 @@ } SYSINIT(oddev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,od_drvinit,NULL) - - ----- (1) update patch ----- ----- (2) enhancement patch ----- =================================================================== RCS file: sys/kern/RCS/subr_diskslice.c,v retrieving revision 1.19 diff -u -r1.19 sys/kern/subr_diskslice.c --- 1.19 1996/01/28 08:15:44 +++ sys/kern/subr_diskslice.c 1996/02/12 13:01:22 @@ -43,7 +43,7 @@ * from: wd.c,v 1.55 1994/10/22 01:57:12 phk Exp $ * from: @(#)ufs_disksubr.c 7.16 (Berkeley) 5/4/91 * from: ufs_disksubr.c,v 1.8 1994/06/07 01:21:39 phk Exp $ - * $Id: subr_diskslice.c,v 1.19 1996/01/28 08:15:44 bde Exp $ + * $Id: subr_diskslice.c,v 1.19.0.1 1996/02/11 13:34:04 shun Exp $ */ #include @@ -111,6 +111,7 @@ struct partition *pp; struct diskslice *sp; long sz; + long scale; if (bp->b_blkno < 0) { Debugger("Slice code got negative blocknumber"); @@ -121,15 +122,17 @@ lp = sp->ds_label; sz = (bp->b_bcount + DEV_BSIZE - 1) >> DEV_BSHIFT; if (lp == NULL) { + scale = 1; blkno = bp->b_blkno; labelsect = -LABELSECTOR - 1; maxsz = sp->ds_size; } else { - labelsect = lp->d_partitions[LABEL_PART].p_offset; + scale = lp->d_secsize / DEV_BSIZE; + labelsect = lp->d_partitions[LABEL_PART].p_offset * scale; if (labelsect != 0) Debugger("labelsect != 0 in dscheck()"); pp = &lp->d_partitions[dkpart(bp->b_dev)]; - blkno = pp->p_offset + bp->b_blkno; - maxsz = pp->p_size; + blkno = pp->p_offset * scale + bp->b_blkno; + maxsz = pp->p_size * scale; if (sp->ds_bad != NULL && ds_debug) { daddr_t newblkno; @@ -142,9 +145,9 @@ /* overwriting disk label ? */ /* XXX should also protect bootstrap in first 8K */ - if (blkno <= LABELSECTOR + labelsect && + if (blkno <= LABELSECTOR * scale + labelsect && #if LABELSECTOR != 0 - bp->b_blkno + sz > LABELSECTOR + labelsect && + bp->b_blkno + sz > LABELSECTOR * scale + labelsect && #endif (bp->b_flags & B_READ) == 0 && sp->ds_wlabel == 0) { bp->b_error = EROFS; @@ -177,7 +180,7 @@ } /* calculate cylinder for disksort to order transfers with */ - bp->b_pblkno = blkno + sp->ds_offset; + bp->b_pblkno = blkno + sp->ds_offset * scale; if (lp == NULL) bp->b_cylinder = 0; /* XXX always 0 would be better */ else @@ -188,9 +191,9 @@ * offsets in the label to keep the in-core label coherent with * the on-disk one. */ - if (blkno <= LABELSECTOR + labelsect + if (blkno <= LABELSECTOR * scale + labelsect #if LABELSECTOR != 0 - && bp->b_blkno + sz > LABELSECTOR + labelsect + && bp->b_blkno + sz > LABELSECTOR * scale + labelsect #endif && sp->ds_offset != 0) { struct iodone_chain *ic; @@ -199,8 +202,8 @@ ic->ic_prev_flags = bp->b_flags; ic->ic_prev_iodone = bp->b_iodone; ic->ic_prev_iodone_chain = bp->b_iodone_chain; - ic->ic_args[0].ia_long = (LABELSECTOR + labelsect - blkno) - << DEV_BSHIFT; + ic->ic_args[0].ia_long = + (LABELSECTOR * scale + labelsect - blkno) << DEV_BSHIFT; ic->ic_args[1].ia_ptr = sp; bp->b_flags |= B_CALL; bp->b_iodone = dsiodone; @@ -764,7 +767,8 @@ lp = ssp->dss_slices[slice].ds_label; if (lp == NULL) return (-1); - return ((int)lp->d_partitions[part].p_size); + return ((int)lp->d_partitions[part].p_size + * (lp->d_secsize / DEV_BSIZE)); } static void =================================================================== RCS file: sys/scsi/RCS/od.c,v retrieving revision 1.12.0.4 diff -u -r1.12.0.4 sys/scsi/od.c --- 1.12.0.4 1996/02/11 13:38:06 +++ sys/scsi/od.c 1996/02/12 13:01:22 @@ -28,7 +28,7 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: od.c,v 1.12.0.4 1996/02/11 13:38:06 shun Exp $ + * $Id: od.c,v 1.12.0.4.0.1 1996/02/11 13:41:33 shun Exp $ */ /* @@ -357,7 +357,7 @@ if (errcode) { goto bad; } - if (od->params.secsiz != SECSIZE) { + if (od->params.secsiz != SECSIZE && od->params.secsiz != 1024) { printf("od%ld: Can't deal with %d bytes logical blocks\n", unit, od->params.secsiz); Debugger("od"); @@ -533,6 +533,7 @@ struct buf *bp = 0; struct scsi_rw_big cmd; u_int32 blkno, nblk; + u_int32 secsize; SC_DEBUG(sc_link, SDEV_DB2, ("odstart ")); /* @@ -569,12 +570,13 @@ * We have a buf, now we know we are going to go through * With this thing.. */ - blkno = bp->b_pblkno; - if (bp->b_bcount & (SECSIZE - 1)) + secsize = od->params.secsiz; + blkno = bp->b_pblkno / (secsize / DEV_BSIZE); + if (bp->b_bcount & (secsize - 1)) { goto bad; } - nblk = bp->b_bcount >> 9; + nblk = (bp->b_bcount + (secsize - 1)) / secsize; /* * Fill out the scsi command =================================================================== RCS file: sys/ufs/ffs/RCS/ffs_vfsops.c,v retrieving revision 1.35 diff -u -r1.35 sys/ufs/ffs/ffs_vfsops.c --- 1.35 1996/01/19 03:59:14 +++ sys/ufs/ffs/ffs_vfsops.c 1996/02/12 13:01:22 @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)ffs_vfsops.c 8.8 (Berkeley) 4/18/94 - * $Id: ffs_vfsops.c,v 1.35 1996/01/19 03:59:14 dyson Exp $ + * $Id: ffs_vfsops.c,v 1.35.0.2 1996/02/12 07:45:48 shun Exp $ */ #include "opt_quota.h" @@ -144,7 +144,7 @@ struct ufs_args args; struct ufsmount *ump = 0; - register struct fs *fs; + register struct fs *fs = NULL; int flags; /* @@ -326,6 +326,14 @@ */ (void)VFS_STATFS(mp, &mp->mnt_stat, p); + if (fs == NULL) { + /* root mounts, set default sector size */ + mp->mnt_stat.f_spare[0] = 512; + } else { + /* non-root mounts, set sector size */ + mp->mnt_stat.f_spare[0] = fs->fs_fsize / fs->fs_nspf; + } + goto success; @@ -530,6 +538,8 @@ fs->fs_fmod = 1; fs->fs_clean = 0; } + for (fs->fs_fsbtodb = 0, i = fs->fs_fsize / DEV_BSIZE; i > 1; i >>= 1) + fs->fs_fsbtodb++; blks = howmany(fs->fs_cssize, fs->fs_fsize); base = space = malloc((u_long)fs->fs_cssize, M_UFSMNT, M_WAITOK); =================================================================== RCS file: sys/ufs/ufs/RCS/ufs_disksubr.c,v retrieving revision 1.20 diff -u -r1.20 sys/ufs/ufs/ufs_disksubr.c --- 1.20 1995/11/23 07:24:32 +++ sys/ufs/ufs/ufs_disksubr.c 1996/02/12 13:01:22 @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)ufs_disksubr.c 8.5 (Berkeley) 1/21/94 - * $Id: ufs_disksubr.c,v 1.20 1995/11/23 07:24:32 dyson Exp $ + * $Id: ufs_disksubr.c,v 1.20.0.1 1996/02/11 14:00:36 shun Exp $ */ #include @@ -249,13 +249,15 @@ register struct buf *bp; struct disklabel *dlp; char *msg = NULL; + int scale; + scale = lp->d_secsize / DEV_BSIZE; bp = geteblk((int)lp->d_secsize); bp->b_dev = dev; - bp->b_blkno = LABELSECTOR; + bp->b_blkno = LABELSECTOR * scale; bp->b_bcount = lp->d_secsize; bp->b_flags = B_BUSY | B_READ; - bp->b_cylinder = LABELSECTOR / lp->d_secpercyl; + bp->b_cylinder = (LABELSECTOR * scale) / lp->d_secpercyl; (*strat)(bp); if (biowait(bp)) msg = "I/O error"; @@ -353,7 +355,7 @@ } bp = geteblk((int)lp->d_secsize); bp->b_dev = dkmodpart(dev, labelpart); - bp->b_blkno = LABELSECTOR; + bp->b_blkno = LABELSECTOR * (lp->d_secsize / DEV_BSIZE); bp->b_bcount = lp->d_secsize; #if 1 /* =================================================================== RCS file: sys/vm/RCS/vnode_pager.c,v retrieving revision 1.58 diff -u -r1.58 sys/vm/vnode_pager.c --- 1.58 1996/01/19 04:00:31 +++ sys/vm/vnode_pager.c 1996/02/12 13:01:23 @@ -38,7 +38,7 @@ * SUCH DAMAGE. * * from: @(#)vnode_pager.c 7.5 (Berkeley) 4/20/91 - * $Id: vnode_pager.c,v 1.58 1996/01/19 04:00:31 dyson Exp $ + * $Id: vnode_pager.c,v 1.58.0.1 1996/02/11 14:04:46 shun Exp $ */ /* @@ -628,12 +628,14 @@ struct buf *bp; int s; int error = 0; + int dev_bsize; vp = object->handle; if (vp->v_mount == NULL) return VM_PAGER_BAD; bsize = vp->v_mount->mnt_stat.f_iosize; + dev_bsize = vp->v_mount->mnt_stat.f_spare[0]; /* get the UNDERLYING device for the file with VOP_BMAP() */ @@ -752,7 +754,7 @@ * round up physical size for real devices */ if (dp->v_type == VBLK || dp->v_type == VCHR) - size = (size + DEV_BSIZE - 1) & ~(DEV_BSIZE - 1); + size = (size + dev_bsize - 1) & ~(dev_bsize - 1); bp = getpbuf(); kva = (vm_offset_t) bp->b_data; ----- (2) enhancement patch -----