Jeremy Allison
2023-Jan-24 21:36 UTC
[Samba] oplocks, kernel oplocks, kernel share modes, .. - how it all works?
On Tue, Jan 24, 2023 at 09:32:09PM +0000, Rowland Penny via samba wrote:> >On 24/01/2023 21:19, Ralph Boehme via samba wrote: >>On 1/24/23 22:12, Jeremy Allison wrote: >>>On Wed, Jan 25, 2023 at 12:00:09AM +0300, Michael Tokarev wrote: >>>>24.01.2023 23:23, Jeremy Allison ?????: >>>>.. >>>>>which means you end up with LEASE_OPLOCK, granted=SMB2_LEASE_NONE >>>>>which is what you see with smbstatus. >>>>> >>>>>If you turn on kernel oplocks = yes, I think you must also >>>>>set smb2 leases = no in order for this to work. >>>> >>>>I've set smb2 leases = no (to global). I don't see these LEASE() >>>>anymore, >>>>I see "NONE", "BATCH" and "LEVEL_II" now, like in old good times :) >>> >>>Oh, very interesting. Something is wrong in our code then, as Ralph >>>already mentioned we have: >>> >>>???????? capabilities = 0; >>>???????? if (lp_host_msdfs()) { >>>???????????????? capabilities |= SMB2_CAP_DFS; >>>???????? } >>> >>>???????? if (protocol >= PROTOCOL_SMB2_10 && >>>???????????? lp_smb2_leases() && >>>???????????? lp_oplocks(GLOBAL_SECTION_SNUM) && >>>???????????? !lp_kernel_oplocks(GLOBAL_SECTION_SNUM)) >>>???????? { >>>???????????????? capabilities |= SMB2_CAP_LEASING; >>>???????? } >>> >>>so setting "kernel oplocks = yes" should prevent SMB2_CAP_LEASING >>>being returned to the client. A wireshark trace when you remove >>>the "smb2 leases = no" line would be good to look at. >> >>oh! That is the only place where we treat kernel oplocks as a global >>option. The docs and the rest of the code allow this as a per share >>option. Looks like we have a problem here. >> > >You could try asking the person who wrote that bit of the code, a >certain Jeremy Allison ;-)Ah, that code has gone through so many engineers and changes, who knows who originally added the bug :-) :-) :-). Probably me though :-).
Rowland Penny
2023-Jan-24 21:44 UTC
[Samba] oplocks, kernel oplocks, kernel share modes, .. - how it all works?
On 24/01/2023 21:36, Jeremy Allison wrote:> On Tue, Jan 24, 2023 at 09:32:09PM +0000, Rowland Penny via samba wrote: >> >> On 24/01/2023 21:19, Ralph Boehme via samba wrote: >>> On 1/24/23 22:12, Jeremy Allison wrote: >>>> On Wed, Jan 25, 2023 at 12:00:09AM +0300, Michael Tokarev wrote: >>>>> 24.01.2023 23:23, Jeremy Allison ?????: >>>>> .. >>>>>> which means you end up with LEASE_OPLOCK, granted=SMB2_LEASE_NONE >>>>>> which is what you see with smbstatus. >>>>>> >>>>>> If you turn on kernel oplocks = yes, I think you must also >>>>>> set smb2 leases = no in order for this to work. >>>>> >>>>> I've set smb2 leases = no (to global). I don't see these LEASE() >>>>> anymore, >>>>> I see "NONE", "BATCH" and "LEVEL_II" now, like in old good times :) >>>> >>>> Oh, very interesting. Something is wrong in our code then, as Ralph >>>> already mentioned we have: >>>> >>>> ???????? capabilities = 0; >>>> ???????? if (lp_host_msdfs()) { >>>> ???????????????? capabilities |= SMB2_CAP_DFS; >>>> ???????? } >>>> >>>> ???????? if (protocol >= PROTOCOL_SMB2_10 && >>>> ???????????? lp_smb2_leases() && >>>> ???????????? lp_oplocks(GLOBAL_SECTION_SNUM) && >>>> ???????????? !lp_kernel_oplocks(GLOBAL_SECTION_SNUM)) >>>> ???????? { >>>> ???????????????? capabilities |= SMB2_CAP_LEASING; >>>> ???????? } >>>> >>>> so setting "kernel oplocks = yes" should prevent SMB2_CAP_LEASING >>>> being returned to the client. A wireshark trace when you remove >>>> the "smb2 leases = no" line would be good to look at. >>> >>> oh! That is the only place where we treat kernel oplocks as a global >>> option. The docs and the rest of the code allow this as a per share >>> option. Looks like we have a problem here. >>> >> >> You could try asking the person who wrote that bit of the code, a >> certain Jeremy Allison ;-) > > Ah, that code has gone through so many engineers and changes, > who knows who originally added the bug :-) :-) :-). > > Probably me though :-).See: https://git.samba.org/?p=samba.git;a=commitdiff;h=556bf2ee006d14eb206c701bd8d375efb940140b Rowland