[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [xen-unstable test] 13461: regressions - FAIL
On Thu, 2012-07-05 at 11:40 +0100, Ian Jackson wrote: > 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" you mean $_lockfile here I think. > + 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 ' Won't this need to become $(PERL) (or @PERL@ and some seddery at install time) for the benefit of BSD? Does stating $_lockfile before and after the flock, in addition to comparing both with $_lockfd, close the race you are worried about? > + 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" I suppose there is no point in unlocking too? > } > > Ian. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |