diff options
Diffstat (limited to 'sys/kern/vfs_vnops.c')
-rw-r--r-- | sys/kern/vfs_vnops.c | 34 |
1 files changed, 13 insertions, 21 deletions
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index c64a77e55280..0a08938ae24b 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -429,31 +429,23 @@ vn_stat(vp, sb, p) sb->st_atimespec = vap->va_atime; sb->st_mtimespec = vap->va_mtime; sb->st_ctimespec = vap->va_ctime; - /* - * According to www.opengroup.org, the meaning of st_blksize is - * "a filesystem-specific preferred I/O block size for this - * object. In some filesystem types, this may vary from file - * to file" - * Default to zero to catch bogus uses of this field. + * For block and char device nodes we don't really care + * about what the filesystem told us, we want to know + * what the device told us */ - sb->st_blksize = 0; - - if (vp->v_type == VREG) - sb->st_blksize = vap->va_blocksize; - - /* - * For disks we can say something sensible. We report the max - * size because we prefer few big transfers than many small. - * XXX: Only reliable if the disk is opened. - * XXX: Use vn_isdisk when it allows VCHR too - */ - if ((vp->v_type == VBLK || vp->v_type == VCHR) && - devsw(vp->v_rdev) && (devsw(vp->v_rdev)->d_flags & D_DISK)) + switch (vap->va_type) { + case VBLK: + sb->st_blksize = vp->v_rdev->si_bsize_best; + break; + case VCHR: sb->st_blksize = vp->v_rdev->si_bsize_max; - + break; + default: + sb->st_blksize = vap->va_blocksize; + break; + } sb->st_flags = vap->va_flags; - if (suser_xxx(p->p_ucred, 0, 0)) sb->st_gen = 0; else |