src/nnn.c | 13 ++++++++----- diff --git a/src/nnn.c b/src/nnn.c index ea37f2b461b7174ad5d5e63c82dfff8a03e52388..0e158068c1def732b78cf609994d24226d95a266 100644 --- a/src/nnn.c +++ b/src/nnn.c @@ -165,7 +165,7 @@ #define ARCHIVE_CMD_LEN 16 #define BLK_SHIFT_512 9 /* Detect hardlinks in du */ -#define HASH_BITS (0xFFFFFF) +#define HASH_BITS (0xFFFF) #define HASH_OCTETS (HASH_BITS >> 6) /* 2^6 = 64 */ /* Program return codes */ @@ -702,6 +702,7 @@ * Source: https://elixir.bootlin.com/linux/latest/source/arch/alpha/include/asm/bitops.h */ static bool test_set_bit(ull nr) { + nr &= HASH_BITS; ull *m = ((ull *)ihashbmp) + (nr >> 6); if (*m & (1 << (nr & 63))) @@ -4179,7 +4180,7 @@ static int sum_bsize(const char *UNUSED(fpath), const struct stat *sb, int typeflag, struct FTW *UNUSED(ftwbuf)) { if (sb->st_blocks && (typeflag == FTW_F || typeflag == FTW_D) - && (sb->st_nlink <= 1 || test_set_bit((ull)sb->st_ino))) + && (sb->st_nlink <= 1 || test_set_bit((ull)sb->st_ino + (ull)sb->st_size))) ent_blocks += sb->st_blocks; ++num_files; @@ -4189,7 +4190,7 @@ static int sum_asize(const char *UNUSED(fpath), const struct stat *sb, int typeflag, struct FTW *UNUSED(ftwbuf)) { if (sb->st_size && (typeflag == FTW_F || typeflag == FTW_D) - && (sb->st_nlink <= 1 || test_set_bit((ull)sb->st_ino))) + && (sb->st_nlink <= 1 || test_set_bit((ull)sb->st_ino + (ull)sb->st_size))) ent_blocks += sb->st_size; ++num_files; @@ -4309,7 +4310,8 @@ goto exit; } } else { /* Do not recount hard links */ - if (sb.st_nlink <= 1 || test_set_bit((ull)sb.st_ino)) + if (sb.st_nlink <= 1 + || test_set_bit((ull)sb.st_ino + (ull)sb.st_size)) dir_blocks += (cfg.apparentsz ? sb.st_size : sb.st_blocks); ++num_files; } @@ -4406,7 +4408,8 @@ goto exit; } else { dentp->blocks = (cfg.apparentsz ? sb.st_size : sb.st_blocks); /* Do not recount hard links */ - if (sb.st_nlink <= 1 || test_set_bit((ull)sb.st_ino)) + if (sb.st_nlink <= 1 + || test_set_bit((ull)sb.st_ino + (ull)sb.st_size)) dir_blocks += dentp->blocks; ++num_files; }