diff options
author | phk <phk@FreeBSD.org> | 2004-10-26 07:39:12 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2004-10-26 07:39:12 +0000 |
commit | c66aa10c8e6167eefdae7f218765e3e5f146074a (patch) | |
tree | 99d735718c70e881e08ae2c1a8455ddc64133e68 /sys | |
parent | 343104d2b1da0fbfb5e5c9c1fe56d2669864ca17 (diff) | |
download | FreeBSD-src-c66aa10c8e6167eefdae7f218765e3e5f146074a.zip FreeBSD-src-c66aa10c8e6167eefdae7f218765e3e5f146074a.tar.gz |
Put the I/O block size in bufobj->bo_bsize.
We keep si_bsize_phys around for now as that is the simplest way to pull
the number out of disk device drivers in devfs_open(). The correct solution
would be to do an ioctl(DIOCGSECTORSIZE), but the point is probably mooth
when filesystems sit on GEOM, so don't bother for now.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/fs/devfs/devfs_vnops.c | 2 | ||||
-rw-r--r-- | sys/kern/vfs_aio.c | 2 | ||||
-rw-r--r-- | sys/kern/vfs_bio.c | 9 | ||||
-rw-r--r-- | sys/kern/vfs_subr.c | 5 | ||||
-rw-r--r-- | sys/kern/vfs_vnops.c | 11 | ||||
-rw-r--r-- | sys/sys/bufobj.h | 3 | ||||
-rw-r--r-- | sys/ufs/ffs/ffs_rawread.c | 2 | ||||
-rw-r--r-- | sys/ufs/ffs/ffs_vfsops.c | 1 | ||||
-rw-r--r-- | sys/vm/vnode_pager.c | 2 |
9 files changed, 14 insertions, 23 deletions
diff --git a/sys/fs/devfs/devfs_vnops.c b/sys/fs/devfs/devfs_vnops.c index ded05a9..90b15c5 100644 --- a/sys/fs/devfs/devfs_vnops.c +++ b/sys/fs/devfs/devfs_vnops.c @@ -782,11 +782,11 @@ devfs_open(ap) if (vn_isdisk(vp, NULL)) { if (!dev->si_bsize_phys) dev->si_bsize_phys = DEV_BSIZE; + vp->v_bufobj.bo_bsize = dev->si_bsize_phys; } return (error); } - static int devfs_pathconf(ap) struct vop_pathconf_args /* { diff --git a/sys/kern/vfs_aio.c b/sys/kern/vfs_aio.c index 19c55de..4b6132d 100644 --- a/sys/kern/vfs_aio.c +++ b/sys/kern/vfs_aio.c @@ -1086,7 +1086,7 @@ aio_qphysio(struct proc *p, struct aiocblist *aiocbe) return (error); } - if (cb->aio_nbytes % vp->v_rdev->si_bsize_phys) + if (cb->aio_nbytes % vp->v_bufobj.bo_bsize) return (-1); if (cb->aio_nbytes > diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c index 2c015b2..4b23f51 100644 --- a/sys/kern/vfs_bio.c +++ b/sys/kern/vfs_bio.c @@ -2560,15 +2560,8 @@ loop: splx(s); return NULL; } - if (vn_isdisk(vp, NULL)) - bsize = DEV_BSIZE; - else if (vp->v_mountedhere) - bsize = vp->v_mountedhere->mnt_stat.f_iosize; - else if (vp->v_mount) - bsize = vp->v_mount->mnt_stat.f_iosize; - else - bsize = size; + bsize = bo->bo_bsize; offset = blkno * bsize; vmio = (VOP_GETVOBJECT(vp, NULL) == 0) && (vp->v_vflag & VV_OBJBUF); diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index a233c5a..a7d3fc8 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -863,8 +863,10 @@ getnewvnode(tag, mp, vops, vpp) printf("NULL mp in getnewvnode()\n"); #endif delmntque(vp); - if (mp != NULL) + if (mp != NULL) { insmntque(vp, mp); + bo->bo_bsize = mp->mnt_stat.f_iosize; + } return (0); } @@ -1812,6 +1814,7 @@ bdevvp(dev, vpp) } vp = nvp; vp->v_type = VCHR; + vp->v_bufobj.bo_bsize = DEV_BSIZE; addalias(vp, dev); *vpp = vp; return (0); diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index 7110bc4..a32e128 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -734,17 +734,10 @@ vn_stat(vp, sb, active_cred, file_cred, td) * object. In some filesystem types, this may vary from file * to file" * Default to PAGE_SIZE after much discussion. + * XXX: min(PAGE_SIZE, vp->v_bufobj.bo_bsize) may be more correct. */ - if (vap->va_type == VREG) { - sb->st_blksize = vap->va_blocksize; - } else if (vn_isdisk(vp, NULL)) { - sb->st_blksize = vp->v_rdev->si_bsize_phys; - if (sb->st_blksize < BLKDEV_IOSIZE) - sb->st_blksize = BLKDEV_IOSIZE; - } else { - sb->st_blksize = PAGE_SIZE; - } + sb->st_blksize = PAGE_SIZE; sb->st_flags = vap->va_flags; if (suser(td)) diff --git a/sys/sys/bufobj.h b/sys/sys/bufobj.h index 86058ed..337d0cd 100644 --- a/sys/sys/bufobj.h +++ b/sys/sys/bufobj.h @@ -82,7 +82,8 @@ struct bufobj { struct bufv bo_dirty; /* i Dirty buffers */ long bo_numoutput; /* i Writes in progress */ u_int bo_flag; /* i Flags */ - struct buf_ops *bo_ops; /* - buffer operatoins */ + struct buf_ops *bo_ops; /* - Buffer operations */ + int bo_bsize; /* - Block size for i/o */ struct vm_object *bo_object; /* v Place to store VM object */ }; diff --git a/sys/ufs/ffs/ffs_rawread.c b/sys/ufs/ffs/ffs_rawread.c index 05f1577..2e15704 100644 --- a/sys/ufs/ffs/ffs_rawread.c +++ b/sys/ufs/ffs/ffs_rawread.c @@ -446,7 +446,7 @@ ffs_rawread(struct vnode *vp, /* Only handle sector aligned reads */ ip = VTOI(vp); - secsize = ip->i_devvp->v_rdev->si_bsize_phys; + secsize = ip->i_devvp->v_bufobj.bo_bsize; if ((uio->uio_offset & (secsize - 1)) == 0 && (uio->uio_resid & (secsize - 1)) == 0) { diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c index ad63665..259dc00 100644 --- a/sys/ufs/ffs/ffs_vfsops.c +++ b/sys/ufs/ffs/ffs_vfsops.c @@ -1242,6 +1242,7 @@ ffs_vget(mp, ino, flags, vpp) fs = ump->um_fs; vp->v_vnlock->lk_flags |= LK_CANRECURSE; vp->v_data = ip; + vp->v_bufobj.bo_bsize = fs->fs_bsize; ip->i_vnode = vp; ip->i_ump = ump; ip->i_fs = fs; diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c index 30bd8c7..84aa6b4 100644 --- a/sys/vm/vnode_pager.c +++ b/sys/vm/vnode_pager.c @@ -798,7 +798,7 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpage) * round up physical size for real devices. */ if (dp->v_type == VBLK || dp->v_type == VCHR) { - int secmask = dp->v_rdev->si_bsize_phys - 1; + int secmask = dp->v_bufobj.bo_bsize - 1; KASSERT(secmask < PAGE_SIZE, ("vnode_pager_generic_getpages: sector size %d too large\n", secmask + 1)); size = (size + secmask) & ~secmask; } |