Re: [PATCH] git-count-objects: Fix a disk-space under-estimate on Cygwin
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Nov 20, 2009, 07:49 UTC
- Message-ID
- <7vlji17i02.fsf@alter.siamese.dyndns.org>
- In-Reply-To
- <7vd43d8yva.fsf@alter.siamese.dyndns.org>
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)