diff options
Diffstat (limited to 'usr/src/cmd')
20 files changed, 318 insertions, 139 deletions
diff --git a/usr/src/cmd/smbsrv/testoplock/case01.ref b/usr/src/cmd/smbsrv/testoplock/case01.ref index 6327c46b7e..f7bf8e0773 100644 --- a/usr/src/cmd/smbsrv/testoplock/case01.ref +++ b/usr/src/cmd/smbsrv/testoplock/case01.ref @@ -6,15 +6,16 @@ show ol_state=0x410 ( BATCH_OPLOCK EXCLUSIVE ) Excl=Y (FID=1) cnt_II=0 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=1 - fid=1 Lease= OgState=0x400 Brk=0x0 Excl=Y onlist: + fid=1 Lease= State=0x400 Excl=Y onlist: brk-open 2 *smb_oplock_ind_break fid=1 NewLevel=0x100, AckReq=1, ComplStatus=0x0 (SUCCESS) +*smb_oplock_send_break fid=1 NewLevel=0x100, OldLevel=0x400, AckReq=1) brk-open 2 ret status=0x108 (OPLOCK_BREAK_IN_PROGRESS) show ol_state=0x100410 ( BREAK_TO_TWO BATCH_OPLOCK EXCLUSIVE ) Excl=Y (FID=1) cnt_II=0 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=1 - fid=1 Lease= OgState=0x400 Brk=0x100000 Excl=Y onlist: + fid=1 Lease= State=0x400 BreakTo=0x100 Excl=Y onlist: ack 1 ack: break fid=1, newstate=0x100, status=0x0 (SUCCESS) open 2 @@ -25,5 +26,5 @@ show ol_state=0x100 ( LEVEL_TWO_OPLOCK ) Excl=n cnt_II=2 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=2 - fid=1 Lease= OgState=0x100 Brk=0x0 Excl=N onlist: II - fid=2 Lease= OgState=0x100 Brk=0x0 Excl=N onlist: II + fid=1 Lease= State=0x100 Excl=N onlist: II + fid=2 Lease= State=0x100 Excl=N onlist: II diff --git a/usr/src/cmd/smbsrv/testoplock/case02.ref b/usr/src/cmd/smbsrv/testoplock/case02.ref index 73488cbf27..ef251aafd5 100644 --- a/usr/src/cmd/smbsrv/testoplock/case02.ref +++ b/usr/src/cmd/smbsrv/testoplock/case02.ref @@ -6,15 +6,16 @@ show ol_state=0x17 ( EXCLUSIVE WRITE_CACHING HANDLE_CACHING READ_CACHING ) Excl=Y (FID=1) cnt_II=0 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=1 - fid=1 Lease= OgState=0x807 Brk=0x0 Excl=Y onlist: + fid=1 Lease= State=0x807 Excl=Y onlist: brk-open 2 *smb_oplock_ind_break fid=1 NewLevel=0x3, AckReq=1, ComplStatus=0x0 (SUCCESS) +*smb_oplock_send_break fid=1 NewLevel=0x803, OldLevel=0x807, AckReq=1) brk-open 2 ret status=0x108 (OPLOCK_BREAK_IN_PROGRESS) show ol_state=0x30017 ( BREAK_TO_HANDLE_CACHING BREAK_TO_READ_CACHING EXCLUSIVE WRITE_CACHING HANDLE_CACHING READ_CACHING ) Excl=Y (FID=1) cnt_II=0 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=1 - fid=1 Lease= OgState=0x807 Brk=0x30000 Excl=Y onlist: + fid=1 Lease= State=0x807 BreakTo=0x803 Excl=Y onlist: ack 1 ack: break fid=1, newstate=0x803, status=0x0 (SUCCESS) open 2 @@ -25,5 +26,5 @@ show ol_state=0x3 ( HANDLE_CACHING READ_CACHING ) Excl=n cnt_II=0 cnt_R=0 cnt_RH=2 cnt_RHBQ=0 ofile_cnt=2 - fid=1 Lease= OgState=0x803 Brk=0x0 Excl=N onlist: RH - fid=2 Lease= OgState=0x803 Brk=0x0 Excl=N onlist: RH + fid=1 Lease= State=0x803 Excl=N onlist: RH + fid=2 Lease= State=0x803 Excl=N onlist: RH diff --git a/usr/src/cmd/smbsrv/testoplock/case03.ref b/usr/src/cmd/smbsrv/testoplock/case03.ref index cdc7fe0089..0549760a2c 100644 --- a/usr/src/cmd/smbsrv/testoplock/case03.ref +++ b/usr/src/cmd/smbsrv/testoplock/case03.ref @@ -6,7 +6,7 @@ show ol_state=0x3 ( HANDLE_CACHING READ_CACHING ) Excl=n cnt_II=0 cnt_R=0 cnt_RH=1 cnt_RHBQ=0 ofile_cnt=1 - fid=1 Lease=3 OgState=0x803 Brk=0x0 Excl=N onlist: RH + fid=1 Lease=3 State=0x803 Excl=N onlist: RH open 2 3 open 2 OK req 2 0x803 @@ -16,5 +16,5 @@ show ol_state=0x3 ( HANDLE_CACHING READ_CACHING ) Excl=n cnt_II=0 cnt_R=0 cnt_RH=1 cnt_RHBQ=0 ofile_cnt=2 - fid=1 Lease=3 OgState=0x0 Brk=0x0 Excl=N onlist: - fid=2 Lease=3 OgState=0x803 Brk=0x0 Excl=N onlist: RH + fid=1 Lease=3 State=0x0 Excl=N onlist: + fid=2 Lease=3 State=0x803 Excl=N onlist: RH diff --git a/usr/src/cmd/smbsrv/testoplock/case04.ref b/usr/src/cmd/smbsrv/testoplock/case04.ref index 32df3767a9..c7eed6cafb 100644 --- a/usr/src/cmd/smbsrv/testoplock/case04.ref +++ b/usr/src/cmd/smbsrv/testoplock/case04.ref @@ -6,7 +6,7 @@ show ol_state=0x1 ( READ_CACHING ) Excl=n cnt_II=0 cnt_R=1 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=1 - fid=1 Lease=3 OgState=0x801 Brk=0x0 Excl=N onlist: R + fid=1 Lease=3 State=0x801 Excl=N onlist: R open 2 3 open 2 OK req 2 0x801 @@ -16,5 +16,5 @@ show ol_state=0x1 ( READ_CACHING ) Excl=n cnt_II=0 cnt_R=1 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=2 - fid=1 Lease=3 OgState=0x0 Brk=0x0 Excl=N onlist: - fid=2 Lease=3 OgState=0x801 Brk=0x0 Excl=N onlist: R + fid=1 Lease=3 State=0x0 Excl=N onlist: + fid=2 Lease=3 State=0x801 Excl=N onlist: R diff --git a/usr/src/cmd/smbsrv/testoplock/case05.ref b/usr/src/cmd/smbsrv/testoplock/case05.ref index 639bf0023b..cad3575fa8 100644 --- a/usr/src/cmd/smbsrv/testoplock/case05.ref +++ b/usr/src/cmd/smbsrv/testoplock/case05.ref @@ -6,7 +6,7 @@ show ol_state=0x3 ( HANDLE_CACHING READ_CACHING ) Excl=n cnt_II=0 cnt_R=0 cnt_RH=1 cnt_RHBQ=0 ofile_cnt=1 - fid=2 Lease=4 OgState=0x803 Brk=0x0 Excl=N onlist: RH + fid=2 Lease=4 State=0x803 Excl=N onlist: RH open 3 4 open 3 OK req 3 0x803 @@ -16,29 +16,30 @@ show ol_state=0x3 ( HANDLE_CACHING READ_CACHING ) Excl=n cnt_II=0 cnt_R=0 cnt_RH=1 cnt_RHBQ=0 ofile_cnt=2 - fid=2 Lease=4 OgState=0x0 Brk=0x0 Excl=N onlist: - fid=3 Lease=4 OgState=0x803 Brk=0x0 Excl=N onlist: RH + fid=2 Lease=4 State=0x0 Excl=N onlist: + fid=3 Lease=4 State=0x803 Excl=N onlist: RH open 1 open 1 OK brk-write 1 *smb_oplock_ind_break fid=3 NewLevel=0x0, AckReq=1, ComplStatus=0x0 (SUCCESS) +*smb_oplock_send_break fid=3 NewLevel=0x800, OldLevel=0x803, AckReq=1) brk-write 1 ret status=0x0 (SUCCESS) show ol_state=0x80003 ( BREAK_TO_NO_CACHING HANDLE_CACHING READ_CACHING ) Excl=n cnt_II=0 cnt_R=0 cnt_RH=0 cnt_RHBQ=1 ofile_cnt=3 - fid=2 Lease=4 OgState=0x0 Brk=0x0 Excl=N onlist: - fid=3 Lease=4 OgState=0x803 Brk=0x80000 Excl=N onlist: RHBQ(to none) - fid=1 Lease= OgState=0x0 Brk=0x0 Excl=N onlist: + fid=2 Lease=4 State=0x0 Excl=N onlist: + fid=3 Lease=4 State=0x803 BreakTo=0x800 Excl=N onlist: RHBQ(to none) + fid=1 Lease= State=0x0 Excl=N onlist: ack 3 ack: break fid=3, newstate=0x800, status=0x0 (SUCCESS) show ol_state=0x10000000 ( NO_OPLOCK ) Excl=n cnt_II=0 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=3 - fid=2 Lease=4 OgState=0x0 Brk=0x0 Excl=N onlist: - fid=3 Lease=4 OgState=0x800 Brk=0x0 Excl=N onlist: - fid=1 Lease= OgState=0x0 Brk=0x0 Excl=N onlist: + fid=2 Lease=4 State=0x0 Excl=N onlist: + fid=3 Lease=4 State=0x800 Excl=N onlist: + fid=1 Lease= State=0x0 Excl=N onlist: open 4 4 open 4 OK req 4 0x803 @@ -47,10 +48,10 @@ show ol_state=0x3 ( HANDLE_CACHING READ_CACHING ) Excl=n cnt_II=0 cnt_R=0 cnt_RH=1 cnt_RHBQ=0 ofile_cnt=4 - fid=2 Lease=4 OgState=0x0 Brk=0x0 Excl=N onlist: - fid=3 Lease=4 OgState=0x800 Brk=0x0 Excl=N onlist: - fid=1 Lease= OgState=0x0 Brk=0x0 Excl=N onlist: - fid=4 Lease=4 OgState=0x803 Brk=0x0 Excl=N onlist: RH + fid=2 Lease=4 State=0x0 Excl=N onlist: + fid=3 Lease=4 State=0x800 Excl=N onlist: + fid=1 Lease= State=0x0 Excl=N onlist: + fid=4 Lease=4 State=0x803 Excl=N onlist: RH close 4 *smb_oplock_ind_break fid=4 NewLevel=0x0, AckReq=0, ComplStatus=0x216 (OPLOCK_HANDLE_CLOSED) close OK @@ -60,6 +61,6 @@ show ol_state=0x3 ( HANDLE_CACHING READ_CACHING ) Excl=n cnt_II=0 cnt_R=0 cnt_RH=1 cnt_RHBQ=0 ofile_cnt=3 - fid=2 Lease=4 OgState=0x0 Brk=0x0 Excl=N onlist: - fid=3 Lease=4 OgState=0x803 Brk=0x0 Excl=N onlist: RH - fid=1 Lease= OgState=0x0 Brk=0x0 Excl=N onlist: + fid=2 Lease=4 State=0x0 Excl=N onlist: + fid=3 Lease=4 State=0x803 Excl=N onlist: RH + fid=1 Lease= State=0x0 Excl=N onlist: diff --git a/usr/src/cmd/smbsrv/testoplock/case06.ref b/usr/src/cmd/smbsrv/testoplock/case06.ref index daa69c3dd1..15a588219d 100644 --- a/usr/src/cmd/smbsrv/testoplock/case06.ref +++ b/usr/src/cmd/smbsrv/testoplock/case06.ref @@ -10,17 +10,18 @@ show ol_state=0x1 ( READ_CACHING ) Excl=n cnt_II=0 cnt_R=2 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=2 - fid=1 Lease=1 OgState=0x801 Brk=0x0 Excl=N onlist: R - fid=2 Lease=2 OgState=0x801 Brk=0x0 Excl=N onlist: R + fid=1 Lease=1 State=0x801 Excl=N onlist: R + fid=2 Lease=2 State=0x801 Excl=N onlist: R brk-write 1 *smb_oplock_ind_break fid=2 NewLevel=0x0, AckReq=0, ComplStatus=0x0 (SUCCESS) +*smb_oplock_send_break fid=2 NewLevel=0x800, OldLevel=0x801, AckReq=0) brk-write 1 ret status=0x0 (SUCCESS) show ol_state=0x1 ( READ_CACHING ) Excl=n cnt_II=0 cnt_R=1 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=2 - fid=1 Lease=1 OgState=0x801 Brk=0x0 Excl=N onlist: R - fid=2 Lease=2 OgState=0x800 Brk=0x0 Excl=N onlist: + fid=1 Lease=1 State=0x801 Excl=N onlist: R + fid=2 Lease=2 State=0x800 Excl=N onlist: open 3 2 open 3 OK req 3 0x801 @@ -34,23 +35,25 @@ show ol_state=0x1 ( READ_CACHING ) Excl=n cnt_II=0 cnt_R=2 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=2 - fid=1 Lease=1 OgState=0x801 Brk=0x0 Excl=N onlist: R - fid=2 Lease=2 OgState=0x801 Brk=0x0 Excl=N onlist: R + fid=1 Lease=1 State=0x801 Excl=N onlist: R + fid=2 Lease=2 State=0x801 Excl=N onlist: R brk-write 2 *smb_oplock_ind_break fid=1 NewLevel=0x0, AckReq=0, ComplStatus=0x0 (SUCCESS) +*smb_oplock_send_break fid=1 NewLevel=0x800, OldLevel=0x801, AckReq=0) brk-write 2 ret status=0x0 (SUCCESS) show ol_state=0x1 ( READ_CACHING ) Excl=n cnt_II=0 cnt_R=1 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=2 - fid=1 Lease=1 OgState=0x800 Brk=0x0 Excl=N onlist: - fid=2 Lease=2 OgState=0x801 Brk=0x0 Excl=N onlist: R + fid=1 Lease=1 State=0x800 Excl=N onlist: + fid=2 Lease=2 State=0x801 Excl=N onlist: R brk-write 1 *smb_oplock_ind_break fid=2 NewLevel=0x0, AckReq=0, ComplStatus=0x0 (SUCCESS) +*smb_oplock_send_break fid=2 NewLevel=0x800, OldLevel=0x801, AckReq=0) brk-write 1 ret status=0x0 (SUCCESS) show ol_state=0x10000000 ( NO_OPLOCK ) Excl=n cnt_II=0 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=2 - fid=1 Lease=1 OgState=0x800 Brk=0x0 Excl=N onlist: - fid=2 Lease=2 OgState=0x800 Brk=0x0 Excl=N onlist: + fid=1 Lease=1 State=0x800 Excl=N onlist: + fid=2 Lease=2 State=0x800 Excl=N onlist: diff --git a/usr/src/cmd/smbsrv/testoplock/case07.ref b/usr/src/cmd/smbsrv/testoplock/case07.ref index 11b1fa415d..0427292339 100644 --- a/usr/src/cmd/smbsrv/testoplock/case07.ref +++ b/usr/src/cmd/smbsrv/testoplock/case07.ref @@ -6,7 +6,7 @@ show ol_state=0x3 ( HANDLE_CACHING READ_CACHING ) Excl=n cnt_II=0 cnt_R=0 cnt_RH=1 cnt_RHBQ=0 ofile_cnt=1 - fid=1 Lease=3 OgState=0x803 Brk=0x0 Excl=N onlist: RH + fid=1 Lease=3 State=0x803 Excl=N onlist: RH open 2 3 open 2 OK req 2 0x807 @@ -16,5 +16,5 @@ show ol_state=0x17 ( EXCLUSIVE WRITE_CACHING HANDLE_CACHING READ_CACHING ) Excl=Y (FID=2) cnt_II=0 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=2 - fid=1 Lease=3 OgState=0x0 Brk=0x0 Excl=N onlist: - fid=2 Lease=3 OgState=0x807 Brk=0x0 Excl=Y onlist: + fid=1 Lease=3 State=0x0 Excl=N onlist: + fid=2 Lease=3 State=0x807 Excl=Y onlist: diff --git a/usr/src/cmd/smbsrv/testoplock/case08.ref b/usr/src/cmd/smbsrv/testoplock/case08.ref index 7f28032990..1bc366958d 100644 --- a/usr/src/cmd/smbsrv/testoplock/case08.ref +++ b/usr/src/cmd/smbsrv/testoplock/case08.ref @@ -6,31 +6,32 @@ show ol_state=0x15 ( EXCLUSIVE WRITE_CACHING READ_CACHING ) Excl=Y (FID=1) cnt_II=0 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=1 - fid=1 Lease=1 OgState=0x805 Brk=0x0 Excl=Y onlist: + fid=1 Lease=1 State=0x805 Excl=Y onlist: open 2 2 open 2 OK brk-open 2 *smb_oplock_ind_break fid=1 NewLevel=0x1, AckReq=1, ComplStatus=0x0 (SUCCESS) +*smb_oplock_send_break fid=1 NewLevel=0x801, OldLevel=0x805, AckReq=1) brk-open 2 ret status=0x108 (OPLOCK_BREAK_IN_PROGRESS) show ol_state=0x10015 ( BREAK_TO_READ_CACHING EXCLUSIVE WRITE_CACHING READ_CACHING ) Excl=Y (FID=1) cnt_II=0 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=2 - fid=1 Lease=1 OgState=0x805 Brk=0x10000 Excl=Y onlist: - fid=2 Lease=2 OgState=0x0 Brk=0x0 Excl=N onlist: + fid=1 Lease=1 State=0x805 BreakTo=0x801 Excl=Y onlist: + fid=2 Lease=2 State=0x0 Excl=N onlist: ack 1 ack: break fid=1, newstate=0x801, status=0x0 (SUCCESS) show ol_state=0x1 ( READ_CACHING ) Excl=n cnt_II=0 cnt_R=1 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=2 - fid=1 Lease=1 OgState=0x801 Brk=0x0 Excl=N onlist: R - fid=2 Lease=2 OgState=0x0 Brk=0x0 Excl=N onlist: + fid=1 Lease=1 State=0x801 Excl=N onlist: R + fid=2 Lease=2 State=0x0 Excl=N onlist: req 2 0x801 req oplock fid=2 ret oplock=0x801 status=0x0 (SUCCESS) show ol_state=0x1 ( READ_CACHING ) Excl=n cnt_II=0 cnt_R=2 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=2 - fid=1 Lease=1 OgState=0x801 Brk=0x0 Excl=N onlist: R - fid=2 Lease=2 OgState=0x801 Brk=0x0 Excl=N onlist: R + fid=1 Lease=1 State=0x801 Excl=N onlist: R + fid=2 Lease=2 State=0x801 Excl=N onlist: R diff --git a/usr/src/cmd/smbsrv/testoplock/case09.ref b/usr/src/cmd/smbsrv/testoplock/case09.ref index 4003b133db..9eb3e85230 100644 --- a/usr/src/cmd/smbsrv/testoplock/case09.ref +++ b/usr/src/cmd/smbsrv/testoplock/case09.ref @@ -6,7 +6,7 @@ show ol_state=0x100 ( LEVEL_TWO_OPLOCK ) Excl=n cnt_II=1 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=1 - fid=1 Lease= OgState=0x100 Brk=0x0 Excl=N onlist: II + fid=1 Lease= State=0x100 Excl=N onlist: II open 2 2 open 2 OK brk-open 2 @@ -15,13 +15,13 @@ show ol_state=0x100 ( LEVEL_TWO_OPLOCK ) Excl=n cnt_II=1 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=2 - fid=1 Lease= OgState=0x100 Brk=0x0 Excl=N onlist: II - fid=2 Lease=2 OgState=0x0 Brk=0x0 Excl=N onlist: + fid=1 Lease= State=0x100 Excl=N onlist: II + fid=2 Lease=2 State=0x0 Excl=N onlist: req 2 0x803 req oplock fid=2 ret oplock=0x0 status=0xc00000e2 (OPLOCK_NOT_GRANTED) show ol_state=0x100 ( LEVEL_TWO_OPLOCK ) Excl=n cnt_II=1 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=2 - fid=1 Lease= OgState=0x100 Brk=0x0 Excl=N onlist: II - fid=2 Lease=2 OgState=0x0 Brk=0x0 Excl=N onlist: + fid=1 Lease= State=0x100 Excl=N onlist: II + fid=2 Lease=2 State=0x0 Excl=N onlist: diff --git a/usr/src/cmd/smbsrv/testoplock/case10.ref b/usr/src/cmd/smbsrv/testoplock/case10.ref index 9e0275d258..c3e4fdae96 100644 --- a/usr/src/cmd/smbsrv/testoplock/case10.ref +++ b/usr/src/cmd/smbsrv/testoplock/case10.ref @@ -6,7 +6,7 @@ show ol_state=0x100 ( LEVEL_TWO_OPLOCK ) Excl=n cnt_II=1 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=1 - fid=1 Lease= OgState=0x100 Brk=0x0 Excl=N onlist: II + fid=1 Lease= State=0x100 Excl=N onlist: II open 2 2 open 2 OK brk-open 2 @@ -15,8 +15,8 @@ show ol_state=0x100 ( LEVEL_TWO_OPLOCK ) Excl=n cnt_II=1 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=2 - fid=1 Lease= OgState=0x100 Brk=0x0 Excl=N onlist: II - fid=2 Lease=2 OgState=0x0 Brk=0x0 Excl=N onlist: + fid=1 Lease= State=0x100 Excl=N onlist: II + fid=2 Lease=2 State=0x0 Excl=N onlist: req 2 0x807 req oplock fid=2 ret oplock=0x0 status=0xc00000e2 (OPLOCK_NOT_GRANTED) req 2 0x803 @@ -27,5 +27,5 @@ show ol_state=0x101 ( LEVEL_TWO_OPLOCK READ_CACHING ) Excl=n cnt_II=1 cnt_R=1 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=2 - fid=1 Lease= OgState=0x100 Brk=0x0 Excl=N onlist: II - fid=2 Lease=2 OgState=0x801 Brk=0x0 Excl=N onlist: R + fid=1 Lease= State=0x100 Excl=N onlist: II + fid=2 Lease=2 State=0x801 Excl=N onlist: R diff --git a/usr/src/cmd/smbsrv/testoplock/case11.ref b/usr/src/cmd/smbsrv/testoplock/case11.ref index 05bae87e04..d1a88b4518 100644 --- a/usr/src/cmd/smbsrv/testoplock/case11.ref +++ b/usr/src/cmd/smbsrv/testoplock/case11.ref @@ -6,11 +6,12 @@ show ol_state=0x17 ( EXCLUSIVE WRITE_CACHING HANDLE_CACHING READ_CACHING ) Excl=Y (FID=1) cnt_II=0 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=1 - fid=1 Lease=1 OgState=0x807 Brk=0x0 Excl=Y onlist: + fid=1 Lease=1 State=0x807 Excl=Y onlist: open 2 open 2 OK brk-open 2 *smb_oplock_ind_break fid=1 NewLevel=0x3, AckReq=1, ComplStatus=0x0 (SUCCESS) +*smb_oplock_send_break fid=1 NewLevel=0x803, OldLevel=0x807, AckReq=1) brk-open 2 ret status=0x108 (OPLOCK_BREAK_IN_PROGRESS) ack 1 ack: break fid=1, newstate=0x803, status=0x0 (SUCCESS) @@ -18,13 +19,13 @@ show ol_state=0x3 ( HANDLE_CACHING READ_CACHING ) Excl=n cnt_II=0 cnt_R=0 cnt_RH=1 cnt_RHBQ=0 ofile_cnt=2 - fid=1 Lease=1 OgState=0x803 Brk=0x0 Excl=N onlist: RH - fid=2 Lease= OgState=0x0 Brk=0x0 Excl=N onlist: + fid=1 Lease=1 State=0x803 Excl=N onlist: RH + fid=2 Lease= State=0x0 Excl=N onlist: req 2 0x100 req oplock fid=2 ret oplock=0x0 status=0xc00000e2 (OPLOCK_NOT_GRANTED) show ol_state=0x3 ( HANDLE_CACHING READ_CACHING ) Excl=n cnt_II=0 cnt_R=0 cnt_RH=1 cnt_RHBQ=0 ofile_cnt=2 - fid=1 Lease=1 OgState=0x803 Brk=0x0 Excl=N onlist: RH - fid=2 Lease= OgState=0x0 Brk=0x0 Excl=N onlist: + fid=1 Lease=1 State=0x803 Excl=N onlist: RH + fid=2 Lease= State=0x0 Excl=N onlist: diff --git a/usr/src/cmd/smbsrv/testoplock/case12.ref b/usr/src/cmd/smbsrv/testoplock/case12.ref index bc36b7b6de..ebbe5d4c18 100644 --- a/usr/src/cmd/smbsrv/testoplock/case12.ref +++ b/usr/src/cmd/smbsrv/testoplock/case12.ref @@ -6,11 +6,12 @@ show ol_state=0x17 ( EXCLUSIVE WRITE_CACHING HANDLE_CACHING READ_CACHING ) Excl=Y (FID=1) cnt_II=0 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=1 - fid=1 Lease=1 OgState=0x807 Brk=0x0 Excl=Y onlist: + fid=1 Lease=1 State=0x807 Excl=Y onlist: open 2 open 2 OK brk-open 2 *smb_oplock_ind_break fid=1 NewLevel=0x3, AckReq=1, ComplStatus=0x0 (SUCCESS) +*smb_oplock_send_break fid=1 NewLevel=0x803, OldLevel=0x807, AckReq=1) brk-open 2 ret status=0x108 (OPLOCK_BREAK_IN_PROGRESS) waiters 2 1 waiters 0 -> 1 @@ -18,8 +19,8 @@ show ol_state=0x30017 ( BREAK_TO_HANDLE_CACHING BREAK_TO_READ_CACHING EXCLUSIVE WRITE_CACHING HANDLE_CACHING READ_CACHING ) Excl=Y (FID=1) cnt_II=0 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=2 - fid=1 Lease=1 OgState=0x807 Brk=0x30000 Excl=Y onlist: - fid=2 Lease= OgState=0x0 Brk=0x0 Excl=N onlist: + fid=1 Lease=1 State=0x807 BreakTo=0x803 Excl=Y onlist: + fid=2 Lease= State=0x0 Excl=N onlist: open 3 open 3 OK brk-open 3 4 @@ -30,25 +31,28 @@ show ol_state=0x80017 ( BREAK_TO_NO_CACHING EXCLUSIVE WRITE_CACHING HANDLE_CACHING READ_CACHING ) Excl=Y (FID=1) cnt_II=0 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=3 - fid=1 Lease=1 OgState=0x807 Brk=0x30000 Excl=Y onlist: - fid=2 Lease= OgState=0x0 Brk=0x0 Excl=N onlist: - fid=3 Lease= OgState=0x0 Brk=0x0 Excl=N onlist: + fid=1 Lease=1 State=0x807 BreakTo=0x803 Excl=Y onlist: + fid=2 Lease= State=0x0 Excl=N onlist: + fid=3 Lease= State=0x0 Excl=N onlist: ack 1 0x803 -*smb_oplock_ind_break fid=1 NewLevel=0x0, AckReq=1, ComplStatus=0x8000002e (CANNOT_GRANT_REQUESTED_OPLOCK) ack: break fid=1, newstate=0x803, status=0x0 (SUCCESS) +*smb_oplock_ind_break_in_ack fid=1 NewLevel=0x1, AckReq=1 +*smb_oplock_send_break fid=1 NewLevel=0x801, OldLevel=0x803, AckReq=1) show ol_state=0x80003 ( BREAK_TO_NO_CACHING HANDLE_CACHING READ_CACHING ) Excl=n cnt_II=0 cnt_R=0 cnt_RH=0 cnt_RHBQ=1 ofile_cnt=3 - fid=1 Lease=1 OgState=0x803 Brk=0x80000 Excl=N onlist: RHBQ(to none) - fid=2 Lease= OgState=0x0 Brk=0x0 Excl=N onlist: - fid=3 Lease= OgState=0x0 Brk=0x0 Excl=N onlist: -ack 1 0x800 - ack: break fid=1, newstate=0x800, status=0x0 (SUCCESS) + fid=1 Lease=1 State=0x803 BreakTo=0x801 Excl=N onlist: RHBQ(to none) + fid=2 Lease= State=0x0 Excl=N onlist: + fid=3 Lease= State=0x0 Excl=N onlist: +ack 1 0x801 + ack: break fid=1, newstate=0x801, status=0x0 (SUCCESS) +*smb_oplock_ind_break_in_ack fid=1 NewLevel=0x0, AckReq=0 +*smb_oplock_send_break fid=1 NewLevel=0x800, OldLevel=0x801, AckReq=0) show ol_state=0x10000000 ( NO_OPLOCK ) Excl=n cnt_II=0 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=3 - fid=1 Lease=1 OgState=0x800 Brk=0x0 Excl=N onlist: - fid=2 Lease= OgState=0x0 Brk=0x0 Excl=N onlist: - fid=3 Lease= OgState=0x0 Brk=0x0 Excl=N onlist: + fid=1 Lease=1 State=0x800 Excl=N onlist: + fid=2 Lease= State=0x0 Excl=N onlist: + fid=3 Lease= State=0x0 Excl=N onlist: diff --git a/usr/src/cmd/smbsrv/testoplock/case12.txt b/usr/src/cmd/smbsrv/testoplock/case12.txt index 23b4f63092..1cbaed4d72 100644 --- a/usr/src/cmd/smbsrv/testoplock/case12.txt +++ b/usr/src/cmd/smbsrv/testoplock/case12.txt @@ -20,9 +20,10 @@ show # and brk-open shoud block (break in progress) # # ack the first lease break above (RWH to RH) -# should get a new break ind. (RH to none) +# should get a new break ind. (RH to R) ar=1 ack 1 0x803 show -# got break ind? -ack 1 0x800 +# ack the second lease break (RH to R) +# should get a new break ind. (R to none) ar=0 +ack 1 0x801 show diff --git a/usr/src/cmd/smbsrv/testoplock/case13.ref b/usr/src/cmd/smbsrv/testoplock/case13.ref index a35a5992ce..9dc00b5ce6 100644 --- a/usr/src/cmd/smbsrv/testoplock/case13.ref +++ b/usr/src/cmd/smbsrv/testoplock/case13.ref @@ -6,7 +6,7 @@ show ol_state=0x1 ( READ_CACHING ) Excl=n cnt_II=0 cnt_R=1 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=1 - fid=1 Lease=1 OgState=0x801 Brk=0x0 Excl=N onlist: R + fid=1 Lease=1 State=0x801 Excl=N onlist: R open 2 1 open 2 OK @@ -19,23 +19,31 @@ show ol_state=0x17 ( EXCLUSIVE WRITE_CACHING HANDLE_CACHING READ_CACHING ) Excl=Y (FID=2) cnt_II=0 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=2 - fid=1 Lease=1 OgState=0x0 Brk=0x0 Excl=N onlist: - fid=2 Lease=1 OgState=0x807 Brk=0x0 Excl=Y onlist: + fid=1 Lease=1 State=0x0 Excl=N onlist: + fid=2 Lease=1 State=0x807 Excl=Y onlist: move 2 1 move 2 1 +show + ol_state=0x17 ( EXCLUSIVE WRITE_CACHING HANDLE_CACHING READ_CACHING ) + Excl=Y (FID=1) cnt_II=0 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 + ofile_cnt=2 + fid=1 Lease=1 State=0x807 Excl=Y onlist: + fid=2 Lease=1 State=0x0 Excl=N onlist: + close 2 close OK show ol_state=0x17 ( EXCLUSIVE WRITE_CACHING HANDLE_CACHING READ_CACHING ) Excl=Y (FID=1) cnt_II=0 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 ofile_cnt=1 - fid=1 Lease=1 OgState=0x807 Brk=0x0 Excl=Y onlist: + fid=1 Lease=1 State=0x807 Excl=Y onlist: open 3 2 open 3 OK brk-open 3 *smb_oplock_ind_break fid=1 NewLevel=0x3, AckReq=1, ComplStatus=0x0 (SUCCESS) +*smb_oplock_send_break fid=1 NewLevel=0x803, OldLevel=0x807, AckReq=1) brk-open 3 ret status=0x108 (OPLOCK_BREAK_IN_PROGRESS) ack 1 ack: break fid=1, newstate=0x803, status=0x0 (SUCCESS) @@ -43,8 +51,8 @@ show ol_state=0x3 ( HANDLE_CACHING READ_CACHING ) Excl=n cnt_II=0 cnt_R=0 cnt_RH=1 cnt_RHBQ=0 ofile_cnt=2 - fid=1 Lease=1 OgState=0x803 Brk=0x0 Excl=N onlist: RH - fid=3 Lease=2 OgState=0x0 Brk=0x0 Excl=N onlist: + fid=1 Lease=1 State=0x803 Excl=N onlist: RH + fid=3 Lease=2 State=0x0 Excl=N onlist: req 3 0x801 req oplock fid=3 ret oplock=0x801 status=0x0 (SUCCESS) @@ -52,5 +60,5 @@ show ol_state=0x23 ( MIXED_R_AND_RH HANDLE_CACHING READ_CACHING ) Excl=n cnt_II=0 cnt_R=1 cnt_RH=1 cnt_RHBQ=0 ofile_cnt=2 - fid=1 Lease=1 OgState=0x803 Brk=0x0 Excl=N onlist: RH - fid=3 Lease=2 OgState=0x801 Brk=0x0 Excl=N onlist: R + fid=1 Lease=1 State=0x803 Excl=N onlist: RH + fid=3 Lease=2 State=0x801 Excl=N onlist: R diff --git a/usr/src/cmd/smbsrv/testoplock/case13.txt b/usr/src/cmd/smbsrv/testoplock/case13.txt index c8d012690d..f7af15d5c9 100644 --- a/usr/src/cmd/smbsrv/testoplock/case13.txt +++ b/usr/src/cmd/smbsrv/testoplock/case13.txt @@ -12,6 +12,8 @@ req 2 0x807 show move 2 1 +show + close 2 show diff --git a/usr/src/cmd/smbsrv/testoplock/case14.ref b/usr/src/cmd/smbsrv/testoplock/case14.ref new file mode 100644 index 0000000000..b019488ae9 --- /dev/null +++ b/usr/src/cmd/smbsrv/testoplock/case14.ref @@ -0,0 +1,66 @@ + +open 1 1 + open 1 OK +req 1 0x807 + req oplock fid=1 ret oplock=0x807 status=0x0 (SUCCESS) +show + ol_state=0x17 ( EXCLUSIVE WRITE_CACHING HANDLE_CACHING READ_CACHING ) + Excl=Y (FID=1) cnt_II=0 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 + ofile_cnt=1 + fid=1 Lease=1 State=0x807 Excl=Y onlist: + +brk-setinfo 1 0xa + brk-setinfo 1 0xa ret status=0x0 (SUCCESS) +show + ol_state=0x17 ( EXCLUSIVE WRITE_CACHING HANDLE_CACHING READ_CACHING ) + Excl=Y (FID=1) cnt_II=0 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 + ofile_cnt=1 + fid=1 Lease=1 State=0x807 Excl=Y onlist: + + +open 2 2 + open 2 OK +brk-open 2 +*smb_oplock_ind_break fid=1 NewLevel=0x3, AckReq=1, ComplStatus=0x0 (SUCCESS) +*smb_oplock_send_break fid=1 NewLevel=0x803, OldLevel=0x807, AckReq=1) + brk-open 2 ret status=0x108 (OPLOCK_BREAK_IN_PROGRESS) +show + ol_state=0x30017 ( BREAK_TO_HANDLE_CACHING BREAK_TO_READ_CACHING EXCLUSIVE WRITE_CACHING HANDLE_CACHING READ_CACHING ) + Excl=Y (FID=1) cnt_II=0 cnt_R=0 cnt_RH=0 cnt_RHBQ=0 + ofile_cnt=2 + fid=1 Lease=1 State=0x807 BreakTo=0x803 Excl=Y onlist: + fid=2 Lease=2 State=0x0 Excl=N onlist: + +ack 1 0x803 + ack: break fid=1, newstate=0x803, status=0x0 (SUCCESS) +show + ol_state=0x3 ( HANDLE_CACHING READ_CACHING ) + Excl=n cnt_II=0 cnt_R=0 cnt_RH=1 cnt_RHBQ=0 + ofile_cnt=2 + fid=1 Lease=1 State=0x803 Excl=N onlist: RH + fid=2 Lease=2 State=0x0 Excl=N onlist: + +req 2 0x807 + req oplock fid=2 ret oplock=0x0 status=0xc00000e2 (OPLOCK_NOT_GRANTED) +req 2 0x803 + req oplock fid=2 ret oplock=0x803 status=0x0 (SUCCESS) + +brk-setinfo 1 0xa +*smb_oplock_ind_break fid=2 NewLevel=0x1, AckReq=1, ComplStatus=0x0 (SUCCESS) +*smb_oplock_send_break fid=2 NewLevel=0x801, OldLevel=0x803, AckReq=1) + brk-setinfo 1 0xa ret status=0x108 (OPLOCK_BREAK_IN_PROGRESS) +show + ol_state=0x3 ( HANDLE_CACHING READ_CACHING ) + Excl=n cnt_II=0 cnt_R=0 cnt_RH=1 cnt_RHBQ=1 + ofile_cnt=2 + fid=1 Lease=1 State=0x803 Excl=N onlist: RH + fid=2 Lease=2 State=0x803 BreakTo=0x801 Excl=N onlist: RHBQ(to read) + +ack 2 0x801 + ack: break fid=2, newstate=0x801, status=0x0 (SUCCESS) +show + ol_state=0x23 ( MIXED_R_AND_RH HANDLE_CACHING READ_CACHING ) + Excl=n cnt_II=0 cnt_R=1 cnt_RH=1 cnt_RHBQ=0 + ofile_cnt=2 + fid=1 Lease=1 State=0x803 Excl=N onlist: RH + fid=2 Lease=2 State=0x801 Excl=N onlist: R diff --git a/usr/src/cmd/smbsrv/testoplock/case14.txt b/usr/src/cmd/smbsrv/testoplock/case14.txt new file mode 100644 index 0000000000..685d4d3637 --- /dev/null +++ b/usr/src/cmd/smbsrv/testoplock/case14.txt @@ -0,0 +1,51 @@ +# Input for testoplock, case 13 +# simulate smbtorture smb2.lease.v2_rename + +# Create (open_if, lease=e0dd(1), RWH, epoch=0x4711 ) +# resp: fid=1, RWH, epoch=0x4712 +# Expect no breaks, one handle, state=RWH +open 1 1 +req 1 0x807 +show + +# SetInfo fid=1, newname=...dst.dat +# resp OK (no breaks) +brk-setinfo 1 0xa +show + +# Create, open_if, lease=e0dd(1), RWH, epoch=0x4712 +# resp fid=5 RWH, flags=0 (not breaking) +# Close fid=5 / resp +# This is handled without calling the common oplock layer, +# by logic at the top of smb2_lease_acquire + +# Create, open_if, lease=feed(2), RWH, epoch=0x0044 +# (resp pending, will break RWH to RH) +open 2 2 +brk-open 2 +show + +# Lease Break Notify, lease=e0dd(1), RWH to RH, epoch=0x4713 +# Lease Break Ack, lease=e0dd, RH +# resp (same) +ack 1 0x803 +show + +# Create-resp, fid=9 lease=feed(2), state=RH, epoch=0x0045 +# Now that open 2 breaking is done, it can request. +# Will fail RWH, succeed RH +req 2 0x807 +req 2 0x803 + +# SetInfo fid=1, newname=...src.dat +# (resp blocked -- win10 does not go pending? we do) +# Should get rid of handle caching (RH to R) +brk-setinfo 1 0xa +show + +# Lease Break Notify, lease=feed(2), RH to R, epoch=0x0046 +# Lease Break Ack, lease=feed(2), state=R +# Break Ack Resp (same) +ack 2 0x801 +show +# SetInfo resp, fid=1 (note: races with Break Ack resp.) diff --git a/usr/src/cmd/smbsrv/testoplock/smbsrv/smb_kproto.h b/usr/src/cmd/smbsrv/testoplock/smbsrv/smb_kproto.h index 5ecc17210a..2a7c31235a 100644 --- a/usr/src/cmd/smbsrv/testoplock/smbsrv/smb_kproto.h +++ b/usr/src/cmd/smbsrv/testoplock/smbsrv/smb_kproto.h @@ -92,7 +92,7 @@ void smb_oplock_ind_break_in_ack(smb_request_t *, smb_ofile_t *, uint32_t, boolean_t); void smb_oplock_send_break(smb_request_t *); -uint32_t smb_oplock_wait_ack(smb_request_t *); +uint32_t smb_oplock_wait_ack(smb_request_t *, uint32_t); uint32_t smb_oplock_wait_break(smb_request_t *, smb_node_t *, int); uint32_t smb_oplock_wait_break_fem(smb_node_t *, int); diff --git a/usr/src/cmd/smbsrv/testoplock/smbsrv/smb_ktypes.h b/usr/src/cmd/smbsrv/testoplock/smbsrv/smb_ktypes.h index 416c7b2ba4..95eab0f824 100644 --- a/usr/src/cmd/smbsrv/testoplock/smbsrv/smb_ktypes.h +++ b/usr/src/cmd/smbsrv/testoplock/smbsrv/smb_ktypes.h @@ -21,7 +21,7 @@ /* * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright 2020 Nexenta by DDN, Inc. All rights reserved. - * Copyright 2021 RackTop Systems, Inc. + * Copyright 2022 RackTop Systems, Inc. */ /* @@ -96,9 +96,11 @@ typedef struct smb_oplock { */ typedef struct smb_oplock_grant { /* smb protocol-level state */ - uint32_t og_state; /* latest sent to client */ - uint32_t og_breaking; /* BREAK_TO... flags */ + uint32_t og_state; /* what client has now */ + uint32_t og_breakto; /* level breaking to */ + boolean_t og_breaking; uint16_t og_dialect; /* how to send breaks */ + kcondvar_t og_ack_cv; /* Wait for ACK */ /* File-system level state */ uint8_t onlist_II; uint8_t onlist_R; @@ -109,6 +111,8 @@ typedef struct smb_oplock_grant { #define SMB_LEASE_KEY_SZ 16 +struct smb_lease; + #define SMB_NODE_MAGIC 0x4E4F4445 /* 'NODE' */ #define SMB_NODE_VALID(p) ASSERT((p)->n_magic == SMB_NODE_MAGIC) diff --git a/usr/src/cmd/smbsrv/testoplock/tol_main.c b/usr/src/cmd/smbsrv/testoplock/tol_main.c index 7691edbca3..8cc81a4343 100644 --- a/usr/src/cmd/smbsrv/testoplock/tol_main.c +++ b/usr/src/cmd/smbsrv/testoplock/tol_main.c @@ -36,6 +36,8 @@ #include <smbsrv/smb_kproto.h> #include <smbsrv/smb_oplock.h> +extern const char *xlate_nt_status(uint32_t); + #define OPLOCK_CACHE_RWH (READ_CACHING | HANDLE_CACHING | WRITE_CACHING) #define OPLOCK_TYPE (LEVEL_TWO_OPLOCK | LEVEL_ONE_OPLOCK |\ BATCH_OPLOCK | OPLOCK_LEVEL_GRANULAR) @@ -48,7 +50,7 @@ smb_request_t test_sr; uint32_t last_ind_break_level; char cmdbuf[100]; -extern const char *xlate_nt_status(uint32_t); +static void run_ind_break_in_ack(smb_ofile_t *); #define BIT_DEF(name) { name, #name } @@ -134,16 +136,20 @@ do_show(void) printf(" ofile_cnt=%d\n", node->n_ofile_list.ll_count); FOREACH_NODE_OFILE(node, f) { smb_oplock_grant_t *og = &f->f_oplock; - printf(" fid=%d Lease=%s OgState=0x%x Brk=0x%x", + printf(" fid=%d Lease=%s State=0x%x", f->f_fid, f->TargetOplockKey, /* lease */ - f->f_oplock.og_state, - f->f_oplock.og_breaking); - printf(" Excl=%s onlist: %s %s %s", - (ol->excl_open == f) ? "Y" : "N", - og->onlist_II ? "II" : "", - og->onlist_R ? "R" : "", - og->onlist_RH ? "RH" : ""); + og->og_state); + if (og->og_breaking) + printf(" BreakTo=0x%x", og->og_breakto); + printf(" Excl=%s onlist:", + (ol->excl_open == f) ? "Y" : "N"); + if (og->onlist_II) + printf(" II"); + if (og->onlist_R) + printf(" R"); + if (og->onlist_RH) + printf(" RH"); if (og->onlist_RHBQ) { printf(" RHBQ(to %s)", og->BreakingToRead ? @@ -224,8 +230,13 @@ do_req(int fid, char *arg2) * Request an oplock */ status = smb_oplock_request(&test_sr, ofile, &oplock); - if (status == 0) + if (status == 0 || + status == NT_STATUS_OPLOCK_BREAK_IN_PROGRESS) { ofile->f_oplock.og_state = oplock; + /* When no break pending, breakto=state */ + ofile->f_oplock.og_breakto = oplock; + ofile->f_oplock.og_breaking = B_FALSE; + } printf(" req oplock fid=%d ret oplock=0x%x status=0x%x (%s)\n", fid, oplock, status, xlate_nt_status(status)); } @@ -249,18 +260,22 @@ do_ack(int fid, char *arg2) ofile->f_oplock.og_breaking = 0; status = smb_oplock_ack_break(&test_sr, ofile, &oplock); - if (NT_SC_SEVERITY(status) == NT_STATUS_SEVERITY_SUCCESS) + if (status == 0) ofile->f_oplock.og_state = oplock; mutex_exit(&node->n_oplock.ol_mutex); smb_llist_exit(&node->n_ofile_list); if (status == NT_STATUS_OPLOCK_BREAK_IN_PROGRESS) { + /* should not get this status */ printf(" ack: break fid=%d, break-in-progress\n", fid); + ASSERT(0); } printf(" ack: break fid=%d, newstate=0x%x, status=0x%x (%s)\n", fid, oplock, status, xlate_nt_status(status)); + + run_ind_break_in_ack(ofile); } static void @@ -335,8 +350,8 @@ do_brk_setinfo(int fid, char *arg2) status = smb_oplock_break_SETINFO( &test_node, ofile, infoclass); - printf(" brk-setinfo %d ret status=0x%x (%s)\n", - fid, status, xlate_nt_status(status)); + printf(" brk-setinfo %d 0x%x ret status=0x%x (%s)\n", + fid, infoclass, status, xlate_nt_status(status)); } @@ -559,47 +574,35 @@ smb_lock_range_access( /* * Test code replacement for combination of: * smb_oplock_hdl_update() - * smb_oplock_send_brk() + * smb_oplock_send_break() + * + * In a real server, we would send a break to the client, + * and keep track (at the SMB level) whether this oplock + * was obtained via a lease or an old-style oplock. */ static void -test_oplock_send_brk(smb_ofile_t *ofile, +test_oplock_send_break(smb_ofile_t *ofile, uint32_t NewLevel, boolean_t AckReq) { smb_oplock_grant_t *og = &ofile->f_oplock; + uint32_t OldLevel; /* Skip building a message. */ if ((og->og_state & OPLOCK_LEVEL_GRANULAR) != 0) NewLevel |= OPLOCK_LEVEL_GRANULAR; - /* - * In a real server, we would send a break to the client, - * and keep track (at the SMB level) whether this oplock - * was obtained via a lease or an old-style oplock. - * - * This part like: smb_oplock_hdl_update() - */ - if (AckReq) { - uint32_t BreakTo; - - if ((og->og_state & OPLOCK_LEVEL_GRANULAR) != 0) { - - BreakTo = (NewLevel & CACHE_RWH) << BREAK_SHIFT; - if (BreakTo == 0) - BreakTo = BREAK_TO_NO_CACHING; - // ls_breaking = BreakTo; - } else { - if ((NewLevel & LEVEL_TWO_OPLOCK) != 0) - BreakTo = BREAK_TO_TWO; - else - BreakTo = BREAK_TO_NONE; - } - og->og_breaking = BreakTo; - /* Set og_state in do_ack */ - } else { + OldLevel = og->og_state; + og->og_breakto = NewLevel; + og->og_breaking = B_TRUE; + + printf("*smb_oplock_send_break fid=%d " + "NewLevel=0x%x, OldLevel=0x%x, AckReq=%d)\n", + ofile->f_fid, NewLevel, OldLevel, AckReq); + + if (!AckReq) { og->og_state = NewLevel; - // If lease: ls_breaking = ... - /* Clear og_breaking in do_ack */ + og->og_breaking = B_FALSE; } /* Next, smb_oplock_send_break() would send a break. */ @@ -629,12 +632,14 @@ smb_oplock_ind_break(smb_ofile_t *ofile, uint32_t NewLevel, case NT_STATUS_SUCCESS: case NT_STATUS_CANNOT_GRANT_REQUESTED_OPLOCK: - test_oplock_send_brk(ofile, NewLevel, AckReq); + test_oplock_send_break(ofile, NewLevel, AckReq); break; case NT_STATUS_OPLOCK_SWITCHED_TO_NEW_HANDLE: case NT_STATUS_OPLOCK_HANDLE_CLOSED: og->og_state = OPLOCK_LEVEL_NONE; + og->og_breakto = OPLOCK_LEVEL_NONE; + og->og_breaking = B_FALSE; break; default: @@ -643,12 +648,42 @@ smb_oplock_ind_break(smb_ofile_t *ofile, uint32_t NewLevel, } } +/* Arrange for break_in_ack to run after ack completes. */ +static uint32_t break_in_ack_NewLevel; +static boolean_t break_in_ack_AckReq; +static boolean_t break_in_ack_called; + void smb_oplock_ind_break_in_ack(smb_request_t *sr, smb_ofile_t *ofile, uint32_t NewLevel, boolean_t AckRequired) { ASSERT(sr == &test_sr); - smb_oplock_ind_break(ofile, NewLevel, AckRequired, STATUS_CANT_GRANT); + + /* Process these after ack */ + ASSERT(!break_in_ack_called); + break_in_ack_called = B_TRUE; + break_in_ack_NewLevel = NewLevel; + break_in_ack_AckReq = AckRequired; +} + +static void +run_ind_break_in_ack(smb_ofile_t *ofile) +{ + uint32_t NewLevel; + boolean_t AckReq; + + /* Process these after ack */ + if (!break_in_ack_called) + return; + break_in_ack_called = B_FALSE; + NewLevel = break_in_ack_NewLevel; + AckReq = break_in_ack_AckReq; + + printf("*smb_oplock_ind_break_in_ack fid=%d NewLevel=0x%x," + " AckReq=%d\n", + ofile->f_fid, NewLevel, AckReq); + + test_oplock_send_break(ofile, NewLevel, AckReq); } uint32_t |