From cf6f65c5eab5d7d9d0f86fb8b6b3841f7b0f535a Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 24 Mar 2026 16:56:40 +0100 Subject: [PATCH] stat-util: also include inode type in hash ops This doesn't really have any major benefit, but it does make this nicely mirror stat_inode_same() which also checks this triplet for identifying identical inodes. --- src/basic/stat-util.c | 10 +++++++++- src/basic/stat-util.h | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/basic/stat-util.c b/src/basic/stat-util.c index ef39562992c..98dfa8c5a97 100644 --- a/src/basic/stat-util.c +++ b/src/basic/stat-util.c @@ -709,6 +709,10 @@ nsec_t statx_timestamp_load_nsec(const struct statx_timestamp *ts) { void inode_hash_func(const struct stat *q, struct siphash *state) { siphash24_compress_typesafe(q->st_dev, state); siphash24_compress_typesafe(q->st_ino, state); + + /* Also include inode type, to mirror stat_inode_same() */ + mode_t type = q->st_mode & S_IFMT; + siphash24_compress_typesafe(type, state); } int inode_compare_func(const struct stat *a, const struct stat *b) { @@ -718,7 +722,11 @@ int inode_compare_func(const struct stat *a, const struct stat *b) { if (r != 0) return r; - return CMP(a->st_ino, b->st_ino); + r = CMP(a->st_ino, b->st_ino); + if (r != 0) + return r; + + return CMP(a->st_mode & S_IFMT, b->st_mode & S_IFMT); } DEFINE_HASH_OPS_WITH_KEY_DESTRUCTOR(inode_hash_ops, struct stat, inode_hash_func, inode_compare_func, free); diff --git a/src/basic/stat-util.h b/src/basic/stat-util.h index c261014cd29..939a0fc398d 100644 --- a/src/basic/stat-util.h +++ b/src/basic/stat-util.h @@ -122,6 +122,7 @@ int xstatfsat(int dir_fd, const char *path, struct statfs *ret); usec_t statx_timestamp_load(const struct statx_timestamp *ts) _pure_; nsec_t statx_timestamp_load_nsec(const struct statx_timestamp *ts) _pure_; +/* This compares inode number, backing device and inode type, but not modification info */ void inode_hash_func(const struct stat *q, struct siphash *state); int inode_compare_func(const struct stat *a, const struct stat *b); extern const struct hash_ops inode_hash_ops;