Date: Thu, 10 May 2001 03:20:05 -0700 (PDT) From: Jan Conrad <conrad@th.physik.uni-bonn.de> To: freebsd-bugs@FreeBSD.org Subject: Re: kern/27232: On NFSv3 mounted filesystems, stat returns st_blksize=512 Message-ID: <200105101020.f4AAK5065603@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/27232; it has been noted by GNATS. From: Jan Conrad <conrad@th.physik.uni-bonn.de> To: Garrett Wollman <wollman@khavrinen.lcs.mit.edu> Cc: <freebsd-gnats-submit@FreeBSD.ORG> Subject: Re: kern/27232: On NFSv3 mounted filesystems, stat returns st_blksize=512 Date: Thu, 10 May 2001 12:18:18 +0200 (CEST) On Wed, 9 May 2001, Garrett Wollman wrote: > <<On Wed, 9 May 2001 10:11:55 -0700 (PDT), conrad@th.physik.uni-bonn.de said: > > > On NFSv3 mounts, stat returns st_blksize=512 for every regular file. > > This in turn is used by libc routines as a default buffer size, as it > > should be the 'optimal' io blocksize. > > No. It should be the block size used by the underlying filesystem's > block allocator, and in which the file's `st_blocks' size-on-disk is > reported. While SUS describes it as a ``preferred'' block size, and > the FreeBSD manual pages describe it as ``optimal ... for I/O'', the > most important meaning of this field is as a multiplier of st_blocks > to determine the file's size. Hmm - I am sorry, but I can't believe your answer. If I stat the following file on /var/tmp (newfs'd with -b 8192 -f 1024) (all with FreeBSD 4.3R) -rw-r--r-- 1 root wheel 33398 Mar 13 17:40 /var/tmp/dev.out # my little stat checker (appended to the message) gives me ./stat /var/tmp/dev.out: st_mode = 100644 st_blksize = 8192 st_size = 33398 st_blocks = 66 As you can see st_blocks measures the size of the file in 512byte blocks independent of st_blksize! And the source of this is ufs_getattr in sys/ufs/ufs/ufs_vnops.c (this is present in HEAD!) vap->va_flags = ip->i_flags; vap->va_gen = ip->i_gen; vap->va_blocksize = vp->v_mount->mnt_stat.f_iosize; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ vap->va_bytes = dbtob((u_quad_t)ip->i_blocks); vap->va_type = IFTOVT(ip->i_mode); So either ufs or nfs is wrong (or both!) -Jan The output is from the following little program #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define FILE1 "/milles/home/conrad/src/stat/stat.c" #define FILE2 "/.amd_mnt/avz109/users/Math_Dictionary/readme.htm" #define FILE3 "/var/tmp/dev.out" main() { struct stat sb; char *file = FILE3; if (stat(file, &sb) < 0) { printf ("fail\n"); } else { printf ("%s:\n", file); printf ("st_mode = %o\n", sb.st_mode); printf ("st_blksize = %u\n", sb.st_blksize); printf ("st_size = %u\n", sb.st_size); printf ("st_blocks = %U\n", sb.st_blocks); }; } > > -GAWollman > > -- > Garrett A. Wollman | O Siem / We are all family / O Siem / We're all the same > wollman@lcs.mit.edu | O Siem / The fires of freedom > Opinions not those of| Dance in the burning flame > MIT, LCS, CRS, or NSA| - Susan Aglukark and Chad Irschick > -- Physikalisches Institut der Universitaet Bonn Nussallee 12 D-53115 Bonn GERMANY To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200105101020.f4AAK5065603>