Getting Samba 3.6.12 and possibly 4.0.x to properly handle an OpLock Break in a compound request

Stefan (metze) Metzmacher metze at samba.org
Thu Mar 14 09:11:44 MDT 2013


Hi Richard,

>> The following ugly patch seems to allow Samba 3.6.12 to handle an
>> OpLock break in a compound request.
>>
>> Next up I have to see if not responding with a STATUS_PENDING response matters.
>>
>> -bash-4.0$ diff -up
>> build/cloudcc/build_x86_64/samba-3.6.12/source3/smbd/smb2_server.c
>> smb2_server.c
>> --- build/cloudcc/build_x86_64/samba-3.6.12/source3/smbd/smb2_server.c
>>  2013-03-13 21:18:24.839321028 -0700
>> +++ smb2_server.c       2013-03-13 21:14:09.827919858 -0700
>> @@ -930,6 +930,7 @@ NTSTATUS smbd_smb2_request_pending_queue
>>         struct iovec *outvec = NULL;
>>
>>         if (!tevent_req_is_in_progress(subreq)) {
>> +               DEBUG(10, ("Already in progress\n"));
>>                 return NT_STATUS_OK;
>>         }
>>
>> @@ -937,10 +938,17 @@ NTSTATUS smbd_smb2_request_pending_queue
>>         subreq = NULL;
>>
>>         if (req->async) {
>> +               DEBUG(10, ("Already async"));
>>                 /* We're already async. */
>>                 return NT_STATUS_OK;
>>         }
>>
>> +       if (req->smb1req && open_was_deferred_smb2(req->smb1req->sconn,
>> +                                               req->smb1req->mid)) {
>> +               DEBUG(10, ("Open Request was deferred ... doing nothing\n"));
>> +               return NT_STATUS_OK;
>> +       }
>> +
>>         if (req->in.vector_count > i + 3) {
>>                 /*
>>                  * We're trying to go async in a compound
>>
> 
> OK, this is a better fix. It doesn't break notify :-)
> 
> --- samba-3.6.12.orig/source3/smbd/smb2_create.c 2012-06-24
> 10:21:16.000000000 -0700
> +++ samba-3.6.12/source3/smbd/smb2_create.c      2013-03-14
> 01:00:44.575614048 -0700
> @@ -244,7 +244,18 @@ NTSTATUS smbd_smb2_request_process_creat
>         }
>         tevent_req_set_callback(tsubreq,
> smbd_smb2_request_create_done, smb2req);
> 
> -       return smbd_smb2_request_pending_queue(smb2req, tsubreq);
> +       /*
> +        * If the open was deferred, then do not call request pending queue
> +        * because that means an OpLock break has occurred and we want to
> +        * wait.
> +        */
> +       if (smb2req->smb1req && open_was_deferred_smb2(smb2req->smb1req->sconn,
> +                                               smb2req->smb1req->mid)) {
> +               DEBUG(10, ("Deferred request (OpLock Break) ... doing
> nothing\n"));
> +               return NT_STATUS_OK;
> +       }
> +       else
> +               return smbd_smb2_request_pending_queue(smb2req, tsubreq);
>  }

We're supposed to return STATUS_PENDING if we're waiting for an oplock
break.

metze

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 261 bytes
Desc: OpenPGP digital signature
URL: <http://lists.samba.org/pipermail/samba-technical/attachments/20130314/6e7046ec/attachment.pgp>


More information about the samba-technical mailing list