bug#69873: df(1) does not display all UFS mountpoints as valid on FreeBSD

2024-03-18 Thread Osipov, Michael (IN IT IN)
Disclaimer: I am not 100% certain whether this is a bug in GNU coreutils 
or FreeBSD Linux emulation layer because the behavior is weird. So, 
please bear with me.


Consider the following output on FreeBSD 13 from FreeBSD's df(1):

$ df -t ufs -b -T -a
Filesystem Type 512-blocks  UsedAvail Capacity  Mounted on
/dev/da0p2 ufs 4062264   1258336  247895234%/
/dev/da0p4 ufs 8106616279080  7179008 4%/tmp
/dev/da0p5 ufs 8106616   1727528  573056023%/var
/dev/da0p6 ufs16213432   1597320 1331904011%/var/tmp
/dev/da0p7 ufs24360504  15754536  665712870%/usr
/dev/gvinum/local  ufs48721208  33111696 1171181674%/usr/local
/dev/gvinum/ports  ufs97482872  47860184 4182406453%/usr/ports
/dev/gvinum/objufs40614392  31031528  633372083%/usr/obj
/dev/gvinum/pgsql  ufs64975096  10500360 4927673618%
/usr/local/pgsql
/dev/gvinum/nexus2 ufs64975096  27488304 3228879246%/var/nexus2
/dev/gvinum/svnufs16213432  10366472  454988869%/var/svn
/dev/gvinum/osipovmi   ufs60901560  43723800 1230564078%
/var/osipovmi
/dev/gvinum/poudriere  ufs   129990648  74002720 4558868062%
/var/poudriere
/dev/gvinum/compat ufs 8106616   1969752  548833626%/compat
/dev/gvinum/bastille   ufs   162498424 117560720 3193783279%
/usr/local/bastille

and

$ df -t ufs -b -T -a /dev/da0p7
Filesystem  Type 512-blocks Used   Avail Capacity  Mounted on
/dev/da0p7  ufs24360504 15754536 665712870%/usr


Now let's use df(1) from coreutils complied on FreeBSD:

$ gdf -a -B 512 -P  -t ufs
Dateisystem   512-Blöcke   Benutzt Verfügbar Kapazität Eingehängt auf
/dev/da0p2   4062264   1258336   2478952   34% /
/dev/da0p4   8106616279080   71790084% /tmp
/dev/da0p5   8106616   1727528   5730560   24% /var
/dev/da0p6  16213432   1597320  13319040   11% /var/tmp
/dev/da0p7  24360504  15754536   6657128   71% /usr
/dev/gvinum/local   48721208  33111696  11711816   74% /usr/local
/dev/gvinum/ports   97482872  47860184  41824064   54% /usr/ports
/dev/gvinum/obj 40614392  31031528   6333720   84% /usr/obj
/dev/gvinum/pgsql   64975096  10500488  49276608   18% /usr/local/pgsql
/dev/gvinum/nexus2  64975096  27488304  32288792   46% /var/nexus2
/dev/gvinum/svn 16213432  10366472   4549888   70% /var/svn
/dev/gvinum/osipovmi60901560  43723800  12305640   79% /var/osipovmi
/dev/gvinum/poudriere  129990648  74002720  45588680   62% /var/poudriere
/dev/gvinum/compat   8106616   1969752   5488336   27% /compat
/dev/gvinum/bastille   162498424 117560728  31937824   79% 
/usr/local/bastille

and

$ gdf -a -B 512 -P  -t ufs /dev/da0p7
Dateisystem512-Blöcke  Benutzt Verfügbar Kapazität Eingehängt auf
/dev/da0p7   24360504 15754536   6657128   71% /usr


So far so good. Now, I need to use a Linux application on FreeBSD which 
expect GNU df(1) in the Linux PATH, did install it and thought at first 
that this is a bug in the version I have installed, so I have compiled 
latest version on RHEL 7 and copied the executable to FreeBSD:

$ ./df  --version
df (GNU coreutils) 9.4
Copyright © 2023 Free Software Foundation, Inc.
Lizenz GPLv3+: GNU GPL Version 3 oder höher .
Dies ist freie Software: Sie können sie ändern und weitergeben.
Es gibt keinerlei Garantien, soweit wie es das Gesetz erlaubt.

Geschrieben von Torbjörn Granlund, David MacKenzie und Paul Eggert.
$ file ./df
./df: 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]=907caf0bb2d7ec27cfbe1f30e7bf63e11328631f, with debug_info, not 
stripped
$ file $(which gdf)
/usr/local/bin/gdf: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), 
dynamically linked, interpreter /libexec/ld-elf.so.1, for FreeBSD 13.2, 
FreeBSD-style, stripped


Now let's repeat the operation:

$ ./df -a -B 512 -P  -t ufs
Dateisystem   512-Blöcke   Benutzt Verfügbar Kapazität Eingehängt auf
/dev/da0p2   4062264   1258336   2478952   34% /
/dev/da0p4   8106616   1969752   5488336   27% /tmp
/dev/da0p5 - - - - /var
/dev/da0p6  16213432   1597320  13319040   11% /var/tmp
/dev/da0p7 - - - - /usr
/dev/gvinum/local   48721208  33111696  11711816   74% /usr/local
/dev/gvinum/ports   97482872  47860184  41824064   54% /usr/ports
/dev/gvinum/obj 40614392  31031528   6333720   84% /usr/obj 
/dev/gvinum/pgsql   64975096  10500360  49276736   18% /usr/local/pgsql

/dev/gvinum/nexus2 

bug#69873: Acknowledgement (df(1) does not display all UFS mountpoints as valid on FreeBSD)

2024-03-18 Thread Osipov, Michael (IN IT IN)
I did some more investigation with stat(2). Running native on FreeBSD 
with Python os package 'st_dev':

$ df  -t ufs | cut -f 6 -w | sed 1d | xargs -I% python ~/stat.py  %
/: 108
/tmp: 110
/var: 111
/var/tmp: 112
/usr: 113
/usr/local: 161
/usr/ports: 142
/usr/obj: 141
/usr/local/pgsql: 140
/var/nexus2: 162
/var/svn: 163
/var/osipovmi: 164
/var/poudriere: 166
/compat: 165
/usr/local/bastille: 139


Now with a modified version of GNU df(1) compiled on Linux, running on 
FreeBSD:

$ ./df -a -B 512 -P  -t ufs -T
/: 108
/tmp: 165
/var: 165
/var/tmp: 112
/usr: 165
/usr/local: 161
/usr/ports: 142
/usr/obj: 141
/usr/local/pgsql: 140
/var/nexus2: 162
/var/svn: 163
/var/osipovmi: 164
/var/poudriere: 166
/compat: 165
/usr/local/bastille: 139


One can clearly see that the dev ids do not match. There seems to be a 
bug in the layer. I will investigate on FreeBSD 15 and report upstream. 
Let's pause this one for a moment.