oplocks and queued messages

Jeremy Allison jallison at whistle.com
Tue Mar 31 19:10:25 GMT 1998


John Gregson wrote:
> 
> Hi,
> 
> This is not really a bug-report but I thought you may be interested in a
> problem that hit us when using oplocks. We have solved it by changing
> Samba slightly and have subsequently discovered that NT 4 acts in the
> same respect as our change (superficially at least).
> 
> We have a share (say data) and applications access this share at user
> login. We see that the following occurs when there are two opens on the
> file software.ini on the share data.
> 
> The first open asks for and gets an oplock on software.ini.
> 
> The second open asks for an oplock.
> 
> The server then sends a Locking_andX message to break the oplock for the
> first open.
> 
> The client then sends a Trans2 message to get file system information.
> 
> Now at this stage a deadlock occurs as Samba now queues this message as
> it is in an oplock break state; however it never gets the oplock break
> reply from the client as it (the client) seems to be waiting for the
> reply to the Trans2.
> 
> If we change the flags for the Trans2 message to exclude the
> QUEUE_IN_OPLOCK flag the the problem goes away. The server sends the
> Trans2 reply and then receives the oplock break reply from the client.
> 
> I can guess the reasoning behind the QUEUE_IN_OPLOCK flag for the Trans2
> message but interestingly we ran the same test with NT serving the share
> and saw that it also sent the Trans2 reply before receiving the oplock
> break reply.
> 
> I must admit that we haven't tested our change extensively but it's not
> caused us any problems so far.
> 
> Any comments/warnings?

John,

	Thanks for that bug report. I'm CC:ing the samba-technical
list on the reply as I think people on it will be interested in
the gory details :-).

It *is* a Samba bug - the QUEUE_IN_OPLOCK was added to
all trans2 calls as one of the trans2 calls allows a
file open (which would cause the deadlock that the
QUEUE_IN_OPLOCK code was added to prevent). As NT
never seems to issue the trans2 open calls your fix
will probably work correctly, but not with an
oplock-aware client that uses the trans2 open
call (not that I'm aware of any such client :-).

The correct fix is to remove the QUEUE_IN_OPLOCK
flag from the trans2 call (as you have done) but
also add code to ensure that a trans2 open call
is queued when smbd is in the oplock break state
- I'll add this to the main branch (and probably
the 1.9.18 branch code also).

Thanks a lot for the bug report,

Cheers,

	Jeremy Allison,
	Samba Team.


-- 
--------------------------------------------------------
Buying an operating system without source is like buying
a self-assembly Space Shuttle with no instructions.
--------------------------------------------------------


More information about the samba-technical mailing list