When estimating the on-disk footprint of a file, we either used st_blocks that is counted in 512-byte blocks (traditional unix behaviour), or on platforms that do not have such st_blocks field in struct stat, simply the file size itself. Building with NO_ST_BLOCKS_IN_STRUCT_STAT will choose the latter implementaion. POSIX.1 says in its <sys/stat.h> description on this issue: The unit for the st_blocks member of the stat structure is not defined within POSIX.1-2008. In some implementations it is 512 bytes. It may differ on a file system basis. There is no correlation between values of the st_blocks and st_blksize, and the f_bsize (from <sys/statvfs.h>) structure members. Even though the above explicitly states st_blksize does not have any correlation, at least on one system (Cygwin on NTFS), the st_blocks field seems to count in blocks of st_blksize bytes. A new Makefile variable ST_BLOCKS_COUNTS_IN_BLKSIZE chooses to use this for the on-disk footprint. --- Not signed-off yet, but this might be a workable alternative. Testing on wider platforms (especially not on "Linux with ext?") might find this alternative useful. I dunno. Makefile | 8 +++++++- git-compat-util.h | 4 +++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 79195c8..5f2c5de 100644 --- a/Makefile +++ b/Makefile @@ -148,6 +148,9 @@ all:: # Define USE_STDEV below if you want git to care about the underlying device # change being considered an inode change from the update-index perspective. # +# Define ST_BLOCKS_COUNTS_IN_ST_BLKSIZE if your platform has st_blocks +# field that counts the on-disk footprint in st_blksize-byte blocks. +# # Define NO_ST_BLOCKS_IN_STRUCT_STAT if your platform does not have st_blocks # field that counts the on-disk footprint in 512-byte blocks. # @@ -776,7 +779,7 @@ ifeq ($(uname_O),Cygwin) NO_FAST_WORKING_DIRECTORY = UnfortunatelyYes NO_TRUSTABLE_FILEMODE = UnfortunatelyYes OLD_ICONV = UnfortunatelyYes - NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease + ST_BLOCKS_COUNTS_IN_ST_BLKSIZE = YesPlease # There are conflicting reports about this. # On some boxes NO_MMAP is needed, and not so elsewhere. # Try commenting this out if you suspect MMAP is more efficient @@ -1126,6 +1129,9 @@ endif ifdef NO_D_INO_IN_DIRENT BASIC_CFLAGS += -DNO_D_INO_IN_DIRENT endif +ifdef ST_BLOCKS_COUNTS_IN_ST_BLKSIZE + BASIC_CFLAGS += -DST_BLOCKS_COUNTS_IN_ST_BLKSIZE +endif ifdef NO_ST_BLOCKS_IN_STRUCT_STAT BASIC_CFLAGS += -DNO_ST_BLOCKS_IN_STRUCT_STAT endif diff --git a/git-compat-util.h b/git-compat-util.h index ef60803..bba9c9e 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -240,7 +240,9 @@ extern int git_munmap(void *start, size_t length); #endif /* NO_MMAP */ -#ifdef NO_ST_BLOCKS_IN_STRUCT_STAT +#ifdef ST_BLOCKS_COUNTS_IN_ST_BLKSIZE +#define on_disk_bytes(st) ((st).st_blocks * (st).st_blksize) +#elif defined(NO_ST_BLOCKS_IN_STRUCT_STAT) && NO_ST_BLOCKS_IN_STRUCT_STAT #define on_disk_bytes(st) ((st).st_size) #else #define on_disk_bytes(st) ((st).st_blocks * 512) -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html