]> granicus.if.org Git - sysstat/commitdiff
Update non regression code to handle big minor numbers
authorSebastien GODARD <sysstat@users.noreply.github.com>
Fri, 24 Jul 2020 14:15:29 +0000 (16:15 +0200)
committerSebastien GODARD <sysstat@users.noreply.github.com>
Fri, 24 Jul 2020 14:15:29 +0000 (16:15 +0200)
Signed-off-by: Sebastien GODARD <sysstat@users.noreply.github.com>
ioconf.c
iostat.c
systest.c
systest.h

index 8f7566ae9ab4d4cebdef8786cb52b116405b1331..94af73566dfc62fb42adc7b125442621defc9639 100644 (file)
--- a/ioconf.c
+++ b/ioconf.c
@@ -489,8 +489,8 @@ char *transform_devmapname(unsigned int major, unsigned int minor)
                if (__stat(filen, &aux) == 0) {
                        /* Get its minor and major numbers */
 
-                       dm_major = major(aux.st_rdev);
-                       dm_minor = minor(aux.st_rdev);
+                       dm_major = __major(aux.st_rdev);
+                       dm_minor = __minor(aux.st_rdev);
 
                        if ((dm_minor == minor) && (dm_major == major)) {
                                strncpy(name, dp->d_name, sizeof(name));
index dcf23e2577661622ba87e1b82587397e0bab445e..8ef2249a18483793ef26e7c05980fd03402e30d2 100644 (file)
--- a/iostat.c
+++ b/iostat.c
@@ -318,8 +318,8 @@ int get_major_minor_nr(char filename[], int *major, int *minor)
        if (__stat(dfile, &statbuf) < 0)
                return -1;
 
-       *major = major(statbuf.st_rdev);
-       *minor = minor(statbuf.st_rdev);
+       *major = __major(statbuf.st_rdev);
+       *minor = __minor(statbuf.st_rdev);
 
        return 0;
 }
index 0f60d820111b2a07a346cb55b6460e211d7ca761..a83b30387db186f54cac311fa5a550378302ed4e 100644 (file)
--- a/systest.c
+++ b/systest.c
@@ -195,7 +195,7 @@ int virtual_stat(const char *name, struct stat *statbuf)
        int major, minor;
 
        if (!strcmp(name, VIRTUALHD)) {
-               statbuf->st_rdev = (253 << 8) + 2;
+               statbuf->st_rdev = (253 << MINORBITS) + 2;
                return 0;
        }
 
@@ -206,7 +206,7 @@ int virtual_stat(const char *name, struct stat *statbuf)
 
        if (fgets(line, sizeof(line), fp) != NULL) {
                sscanf(line, "%d %d", &major, &minor);
-               statbuf->st_rdev = (major << 8) + minor;
+               statbuf->st_rdev = (major << MINORBITS) + minor;
        }
 
        fclose(fp);
index c9ad26564a0cd5133ee2d09708494d370ca06bef..f1cdbcdd21c08a858c528c4dcc42f13988b8460b 100644 (file)
--- a/systest.h
+++ b/systest.h
 #include <sys/statvfs.h>
 #include <sys/stat.h>
 
+#ifndef MINORBITS
+#define MINORBITS      20
+#endif
+#define S_MAXMINOR     ((1U << MINORBITS) - 1)
+#define S_MAXMAJOR     ((1U << (32 - MINORBITS)) - 1)
+
 /* Test mode: Use alternate files and syscalls */
 #ifdef TEST
 
@@ -30,6 +36,8 @@
 #define __gettimeofday(m,n)    get_day_time(m)
 #define __getpwuid(m)          get_usrname(m)
 #define __fork(m)              get_known_pid(m)
+#define __major(m)             (m >> MINORBITS)
+#define __minor(m)             (m & S_MAXMINOR)
 
 #define ROOTDIR                "./tests/root"
 #define ROOTFILE       "root"
@@ -55,6 +63,8 @@
 #define __gettimeofday(m,n)    gettimeofday(m,n)
 #define __getpwuid(m)          getpwuid(m)
 #define __fork(m)              fork(m)
+#define __major(m)             major(m)
+#define __minor(m)             minor(m)
 
 #endif