Re: flock in 2.20.1 can no longer lock the file it will execute

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

 



On Wednesday 16 November 2011 08:13:21 Karel Zak wrote:
> On Mon, Nov 14, 2011 at 01:23:38AM -0500, Mike Frysinger wrote:
> > i've been using a trick with flock to add locking to all of my shell
> > scripts.
> > 
> > basically, i take a lock on the shell script itself:
> > 	flock -eon ./test.sh ./test.sh
> > 
> > with <=util-linux-2.20, this has worked fine.  but starting with 2.20.1,
> > i now
> > 
> > get -ETXTBSY (on ext4, but i doubt that matters):
> > 	$ echo '#!/bin/sh' > test.sh
> > 	$ chmod a+rx test.sh
> > 	$ ./flock -eon ./test.sh ./test.sh
> > 	./flock: ./test.sh: Text file busy
> > 
> > the only commit made to flock.c between 2.20 and 2.20.1 is this:
> > 	commit 75aaee08f06b92d119ed827c53d1af5474eb16ff
> > 	flock: make flock(1) work on NFSv4
> > 
> > and indeed, reverting that made my life happy again.  reading the small
> > patch shows the obvious flaw: you can't open a file for O_RDWR and
> > attempt to execute it at the same time.
> 
>  Hmm... maybe we can add a new --read-write command line option for
>  NFS guys rather than be smart with access(). The regression is
>  unacceptable.

i wonder what happens if you attempt to take a read-only lock on nfs.  do you 
get back an error ?  or does it fail silently at runtime in the nfs layers ?

if the former, one solution might be to open the file, attempt to grab the 
lock, and if the flock() fails, retry the whole thing but with O_RDWR instead.

int rw_flags = O_RDONLY;
...
retry:
	... current open logic which uses new rw_flags var ...

	... if flock fails, and rw_flags == O_RDONLY, then set rw_flags to O_RDWR 
and jump back to retry ...
-mike

Attachment: signature.asc
Description: This is a digitally signed message part.


[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux