Hash inodes with lesser number of bits

This commit is contained in:
Arun Prakash Jana 2020-02-27 00:37:00 +05:30
parent f12bf0a2ee
commit 05f3d5fdbe
No known key found for this signature in database
GPG key ID: A75979F35C080412

View file

@ -165,7 +165,7 @@
#define BLK_SHIFT_512 9 #define BLK_SHIFT_512 9
/* Detect hardlinks in du */ /* Detect hardlinks in du */
#define HASH_BITS (0xFFFFFF) #define HASH_BITS (0xFFFF)
#define HASH_OCTETS (HASH_BITS >> 6) /* 2^6 = 64 */ #define HASH_OCTETS (HASH_BITS >> 6) /* 2^6 = 64 */
/* Program return codes */ /* Program return codes */
@ -702,6 +702,7 @@ static char *xitoa(uint val)
*/ */
static bool test_set_bit(ull nr) static bool test_set_bit(ull nr)
{ {
nr &= HASH_BITS;
ull *m = ((ull *)ihashbmp) + (nr >> 6); ull *m = ((ull *)ihashbmp) + (nr >> 6);
if (*m & (1 << (nr & 63))) if (*m & (1 << (nr & 63)))
@ -4179,7 +4180,7 @@ static void launch_app(const char *path, char *newpath)
static int sum_bsize(const char *UNUSED(fpath), const struct stat *sb, int typeflag, struct FTW *UNUSED(ftwbuf)) 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) 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; ent_blocks += sb->st_blocks;
++num_files; ++num_files;
@ -4189,7 +4190,7 @@ static int sum_bsize(const char *UNUSED(fpath), const struct stat *sb, int typef
static int sum_asize(const char *UNUSED(fpath), const struct stat *sb, int typeflag, struct FTW *UNUSED(ftwbuf)) 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) 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; ent_blocks += sb->st_size;
++num_files; ++num_files;
@ -4309,7 +4310,8 @@ static int dentfill(char *path, struct entry **dents)
} }
} else { } else {
/* Do not recount hard links */ /* 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); dir_blocks += (cfg.apparentsz ? sb.st_size : sb.st_blocks);
++num_files; ++num_files;
} }
@ -4406,7 +4408,8 @@ static int dentfill(char *path, struct entry **dents)
} else { } else {
dentp->blocks = (cfg.apparentsz ? sb.st_size : sb.st_blocks); dentp->blocks = (cfg.apparentsz ? sb.st_size : sb.st_blocks);
/* Do not recount hard links */ /* 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; dir_blocks += dentp->blocks;
++num_files; ++num_files;
} }