There are two types of locking that need to be performed by an SMB server.
The first is
record locking
that allows a client to lock
a range of bytes in an open file. The second is the
deny modes
that are specified when a file is open.
Record locking semantics under UNIX are very different from record locking under
Windows. Versions of Samba before 2.2 have tried to use the native fcntl() UNIX
system call to implement proper record locking between different Samba clients.
This cannot be fully correct for several reasons. The simplest is
that a Windows client is allowed to lock a byte range up to 2^32 or 2^64,
depending on the client OS. The UNIX locking only supports byte ranges up to 2^31.
So it is not possible to correctly satisfy a lock request above 2^31. There are
many more differences, too many to be listed here.
Samba 2.2 and above implement record locking completely independently of the
underlying UNIX system. If a byte-range lock that the client requests happens
to fall into the range of 0 to 2^31, Samba hands this request down to the UNIX system.
No other locks can be seen by UNIX, anyway.
Strictly speaking, an SMB server should check for locks before every read and write call on
a file. Unfortunately, with the way fcntl() works, this can be slow and may overstress
the
rpc.lockd
. This is almost always unnecessary because clients are
independently supposed to make locking calls before reads and writes if locking is
important to them. By default, Samba only makes locking calls when explicitly asked
to by a client, but if you set
strict locking = yes, it
will make lock checking calls on
every
read and write call.
You can also disable byte-range locking completely by using
locking = no.
This is useful for those shares that do not support locking or do not need it
(such as CD-ROMs). In this case, Samba fakes the return codes of locking calls to
tell clients that everything is okay.
The second class of locking is the
deny modes
. These
are set by an application when it opens a file to determine what types of
access should be allowed simultaneously with its open. A client may ask for
DENY_NONE , DENY_READ ,
DENY_WRITE , or DENY_ALL . There are also special compatibility
modes called DENY_FCB and DENY_DOS .
|