https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=277804
Bug ID: 277804
Summary: stat(2) on UFS volumes reports wrong st_dev (devid)
when run through Linux compat layer
Product: Base System
Version: 15.0-CURRENT
Hardware: Any
OS: Any
Status: New
Severity: Affects Some People
Priority: ---
Component: bin
Assignee: [email protected]
Reporter: [email protected]
This is a upstream report of
https://lists.gnu.org/archive/html/bug-coreutils/2024-03/msg00045.html.
Broken down we have the following problem:
Consider this simple C program:
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <unistd.h>
> #include <stdio.h>
> #include <string.h>
>
> int main(int argc, char *argv[]) {
> char *fs = argv[1];
> struct stat sb;
> if (!stat(fs, &sb)) {
> int major = major(sb.st_dev);
> int minor = minor(sb.st_dev);
> printf("%s:%ld, major: %d, minor: %d\n", fs, sb.st_dev, major,
> minor);
> }
> return 0;
> }
Compile it once on FreeBSD and Linux and run both on FreeBSD with the following
UFS volumes mounted (not reproducible with ZFS or NFS mounts):
> $ df -t ufs
> Filesystem 1K-blocks Used Avail Capacity Mounted on
> /dev/da0p2 2031132 629168 1239476 34% /
> /dev/da0p4 4053308 245928 3483116 7% /tmp
> /dev/da0p5 4053308 864504 2864540 23% /var
> /dev/da0p6 8106716 798660 6659520 11% /var/tmp
> /dev/da0p7 12180252 7877268 3328564 70% /usr
> /dev/gvinum/local 24360604 16555848 5855908 74% /usr/local
> /dev/gvinum/ports 48741436 23930092 20912032 53% /usr/ports
> /dev/gvinum/obj 20307196 15515764 3166860 83% /usr/obj
> /dev/gvinum/pgsql 32487548 5266684 24621864 18% /usr/local/pgsql
> /dev/gvinum/nexus2 32487548 13744292 16144256 46% /var/nexus2
> /dev/gvinum/svn 8106716 5183236 2274944 69% /var/svn
> /dev/gvinum/osipovmi 30450780 21861900 6152820 78% /var/osipovmi
> /dev/gvinum/poudriere 64995324 37001360 22794340 62% /var/poudriere
> /dev/gvinum/compat 4053308 984876 2744168 26% /compat
> /dev/gvinum/bastille 81249212 59453292 15295984 80%
> /usr/local/bastille
FreeBSD executable:
> $ df -t ufs | cut -f 6 -w | sed 1d | xargs -I% ./stat-freebsd %
> /:108, major: 0, minor: 108
> /tmp:110, major: 0, minor: 110
> /var:111, major: 0, minor: 111
> /var/tmp:112, major: 0, minor: 112
> /usr:113, major: 0, minor: 113
> /usr/local:161, major: 0, minor: 161
> /usr/ports:142, major: 0, minor: 142
> /usr/obj:141, major: 0, minor: 141
> /usr/local/pgsql:140, major: 0, minor: 140
> /var/nexus2:162, major: 0, minor: 162
> /var/svn:163, major: 0, minor: 163
> /var/osipovmi:164, major: 0, minor: 164
> /var/poudriere:166, major: 0, minor: 166
> /compat:165, major: 0, minor: 165
> /usr/local/bastille:139, major: 0, minor: 139
now the Linux executable:
> $ file stat-linux
> stat-linux: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically
> linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32,
> BuildID[sha1]=4f0f500b4e20d2a43770db4afa7e94c834d8ccca, not stripped
> $ df -t ufs | cut -f 6 -w | sed 1d | xargs -I% ./stat-linux %
> /:108, major: 0, minor: 108
> /tmp:165, major: 0, minor: 165
> /var:165, major: 0, minor: 165
> /var/tmp:112, major: 0, minor: 112
> /usr:165, major: 0, minor: 165
> /usr/local:161, major: 0, minor: 161
> /usr/ports:142, major: 0, minor: 142
> /usr/obj:141, major: 0, minor: 141
> /usr/local/pgsql:140, major: 0, minor: 140
> /var/nexus2:162, major: 0, minor: 162
> /var/svn:163, major: 0, minor: 163
> /var/osipovmi:164, major: 0, minor: 164
> /var/poudriere:166, major: 0, minor: 166
> /compat:165, major: 0, minor: 165
> /usr/local/bastille:139, major: 0, minor: 139
So if you use df(1) from /compat/linux those incorrectly FS are omitted:
> $ /compat/linux/usr/bin/linux-df -a -B 512 -P -t ufs -T
> Dateisystem Typ 512-Blöcke Benutzt Verfügbar Kapazität
> Eingehängt auf
> /dev/da0p2 ufs 4062264 1258336 2478952 34% /
> /dev/da0p4 ufs 8106616 1969752 5488336 27% /tmp
> /dev/da0p5 - - - - - /var
> /dev/da0p6 ufs 16213432 1597320 13319040 11% /var/tmp
> /dev/da0p7 - - - - - /usr
> /dev/gvinum/local ufs 48721208 33111696 11711816 74% /usr/local
> /dev/gvinum/ports ufs 97482872 47860184 41824064 54% /usr/ports
> /dev/gvinum/obj ufs 40614392 31031528 6333720 84% /usr/obj
> /dev/gvinum/pgsql ufs 64975096 10533368 49243728 18%
> /usr/local/pgsql
> /dev/gvinum/nexus2 ufs 64975096 27488584 32288512 46%
> /var/nexus2
> /dev/gvinum/svn ufs 16213432 10366472 4549888 70% /var/svn
> /dev/gvinum/osipovmi ufs 60901560 43723800 12305640 79%
> /var/osipovmi
> /dev/gvinum/poudriere ufs 129990648 74002720 45588680 62%
> /var/poudriere
> /dev/gvinum/compat - - - - - /compat
> /dev/gvinum/bastille ufs 162498424 118906584 30591968 80%
> /usr/local/bastille
This can be reproduced with 13-STABLE:
FreeBSD deblndw011x.ad001.siemens.net 13.3-STABLE FreeBSD 13.3-STABLE 77814c959
GENERIC amd64
and on 15-STABLE:
FreeBSD deblndw013x5v.ad001.siemens.net 15.0-CURRENT FreeBSD 15.0-CURRENT #0
main-n268454-9097284b98be: Thu Feb 22 03:00:34 UTC 2024
[email protected]:/usr/obj/usr/src/amd64.amd64/sys/GENERIC amd64
I assume the bug is somewhere here:
*
https://github.com/freebsd/freebsd-src/blob/e29be07861173f87b2dd46db1d0c7cbcf72d4ad0/sys/compat/linux/linux_stats.c#L707
* https://github.com/freebsd/freebsd-src/blob/main/sys/compat/linux/linux.h#L55
--
You are receiving this mail because:
You are the assignee for the bug.