inode numbers are expected to be positive. Casting them to a signed type may result in printing negative values. E.g. running example program on the following file: $ ls -li test.txt 9280843260537405888 -r--r--r-- 1 kbukin hardware 300 Jul 21 06:36 test.txt resutls in the following output: $ ./example test.txt ID of containing device: [0,480] File type: regular file I-node number: -9165900813172145728 Mode: 100444 (octal) Link count: 1 Ownership: UID=2743 GID=30 Preferred I/O block size: 32768 bytes File size: 300 bytes Blocks allocated: 8 Last status change: Tue Jul 21 06:36:50 2020 Last file access: Sat Sep 12 14:13:38 2020 Last file modification: Tue Jul 21 06:36:50 2020 Such erroneous reporting happens for inode values greater than maximum value which can be stored in signed long. Printing inode as unsigned long long fixes the issue. --- man2/stat.2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/man2/stat.2 b/man2/stat.2 index 7e5417480..82eaefcda 100644 --- a/man2/stat.2 +++ b/man2/stat.2 @@ -681,7 +681,7 @@ main(int argc, char *argv[]) default: printf("unknown?\en"); break; } - printf("I\-node number: %ld\en", (long) sb.st_ino); + printf("I\-node number: %llu\en", (unsigned long long) sb.st_ino); printf("Mode: %lo (octal)\en", (unsigned long) sb.st_mode); -- 2.17.0