aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/vfs_vnops.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/vfs_vnops.c')
-rw-r--r--sys/kern/vfs_vnops.c34
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