[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [xen-unstable test] 13461: regressions - FAIL
Daniel P. Berrange writes ("Re: [Xen-devel] [xen-unstable test] 13461: regressions - FAIL"): > Yes, as you say flock() operates on the inode, so if something deletes > and recreates the file, future flocks will operate differently. Ideally > you should just never rm the files at all. > > If you need to 'rm' them, then to avoid this, you must do two things > > - Only 'rm /foo' while holding the lock on /foo > - Record the inode before acquiring the lock. After acquiring the > lock check whether the inode on disk is the same. If not, > release the lock & repeat. It seems more logical to me to check the inum of the open fd against the file. Something like this perhaps (untested): diff -r ad08cd8e7097 tools/hotplug/Linux/locking.sh --- a/tools/hotplug/Linux/locking.sh Thu Jul 05 11:00:28 2012 +0100 +++ b/tools/hotplug/Linux/locking.sh Thu Jul 05 11:39:59 2012 +0100 @@ -30,6 +30,7 @@ _setlockfd() done _lockdict[$i]="$1" let _lockfd=200+i + let _lockfile="$LOCK_BASEDIR/$1" } @@ -37,13 +38,32 @@ claim_lock() { mkdir -p "$LOCK_BASEDIR" _setlockfd $1 - eval "exec $_lockfd>>$LOCK_BASEDIR/$1" - flock -x $_lockfd + # The locking strategy is identical to that from with-lock-ex(1) + # from chiark-utils, except using flock. It has the benefit of + # it being possible to safely remove the lockfile when done. + local rightfile + while true; do + eval "exec $_lockfd>>$lockfile" + flock -x $_lockfd + # We can't just stat /dev/stdin or /proc/self/fd/$_lockfd or + # use bash's test -ef because those all go through what is + # actually a synthetic symlink in /proc and we aren't + # guaranteed that our stat(2) won't lose the race with an + # rm(1) between reading the synthetic link and traversing the + # file system to find the inum. Perl is very fast so use that. + 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 + done } release_lock() { _setlockfd $1 - flock -u $_lockfd + rm "$_lockfile" } Ian. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |