From 1748853700551fcea8e68047621fa9cffff904eb Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 1 Apr 2022 14:21:44 +0200 Subject: [PATCH] hash-funcs: tweak odering in devt_compare_func() Let's order dev_t's by their major first, minor secondary. The binary encoding of the two fields is weirdly interleaved and different in kernel and glibc, hence let's focus on the generic part that works like users would expect it. So far the function is only used to compare for equality, not for sorting, hence this has no immediate effect. --- src/basic/hash-funcs.c | 10 ++++++++-- src/basic/hash-funcs.h | 7 +++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/basic/hash-funcs.c b/src/basic/hash-funcs.c index 084ed0c0a2..6addb76f1b 100644 --- a/src/basic/hash-funcs.c +++ b/src/basic/hash-funcs.c @@ -102,10 +102,16 @@ DEFINE_HASH_OPS(uint64_hash_ops, uint64_t, uint64_hash_func, uint64_compare_func void devt_hash_func(const dev_t *p, struct siphash *state) { siphash24_compress(p, sizeof(dev_t), state); } +#endif int devt_compare_func(const dev_t *a, const dev_t *b) { - return CMP(*a, *b); + int r; + + r = CMP(major(*a), major(*b)); + if (r != 0) + return r; + + return CMP(minor(*a), minor(*b)); } DEFINE_HASH_OPS(devt_hash_ops, dev_t, devt_hash_func, devt_compare_func); -#endif diff --git a/src/basic/hash-funcs.h b/src/basic/hash-funcs.h index 023cfdf530..c537c6af7e 100644 --- a/src/basic/hash-funcs.h +++ b/src/basic/hash-funcs.h @@ -102,10 +102,9 @@ extern const struct hash_ops uint64_hash_ops; * 64bit archs. Yuck! */ #if SIZEOF_DEV_T != 8 void devt_hash_func(const dev_t *p, struct siphash *state) _pure_; -int devt_compare_func(const dev_t *a, const dev_t *b) _pure_; -extern const struct hash_ops devt_hash_ops; #else #define devt_hash_func uint64_hash_func -#define devt_compare_func uint64_compare_func -#define devt_hash_ops uint64_hash_ops #endif + +int devt_compare_func(const dev_t *a, const dev_t *b) _pure_; +extern const struct hash_ops devt_hash_ops;