]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
tools/nolibc: handle all major and minor numbers in makedev() and friends
authorThomas Weißschuh <linux@weissschuh.net>
Sat, 4 Apr 2026 08:08:22 +0000 (10:08 +0200)
committerThomas Weißschuh <linux@weissschuh.net>
Sat, 4 Apr 2026 08:29:02 +0000 (10:29 +0200)
Remove the limitation of only handling small major and minor numbers.

Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
Acked-by: Willy Tarreau <w@1wt.eu>
Link: https://patch.msgid.link/20260404-nolibc-makedev-v2-5-456a429bf60c@weissschuh.net
tools/include/nolibc/sys/sysmacros.h
tools/testing/selftests/nolibc/nolibc-test.c

index 347a95341ea253b1d98c3f2ffb08bee4869f442b..ff9dd85ca59cb08efbb87642c0ad1bbe091c11fe 100644 (file)
 
 #include "../std.h"
 
-/* WARNING, it only deals with the 4096 first majors and 256 first minors */
 static __inline__ dev_t __nolibc_makedev(unsigned int maj, unsigned int min)
 {
-       return ((maj & 0xfff) << 8) | (min & 0xff);
+       return (((dev_t)maj & ~0xfff) << 32) | ((maj & 0xfff) << 8) |
+              (((dev_t)min & ~0xff) << 12) | (min & 0xff);
 }
 
 #define makedev(maj, min) __nolibc_makedev(maj, min)
 
 static __inline__ unsigned int __nolibc_major(dev_t dev)
 {
-       return (dev >> 8) & 0xfff;
+       return ((dev >> 32) & ~0xfff) | ((dev >> 8) & 0xfff);
 }
 
 #define major(dev) __nolibc_major(dev)
 
 static __inline__ unsigned int __nolibc_minor(dev_t dev)
 {
-       return dev & 0xff;
+       return ((dev >> 12) & ~0xff) | (dev & 0xff);
 }
 
 #define minor(dev) __nolibc_minor(dev)
index 88d076f67402e9efc3f2ba39aec065feda3c4b0c..7606a8b68d28b11f827453dc491abb59c8ad8754 100644 (file)
@@ -1684,6 +1684,9 @@ int run_stdlib(int min, int max)
                CASE_TEST(makedev);                 EXPECT_EQ(1, makedev(0x12, 0x34), 0x1234); break;
                CASE_TEST(major);                   EXPECT_EQ(1, major(0x1234), 0x12); break;
                CASE_TEST(minor);                   EXPECT_EQ(1, minor(0x1234), 0x34); break;
+               CASE_TEST(makedev_big);             EXPECT_EQ(1, makedev(0x11223344, 0x55667788), 0x1122355667734488); break;
+               CASE_TEST(major_big);               EXPECT_EQ(1, major(0x1122355667734488), 0x11223344); break;
+               CASE_TEST(minor_big);               EXPECT_EQ(1, minor(0x1122355667734488), 0x55667788); break;
 
                case __LINE__:
                        return ret; /* must be last */