Hello,
I am trying to work out the file locking mechanism on our Samba server when
connecting from Linux clients. I am getting some strange behaviour in a
mixed Linux/Windows environment when multiple clients open/lock the same
file for writing. Everything seems fine when a Windows client creates the
lock, but if a Linux client creates the lock, we get either two or more
Linux clients being able to open the same file for writing (SMBFS) or the
other extreme, if one Linux client opens the file none of the others can't
even open it in read-only mode (CIFS). The main application used on the
network is OpenOffice2.
I have been doing some testing using the cifs and smbfs kernel modules on
one FC4 and one Debian client (both 2.6 kernels), plus a Windows 2000
machine.
I used a simple test program that opens a file on a mounted Samba share and
tries to set a write lock.
I noticed that depending on the client I use Samba creates a different kind
of lock with different behaviour when multiple clients attempt to open the
same file. Neither smbfs nor cifs create the correct lock share mode
(DENY_WRITE) and the access mode is different (smbfs:0x3, cifs:0x12019f as
opposed to Windows: 0x2019f)
Is there any way we can manipulate the share mode and access mode that is
being created with the lock, e.g. with some mount options?
Thanks for any help.
Matt
CIFS:
Client1:
mount -t cifs -o username=user1,rw,dir_mode=0777,file_mode=0777
//server/corp /network/corp
Client2:
mount -t cifs -o username=user2,rw,dir_mode=0777,file_mode=0777
//server/corp /network/corp
smbstatus:
21757 DENY_NONE 0x12019f RDWR NONE
/opt/samba/corporate/flt.ods Mon May 22 13:43:50 2006
21757 DENY_NONE 0x12019f RDWR NONE
/opt/samba/corporate/flt.ods Mon May 22 13:43:44 2006
Behaviour: First client opens file read/write, second client cannot set
write lock (ok).
SMBFS:
Client1:
mount -t smbfs -o username=user1,rw,dmask=777,fmask=777 //server/corp
/network/corp
Client2:
mount -t smbfs -o username=user1,rw,dmask=777,fmask=777 //server/corp
/network/corp
smbstatus:
22587 DENY_NONE 0x3 RDWR NONE
/opt/samba/corporate/flt.ods Mon May 22 14:16:40 2006
23034 DENY_NONE 0x3 RDWR NONE
/opt/samba/corporate/flt.ods Mon May 22 14:16:11 2006
WINDOWS 2000:
- Open OpenOffice file
smbstatus:
5106 DENY_WRITE 0x2019f RDWR EXCLUSIVE+BATCH
/opt/samba/corporate/flt.ods Mon May 22 16:07:25 2006
Simple Test Program:
int main()
{
struct flock lock;
char input[80];
// open read-only mode first
int fd = open("/network/corp/flt.ods", O_RDWR );
if ( fd != -1 )
{
printf("File opened.\n");
// try to lock the entire file
lock.l_type = F_WRLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0;
// request a write lock
int fnctlres = fcntl(fd, F_SETLK, &lock);
// check if we got granted the lock
if ( fnctlres == -1)
{
printf("Could not set write lock.\n");
}
else
{
printf("File successfully locked for
writing.\n");
}
printf("Press a key.\n");
scanf("%s", input);
lock.l_type=F_UNLCK;
fcntl(fd, F_SETLK, &lock);
close(fd);
}
else
{
printf("Error.\n");
}
}
Extract from smb.conf
=================
...
posix locking = yes
strict locking = yes
share modes = yes
debug level = 7
unix extensions = yes
ea support = yes
...
#============================ Share Definitions
=============================
...
[corporate]
comment = Corporate Files
path = /opt/samba/corporate
public = no
guest ok = no
writable = yes
browseable = yes
share modes = yes
create mask = 0777
...