[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: use of "stat -"



On 12.05.2020 16:19, Wei Liu wrote:
> On Tue, May 12, 2020 at 12:58:46PM +0200, Jan Beulich wrote:
>> now that I've been able to do a little bit of work from the office
>> again, I've run into a regression from b72682c602b8 "scripts: Use
>> stat to check lock claim". On one of my older machines I've noticed
>> guests wouldn't launch anymore, which I've tracked down to the
>> system having an old stat on it. Yes, the commit says the needed
>> behavior has been available since 2009, but please let's not forget
>> that we continue to support building with tool chains from about
>> 2007.
>>
>> Putting in place and using newer tool chain versions without
>> touching the base distro is pretty straightforward. Replacing the
>> coreutils package isn't, and there's not even an override available
>> by which one could point at an alternative one. Hence I think
>> bumping the minimum required versions of basic tools should be
>> done even more carefully than bumping required tool chain versions
>> (which we've not dared to do in years). After having things
>> successfully working again with a full revert, I'm now going to
>> experiment with adapting behavior to stat's capabilities. Would
>> something like that be acceptable (if it works out)?
> 
> Are you asking for reverting that patch?

Well, I assume the patch has its merits, even if I don't really
understand what they are from its description. I'm instead asking
whether something like the below (meanwhile tested) would be
acceptable.

Jan

--- unstable.orig/tools/hotplug/Linux/locking.sh
+++ unstable/tools/hotplug/Linux/locking.sh
@@ -42,6 +42,12 @@ claim_lock()
     # it being possible to safely remove the lockfile when done.
     # See below for a correctness proof.
     local stat
+    local use_stat
+    local rightfile
+    if stat - 2>/dev/null >/dev/null
+    then
+        use_stat=y
+    fi
     while true; do
         eval "exec $_lockfd<>$_lockfile"
         flock -x $_lockfd || return $?
@@ -56,7 +62,17 @@ claim_lock()
         # WW.XXX
         # YY.ZZZ
         # which need to be separated and compared.
-        if stat=$( stat -L -c '%D.%i' - $_lockfile 0<&$_lockfd 2>/dev/null )
+        if [ x$use_stat != xy ]
+        then
+            # Fall back to the original Perl approach.
+            rightfile=$( perl -e '
+                open STDIN, "<&'$_lockfd'" or die $!;
+                my $fd_inum = (stat STDIN)[1]; die $! unless defined $fd_inum;
+                my $file_inum = (stat $ARGV[0])[1];
+                print "y\n" if $fd_inum eq $file_inum;
+                                 ' "$_lockfile" )
+            if [ x$rightfile = xy ]; then break; fi
+        elif stat=$( stat -L -c '%D.%i' - $_lockfile 0<&$_lockfd 2>/dev/null )
         then
             local file_stat
             local fd_stat





 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.