summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2004-10-26 07:39:12 +0000
committerphk <phk@FreeBSD.org>2004-10-26 07:39:12 +0000
commitc66aa10c8e6167eefdae7f218765e3e5f146074a (patch)
tree99d735718c70e881e08ae2c1a8455ddc64133e68
parent343104d2b1da0fbfb5e5c9c1fe56d2669864ca17 (diff)
downloadFreeBSD-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.
-rw-r--r--sys/fs/devfs/devfs_vnops.c2
-rw-r--r--sys/kern/vfs_aio.c2
-rw-r--r--sys/kern/vfs_bio.c9
-rw-r--r--sys/kern/vfs_subr.c5
-rw-r--r--sys/kern/vfs_vnops.c11
-rw-r--r--sys/sys/bufobj.h3
-rw-r--r--sys/ufs/ffs/ffs_rawread.c2
-rw-r--r--sys/ufs/ffs/ffs_vfsops.c1
-rw-r--r--sys/vm/vnode_pager.c2
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;
}
OpenPOWER on IntegriCloud