[Samba] File locking problems

Jeremy Allison jra at samba.org
Thu May 19 16:05:14 GMT 2005


On Thu, May 19, 2005 at 02:13:33PM +0200, malcolm wrote:
> I have been writing some code to perform portable file locking between Linux 
> and Windows. On Windows I use UnlockFileEx() and Linux fcntl(). To get over 
> the incompatibilites between these calls, I use the calls to lock the first 
> two bytes of the file with a read lock. The first byte is regarded as meaning 
> that the file is read locked and the second byte that the file is write 
> locked. The Linux side is routine but the Windows side is somewhat more 
> difficult. If I want a read lock I test if I can get a write lock on the 
> second byte. If successful then I release the lock obtained and set a read 
> lock on the first byte. To obtain a write lock, I test whether I can set a 
> write lock on both bytes, release this write lock and set a read lock on the 
> second byte.
> 
> This works correctly for a samba share for the cases when client 1 and client 
> 2 are either both Linux or both Windows, or client 1 is Linux and client 2 is 
> Windows. But if the order is changed and client 1 is Windows and client 2 is 
> Linux, the open() call on Linux fails with EAGAIN. So I tried putting the 
> open() call in a "for ( tries = 0 ; tries  < 100 : tries++ )" loop with a 
> wait of usleep( 100 ) after each open() attempt. And bingo, this works with 
> about 4 or 5 loops. Untill I discovered that when the delay between starting 
> client 1 (Windows) and client 2 (Linux) is more than a couple of minutes 
> (rather than seconds) then the open loop usually fails even after 1000 
> iterations.
> 
> In smb.conf I have:
> 	locking = Yes
>         posix locking = Yes
>         strict locking = No
>         kernel oplocks = Yes
>         blocking locks = No

If you want byte range locks seen between Windows and Linux clients
you must *TURN OFF* all oplocks. Nothing else will work.

Jeremy.


More information about the samba mailing list