Inode number and file size problems in version 3.2.1

Ken Brown kbrown@cornell.edu
Thu Jul 1 16:21:48 GMT 2021


On 7/1/2021 8:15 AM, Ruurd Beerstra via Cygwin wrote:
> Hi,
> 
> I am a long-time user and fan of Cygwin.
> I use it in a complex build environment of my IVT SSH terminal emulator, some 
> 300.000 lines of C-code with lots of little shell-scripts to build and check.
> I use flex/bison, ctags, make, gawk, grep and a bunch of other Cygwin utilities.
> 
> I bought a new PC and decided to to a clean-install of Cygwin to make sure I had 
> the latest version of everything.
> I ran into various problems, which after checking I found to be bugs in Cygwin 
> (a first for me). So I'm reporting them here.
> 
> The first problem I ran into was that multiple-pipe commands would hang. A 
> command like this in a CMD file:
> 
> grep -E "^RUNCMD=|^MAKE=" makefile | sed -e "s/RUNCMD=//" -e "s/^MAKE=/set &/" > 
> %TEMP%\extra.bat
> 
> would hang. So would stuff like "cat ... | sort | uniq" style commands that I 
> use a lot.
> I found a patch (cygwin1-20210426.dll) with an updated cygwin1.dll. That fixed 
> the hangs.
> 
> My 'uname -r' now reports 3.2.1s(0.340/5/3)
> 
> But then one of my scripts ran into a weird problem:
> 
> mv: 'allfcn.f.tmp' and 'allfcn.f' are the same file
> gmake: *** [../make.w32:438: allfcn.f] Error 1
> 
> This is produced by this bit of code:
> 
> gawk -F~ -v outfile=$2 -f ../tools/format.awk
> tr -d '\r' < $2 > $2.tmp
> mv $2.tmp $2
> 
> Where $2 is "alfcn.f". The GAWK produces a nicely formatted file "allfcn.f", 
> which contains unwanted \r characters which are removed by the 'tr' command.
> This has worked for 20+ years this way. The 'mv' complains that the source and 
> target are the same. Using ls -i  I see this weirdness:
> 
> i:\ivt\work>ls -li allfcn*
> 281474977027142 -rw-r--r--+ 1 ruurd ruurd 8192 Jul  1 12:30 allfcn.f
> 281474977027142 -rw-r--r--+ 1 ruurd ruurd 8192 Jul  1 12:30 allfcn.f.tmp
> 
> The inode numbers are the same!  Which is why it thinks the files are the same. 
> Using 'cmp' on them tells me they differ, though.
> So I insert an 'rm' command of the TMP file and that problem goes away (though 
> it didn't sit well with me that the file size is exactly 8KB for both files, as 
> reported by ls).
> 
> But then the build complained again:
> 
> The following keywords are NOT documented in doc/all*.e:
> See file undoc.keywords
> gmake: *** [../make.w32:272: ivt.exe] Error 1
> 
> That is produced by this bit of code which warns me if I introduce a new feature 
> in IVT without documenting it:
> 
> if [[ -s undoc.keywords ]]
> then
>     echo "The following keywords are NOT documented in doc/all*.e:"
>     cat undoc.keywords
>     echo "See file undoc.keywords"
>     Failure
> fi
> 
> So I look at the file:
> 
> i:\ivt>ls -l undoc.keywords
> -rw-r--r--+ 1 ruurd ruurd 8192 Jul  1 13:05 undoc.keywords
> 
> Hmm: Same 8KB again? That file is supposed to be 0 bytes! Check with DIR:
> 
> i:\ivt>dir undoc.keywords
>   Volume in drive I is Windows
>   Volume Serial Number is 2237-3266
> 
>   Directory of i:\ivt
> 
> 01/07/2021  13:11                 0 undoc.keywords
>                 1 File(s)              0 bytes
>                 0 Dir(s)  383.936.823.296 bytes free
> 
> It IS zero bytes!  But Cygwin shows it as 8KB, which is why the "-s" operator 
> says the file is not empty.
> 
> i:\ivt>stat undoc.sh
>    File: undoc.sh
>    Size: 8192            Blocks: 8          IO Block: 65536 regular file
> Device: 22373266h/574042726d    Inode: 281474977027142  Links: 1
> Access: (0700/-rwx------)  Uid: (197609/   ruurd)   Gid: (197609/   ruurd)
> Access: 2021-07-01 13:12:46.247988400 +0200
> Modify: 2021-07-01 13:05:55.035592600 +0200
> Change: 2021-07-01 13:05:55.035592600 +0200
>   Birth: 2021-06-30 13:59:31.554377500 +0200
> 
> Hmm. Again, the EXACT same inode number as with the earlier problem, the same 
> 8KB size.
> I restored my original Cygwin setup from the old laptop (as c:\Cygwin64.old) and 
> use the commands from there on the same file:
> 
> i:\ivt>stat undoc.keywords
> 
>    File: undoc.keywords
>    Size: 8192            Blocks: 8          IO Block: 65536 regular file
> Device: 22373266h/574042726d    Inode: 281474977027142  Links: 1
> Access: (0644/-rw-r--r--)  Uid: (197609/   ruurd)   Gid: (197609/   ruurd)
> Access: 2021-07-01 13:58:23.261901700 +0200
> Modify: 2021-07-01 13:43:34.833286000 +0200
> Change: 2021-07-01 13:43:34.833286000 +0200
>   Birth: 2021-06-30 13:59:31.554377500 +0200
> 
> i:\ivt>c:\cygwin64.old\bin\stat undoc.keywords
>    File: undoc.keywords
>    Size: 0               Blocks: 0          IO Block: 65536 regular empty file
> Device: 22373266h/574042726d    Inode: 1970324837303561  Links: 1
> Access: (0644/-rw-r--r--)  Uid: (197609/   ruurd)   Gid: (197609/   ruurd)
> Access: 2021-07-01 13:11:03.478267900 +0200
> Modify: 2021-07-01 13:11:03.478267900 +0200
> Change: 2021-07-01 13:11:03.478267900 +0200
>   Birth: 2021-07-01 13:06:51.255125100 +0200
> 
> Note the wrong (changing) times when I use the current 'stat' (the first output 
> is not the same as the 2nd one), while the old version consistently reports 
> correct times, size and inode number. A quick test shows that the 'ls' command 
> (I assume caused by the underlying stat(2) call) reports the same inode number 
> for ALL files.
> It also reports either a size of "0" or 8192 for ALL files.

Can you tell us something about i:\ivt so that someone could try to reproduce 
the problem?  What kind of drive is i:?  Does the path "i:\ivt" by any chance 
involve native symlinks or junctions?

Ken


More information about the Cygwin mailing list