From: Lennart Poettering Date: Fri, 1 Apr 2022 12:21:44 +0000 (+0200) Subject: hash-funcs: tweak odering in devt_compare_func() X-Git-Tag: v251-rc2~204^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1748853700551fcea8e68047621fa9cffff904eb;p=thirdparty%2Fsystemd.git 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. --- diff --git a/src/basic/hash-funcs.c b/src/basic/hash-funcs.c index 084ed0c0a2a..6addb76f1b2 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 023cfdf5307..c537c6af7e8 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;