From: Johan Holmberg Date: 2011-01-07T06:45:07+09:00 Subject: Re: Getting the actual size of a sparse file On Thu, Jan 6, 2011 at 9:44 PM, Daniel Berger wrote: > >> >> See stat(2): >> >>        The st_blocks field indicates the number of  blocks  allocated  to  the >>        file,  512-byte  units.  (This may be smaller than st_size/512 when the >>        file has holes.) >> >>        The st_blksize field gives the "preferred" blocksize for efficient file >>        system  I/O.  (Writing to a file in smaller chunks may cause an ineffi- >>        cient read-modify-rewrite.) >> >> So "blksize" has nothing to do with the size of the "blocks". They are >> always counted in 512-byte units. > > Oh, wow, I don't think I knew that. It's strikes me as particularly > bizarre that they would return some notion of a "preferred block size" > instead of the actual block size. Seriously, what's the use of that? > I think the two fields "st_blocks" and "st_blksize" just happens to use the same word ("block") in two slightly different meanings. To count the "st_blocks" in 512-byte units seem to be an arbitrary convention, unrelated to the "physical block size" used for files. > Now I need to check other platforms (Solaris, HP-UX) to see if they > use 512 byte convention. > > Is this something that's universal? Or is it something I can get via a > C call somewhere? > I looked in "Advanced UNIX Programming, 2nd ed" by Rochkind, and there the "st_blocks" field is described as the number of 512-byte blocks allocated for a file. So I guess this is a universal thing for UN*X (Linux, Mac OS X, Solaris, etc.). The Rochkind book also mentions that "st_blksize is in the stat structure so that an implementation can vary it by file if it chooses to do so". Regards, /Johan Holmberg