The branch, master has been updated
       via  a187b7ef8fe smbd: Remove share_mode_lease and the leases array from 
share_mode_entry
       via  ad413ce91b3 smbd: Use share_mode_forall_leases in 
share_mode_cleanup_disconnected()
       via  310c85e78fc smbd: Use share_mode_forall_leases in do_break_to_none()
       via  c12641e80dd smbd: Use share_mode_forall_leases in 
rename_share_filename()
       via  302bdd7f913 smbd: Add share_mode_forall_leases()
       via  fbe6b3e900e smbd: Use leases_db in lease_match()
       via  b656ebf54af smbd: Make find_share_mode_lease() static
       via  29ce005f128 smbd: Use leases_db in process_oplock_break_message()
       via  8ff60fcc061 smbd: Use leases_db in vfs_default_durable_reconnect()
       via  274f5d9541d smbd: Use leases_db in downgrade_lease()
       via  7fc76c47867 smbd: Use leases_db in try_lease_upgrade()
       via  7cc9b426a44 smbd: Split up grant_fsp_lease()
       via  fa2cea30917 smbd: Add update_share_mode_lease_from_db()
       via  2ea2605e700 smbd: Don't pass up lease_idx from grant_fsp_lease
       via  552faa910fd smbd: Don't pass lease_idx down to set_share_mode()
       via  c54d27b12c7 utils: Use leases_db in smbstatus
       via  1269bfe47bb smbd: Use leases_db in fsp_lease_update()
       via  b4b941f2af6 smbd: Use leases_db in get_lease_type()
       via  b221487371c smbd: Use leases_db in delay_for_oplock()
       via  c2ca8217245 smbd: Use share_mode_entry's lease data in lease_match()
       via  b9b35947c75 smbd: Use share_mode_entry's lease data in 
vfs_default_durable_reconnect()
       via  9ca5b611575 smbd: Use share_mode_entry's lease data in 
remove_share_mode_lease()
       via  1ae77361483 smbd: Use share_mode_entry's lease data in 
remove_share_mode_lease()
       via  909147e8c16 smbd: Use share_mode_entry's lease data in 
is_same_lease()
       via  f33cb162788 smbd: Use share_mode_entry's lease data in 
delay_rename_for_lease_break()
       via  70fd809db6b smbd: Use share_mode_entry's lease data in 
delay_for_oplock()
       via  10a60df1ccc smbd: Add lease key to share_mode_entry
       via  6cd59da1719 smbd: Use leases_db_set()
       via  5f850a80d2d leases_db: Add getter/setter for share_mode_lease 
metadata
       via  f46023ed702 leases_db: Add share_mode_lease info to leases.tdb
       via  a69db298d44 smbd: Pass lease parameters explicitly to find_fsp_lease
       via  3eed19de048 smbd: Introduce a helper variable in delay_for_oplock()
       via  6e485441a60 smbd: Introduce a helper variable in delay_for_oplock()
       via  b3d0c7e32c9 smbd: Small optimization for break_to_none
      from  98521ce51c6 .gitlab-ci.yml: show the system state also as 
after_script

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit a187b7ef8fe91d227aeda5a2d9d4400d43c9d4ef
Author: Volker Lendecke <[email protected]>
Date:   Wed Sep 19 17:42:51 2018 +0200

    smbd: Remove share_mode_lease and the leases array from share_mode_entry
    
    This also removes the temporary functions introduced during the patchset.
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>
    
    Autobuild-User(master): Christof Schmitt <[email protected]>
    Autobuild-Date(master): Sun Apr 14 05:18:14 UTC 2019 on sn-devel-144

commit ad413ce91b31697f60c31394004272bcd6418596
Author: Volker Lendecke <[email protected]>
Date:   Wed Sep 19 13:22:12 2018 +0200

    smbd: Use share_mode_forall_leases in share_mode_cleanup_disconnected()
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit 310c85e78fc0833373db0c1ccec04f172c8abff6
Author: Volker Lendecke <[email protected]>
Date:   Mon Sep 17 17:01:38 2018 +0200

    smbd: Use share_mode_forall_leases in do_break_to_none()
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit c12641e80dd7b1587cb7961a6f21df679668fba3
Author: Volker Lendecke <[email protected]>
Date:   Mon Sep 17 13:24:56 2018 +0200

    smbd: Use share_mode_forall_leases in rename_share_filename()
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit 302bdd7f9132b64daf65ceddc1658c3f91d7f0c1
Author: Volker Lendecke <[email protected]>
Date:   Mon Sep 17 13:14:22 2018 +0200

    smbd: Add share_mode_forall_leases()
    
    Function to walk all leases for a file exactly once. This used to be simpler
    with the leases[] array, thus this function that encapsulates the 
complexity.
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit fbe6b3e900e5b1f270e33b4c63fd651dfbfd53b8
Author: Volker Lendecke <[email protected]>
Date:   Wed Sep 19 16:31:55 2018 +0200

    smbd: Use leases_db in lease_match()
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit b656ebf54afcd322cc7dcaa1a913a557027840fd
Author: Volker Lendecke <[email protected]>
Date:   Wed Sep 19 12:36:25 2018 +0200

    smbd: Make find_share_mode_lease() static
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit 29ce005f12809f6af5ff2ab5b33af26b25c7063a
Author: Volker Lendecke <[email protected]>
Date:   Tue Sep 18 15:18:15 2018 +0200

    smbd: Use leases_db in process_oplock_break_message()
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit 8ff60fcc0618c3501478831d771e54e9665303ef
Author: Volker Lendecke <[email protected]>
Date:   Wed Sep 19 13:37:23 2018 +0200

    smbd: Use leases_db in vfs_default_durable_reconnect()
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit 274f5d9541de7c61f52d42789c701c212b9caa6b
Author: Volker Lendecke <[email protected]>
Date:   Wed Sep 19 12:05:57 2018 +0200

    smbd: Use leases_db in downgrade_lease()
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit 7fc76c47867460a29ef82b65052a47b13c530a17
Author: Volker Lendecke <[email protected]>
Date:   Tue Sep 18 13:51:01 2018 +0200

    smbd: Use leases_db in try_lease_upgrade()
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit 7cc9b426a44b1e12c6261836d0a86eabb7c92c34
Author: Volker Lendecke <[email protected]>
Date:   Tue Sep 18 13:00:49 2018 +0200

    smbd: Split up grant_fsp_lease()
    
    Simple refactoring into simpler routines. View best with "git show -b"
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit fa2cea30917667e1f8f084c33cbbbd564f02e452
Author: Volker Lendecke <[email protected]>
Date:   Wed Sep 19 10:25:31 2018 +0200

    smbd: Add update_share_mode_lease_from_db()
    
    This is an interim function supposed to be around for just a few patches as
    long as we have both the leases.tdb entries and the leases[] in
    share_mode_entries around. It makes it easier to transition to just use
    leases.tdb while keeping the code running.
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit 2ea2605e7002508aa952899fb8f81e4e62684767
Author: Volker Lendecke <[email protected]>
Date:   Tue Sep 18 11:37:28 2018 +0200

    smbd: Don't pass up lease_idx from grant_fsp_lease
    
    The only reason for grant_fsp_lease to return the lease_idx was to pass it 
down
    to set_share_mode. That does not need it anymore.
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit 552faa910fdcfb95602440096ec3fac9e6015177
Author: Volker Lendecke <[email protected]>
Date:   Tue Sep 18 11:31:27 2018 +0200

    smbd: Don't pass lease_idx down to set_share_mode()
    
    Temporary patch to keep the code running. The new code in set_share_mode() 
will
    leave again once the patchset to remove share_mode_lease and thus the 
lease_idx
    in share_mode_entry goes away.
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit c54d27b12c7a978671fcea752da552d84a7e3668
Author: Volker Lendecke <[email protected]>
Date:   Wed Sep 19 12:52:46 2018 +0200

    utils: Use leases_db in smbstatus
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit 1269bfe47bb0f5a19e8e54f01de375cc0a43191e
Author: Volker Lendecke <[email protected]>
Date:   Wed Apr 10 16:38:28 2019 +0200

    smbd: Use leases_db in fsp_lease_update()
    
    Remove a reference to "struct share_mode_lease"
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit b4b941f2af601482725ae826b77b863200fee604
Author: Volker Lendecke <[email protected]>
Date:   Thu Sep 13 12:48:30 2018 +0200

    smbd: Use leases_db in get_lease_type()
    
    Remove a reference to share_mode_data->leases[]
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit b221487371cd1e953b2919be67a190626ba28399
Author: Volker Lendecke <[email protected]>
Date:   Thu Sep 13 12:48:30 2018 +0200

    smbd: Use leases_db in delay_for_oplock()
    
    Remove a reference to share_mode_data->leases[]
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit c2ca82172457bd369715398aa7fda2af4e23f61f
Author: Volker Lendecke <[email protected]>
Date:   Wed Apr 10 21:54:27 2019 +0200

    smbd: Use share_mode_entry's lease data in lease_match()
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit b9b35947c75d7aafb303535de37854d90f4f8b76
Author: Volker Lendecke <[email protected]>
Date:   Wed Apr 10 21:34:24 2019 +0200

    smbd: Use share_mode_entry's lease data in vfs_default_durable_reconnect()
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit 9ca5b611575e01467fe1651d06b843a7be50ae5b
Author: Volker Lendecke <[email protected]>
Date:   Wed Sep 19 16:39:31 2018 +0200

    smbd: Use share_mode_entry's lease data in remove_share_mode_lease()
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit 1ae773614830e9142cc1a0bb8dfc94b3f7d21ad7
Author: Volker Lendecke <[email protected]>
Date:   Wed Sep 19 14:14:32 2018 +0200

    smbd: Use share_mode_entry's lease data in remove_share_mode_lease()
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit 909147e8c16731b786a1d6eae549d53737c2369e
Author: Volker Lendecke <[email protected]>
Date:   Wed Sep 19 14:29:23 2018 +0200

    smbd: Use share_mode_entry's lease data in is_same_lease()
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit f33cb162788397863e03e8288f34aa32c345cee5
Author: Volker Lendecke <[email protected]>
Date:   Thu Sep 13 19:11:22 2018 +0200

    smbd: Use share_mode_entry's lease data in delay_rename_for_lease_break()
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit 70fd809db6b3d67077e42338e1b68310754278e2
Author: Volker Lendecke <[email protected]>
Date:   Wed Apr 10 14:05:15 2019 +0200

    smbd: Use share_mode_entry's lease data in delay_for_oplock()
    
    This was the last "share_mode_lease" reference in this function, remove
    variable "l".
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit 10a60df1ccc5e5992c63802861589fb81372f64e
Author: Volker Lendecke <[email protected]>
Date:   Thu Sep 13 12:47:55 2018 +0200

    smbd: Add lease key to share_mode_entry
    
    Instead of indexing into the leases[] array, put the lease_db reference into
    the share_mode_entry. For simplicity, put in the client guid as well. We
    *might* be able to retrieve that from somewhere else, but as other smbd
    processes have to look at the lease values, put in the full leases_db index
    data.
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit 6cd59da1719e3f4830a7cea5db4347bf9e319b92
Author: Volker Lendecke <[email protected]>
Date:   Mon Apr 8 16:21:41 2019 +0200

    smbd: Use leases_db_set()
    
    Whenever we update the share_mode_lease struct, also update the leases.tdb
    entry.
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit 5f850a80d2d83838fd713a6b19e716ec47b86bbf
Author: Volker Lendecke <[email protected]>
Date:   Tue Sep 11 16:23:38 2018 +0200

    leases_db: Add getter/setter for share_mode_lease metadata
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit f46023ed7021880612150d762540fda656c89b74
Author: Volker Lendecke <[email protected]>
Date:   Tue Sep 11 16:13:24 2018 +0200

    leases_db: Add share_mode_lease info to leases.tdb
    
    This is the data stored in share_mode_lease inside the leases[] array in
    locking.tdb. This and all the following patches move all leases array to
    looking at the leases.tdb.
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit a69db298d440f38fdc2e222d01ecf8d52e0dcc0a
Author: Volker Lendecke <[email protected]>
Date:   Tue Sep 18 09:55:51 2018 +0200

    smbd: Pass lease parameters explicitly to find_fsp_lease
    
    This avoids a use of "struct share_mode_lease"
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit 3eed19de04887bec8a01af55eb33acc89ef80b7c
Author: Volker Lendecke <[email protected]>
Date:   Wed Apr 10 15:14:38 2019 +0200

    smbd: Introduce a helper variable in delay_for_oplock()
    
    This removes a few explicit share_mode_lease dereferences
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit 6e485441a60f75e8500541ba9790e55f5a86041f
Author: Volker Lendecke <[email protected]>
Date:   Wed Apr 10 14:19:30 2019 +0200

    smbd: Introduce a helper variable in delay_for_oplock()
    
    Why? I am preparing a patchset that will remove
    "share_mode_lease". This patch is a micro-step towards that, removing
    a set of references to this struct.
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

commit b3d0c7e32c9b56dad9003f6bbb067da4aa0a6753
Author: Volker Lendecke <[email protected]>
Date:   Tue Apr 9 16:34:24 2019 +0200

    smbd: Small optimization for break_to_none
    
    We don't need to memzero the struct when we can struct-initialize it a
    bit later, implicitly initializing the rest to zero.
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Christof Schmitt <[email protected]>

-----------------------------------------------------------------------

Summary of changes:
 source3/librpc/idl/leases_db.idl  |  26 +++
 source3/librpc/idl/open_files.idl |  35 +---
 source3/locking/leases_db.c       | 185 ++++++++++++++++++
 source3/locking/leases_db.h       |  20 ++
 source3/locking/locking.c         | 191 ++++++++++++------
 source3/locking/proto.h           |  16 +-
 source3/locking/share_mode_lock.c |  40 +++-
 source3/smbd/durable.c            |  47 +++--
 source3/smbd/open.c               | 313 +++++++++++++++++------------
 source3/smbd/oplock.c             | 401 +++++++++++++++++++++++++-------------
 source3/smbd/proto.h              |  10 +-
 source3/smbd/smb2_setinfo.c       |   7 +-
 source3/utils/status.c            |  35 +++-
 13 files changed, 922 insertions(+), 404 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/librpc/idl/leases_db.idl b/source3/librpc/idl/leases_db.idl
index d0218756ade..ed9f27643ab 100644
--- a/source3/librpc/idl/leases_db.idl
+++ b/source3/librpc/idl/leases_db.idl
@@ -22,6 +22,32 @@ interface leases_db
        } leases_db_file;
 
        typedef [public] struct {
+               smb2_lease_state        current_state;
+               /*
+                * 'breaking' indicates that we're waiting
+                * for a lease break ack from the client
+                * and breaking_to_requested and breaking_to_required
+                * have a meaning.
+                *
+                * breaking_to_requested is the value already sent to
+                * the client, the client needs to ack to this (or less).
+                *
+                * breaking_to_required is the internal value that needs to
+                * be reached before we can reset breaking = false, this
+                * may requires multiple roundtrips to the client, e.g.
+                * when the lease broken to a more reduced value, while
+                * the lease break is still in progress.
+                *
+                * The following can be assumed (if breaking == true):
+                *
+                * current_state>breaking_to_requested>=breaking_to_required
+                */
+               boolean8                breaking;
+               smb2_lease_state        breaking_to_requested;
+               smb2_lease_state        breaking_to_required;
+               uint16                  lease_version;
+               uint16                  epoch;
+
                uint32 num_files;
                [size_is(num_files)] leases_db_file files[];
        } leases_db_value;
diff --git a/source3/librpc/idl/open_files.idl 
b/source3/librpc/idl/open_files.idl
index c07a903878e..2f6f861b5e6 100644
--- a/source3/librpc/idl/open_files.idl
+++ b/source3/librpc/idl/open_files.idl
@@ -12,41 +12,12 @@ import "misc.idl";
 
 interface open_files
 {
-       typedef [public,flag(NDR_PAHEX)] struct {
-               GUID                    client_guid;
-               smb2_lease_key          lease_key;
-               smb2_lease_state        current_state;
-               /*
-                * 'breaking' indicates that we're waiting
-                * for a lease break ack from the client
-                * and breaking_to_requested and breaking_to_required
-                * have a meaning.
-                *
-                * breaking_to_requested is the value already sent to
-                * the client, the client needs to ack to this (or less).
-                *
-                * breaking_to_required is the internal value that needs to
-                * be reached before we can reset breaking = false, this
-                * may requires multiple roundtrips to the client, e.g.
-                * when the lease broken to a more reduced value, while
-                * the lease break is still in progress.
-                *
-                * The following can be assumed (if breaking == true):
-                *
-                * current_state > breaking_to_requested >= breaking_to_required
-                */
-               boolean8                breaking;
-               smb2_lease_state        breaking_to_requested;
-               smb2_lease_state        breaking_to_required;
-               uint16                  lease_version;
-               uint16                  epoch;
-       } share_mode_lease;
-
        typedef [public] struct {
                server_id       pid;
                hyper           op_mid;
                uint16          op_type;
-               uint32          lease_idx;
+               GUID            client_guid;
+               smb2_lease_key  lease_key;
                uint32          access_mask;
                uint32          share_access;
                uint32          private_options;
@@ -76,8 +47,6 @@ interface open_files
                [string,charset(UTF8)] char *stream_name;
                uint32 num_share_modes;
                [size_is(num_share_modes)] share_mode_entry share_modes[];
-               uint32 num_leases;
-               [size_is(num_leases)] share_mode_lease leases[];
                uint32 num_delete_tokens;
                [size_is(num_delete_tokens)] delete_token delete_tokens[];
                timespec old_write_time;
diff --git a/source3/locking/leases_db.c b/source3/locking/leases_db.c
index 3893841b172..17778050acc 100644
--- a/source3/locking/leases_db.c
+++ b/source3/locking/leases_db.c
@@ -196,6 +196,9 @@ static NTSTATUS leases_db_do_locked(
 
 struct leases_db_add_state {
        const struct file_id *id;
+       uint32_t current_state;
+       uint16_t lease_version;
+       uint16_t epoch;
        const char *servicepath;
        const char *base_name;
        const char *stream_name;
@@ -217,6 +220,13 @@ static void leases_db_add_fn(
                }
        }
 
+       if (value->num_files == 0) {
+               /* new record */
+               value->current_state = state->current_state;
+               value->lease_version = state->lease_version;
+               value->epoch = state->epoch;
+       }
+
        tmp = talloc_realloc(
                value,
                value->files,
@@ -242,12 +252,18 @@ static void leases_db_add_fn(
 NTSTATUS leases_db_add(const struct GUID *client_guid,
                       const struct smb2_lease_key *lease_key,
                       const struct file_id *id,
+                      uint32_t current_state,
+                      uint16_t lease_version,
+                      uint16_t epoch,
                       const char *servicepath,
                       const char *base_name,
                       const char *stream_name)
 {
        struct leases_db_add_state state = {
                .id = id,
+               .current_state = current_state,
+               .lease_version = lease_version,
+               .epoch = epoch,
                .servicepath = servicepath,
                .base_name = base_name,
                .stream_name = stream_name,
@@ -443,6 +459,175 @@ NTSTATUS leases_db_rename(const struct GUID *client_guid,
        return state.status;
 }
 
+struct leases_db_set_state {
+       uint32_t current_state;
+       bool breaking;
+       uint32_t breaking_to_requested;
+       uint32_t breaking_to_required;
+       uint16_t lease_version;
+       uint16_t epoch;
+};
+
+static void leases_db_set_fn(
+       struct leases_db_value *value, bool *modified, void *private_data)
+{
+       struct leases_db_set_state *state = private_data;
+
+       if (value->num_files == 0) {
+               DBG_WARNING("leases_db_set on new entry\n");
+               return;
+       }
+       value->current_state = state->current_state;
+       value->breaking = state->breaking;
+       value->breaking_to_requested = state->breaking_to_requested;
+       value->breaking_to_required = state->breaking_to_required;
+       value->lease_version = state->lease_version;
+       value->epoch = state->epoch;
+       *modified = true;
+}
+
+NTSTATUS leases_db_set(const struct GUID *client_guid,
+                      const struct smb2_lease_key *lease_key,
+                      uint32_t current_state,
+                      bool breaking,
+                      uint32_t breaking_to_requested,
+                      uint32_t breaking_to_required,
+                      uint16_t lease_version,
+                      uint16_t epoch)
+{
+       struct leases_db_set_state state = {
+               .current_state = current_state,
+               .breaking = breaking,
+               .breaking_to_requested = breaking_to_requested,
+               .breaking_to_required = breaking_to_required,
+               .lease_version = lease_version,
+               .epoch = epoch,
+       };
+       NTSTATUS status;
+
+       status = leases_db_do_locked(
+               client_guid, lease_key, leases_db_set_fn, &state);
+       if (!NT_STATUS_IS_OK(status)) {
+               DBG_DEBUG("leases_db_do_locked failed: %s\n",
+                         nt_errstr(status));
+               return status;
+       }
+       return NT_STATUS_OK;
+}
+
+struct leases_db_get_state {
+       const struct file_id *file_id;
+       uint32_t *current_state;
+       bool *breaking;
+       uint32_t *breaking_to_requested;
+       uint32_t *breaking_to_required;
+       uint16_t *lease_version;
+       uint16_t *epoch;
+       NTSTATUS status;
+};
+
+static void leases_db_get_fn(TDB_DATA key, TDB_DATA data, void *private_data)
+{
+       struct leases_db_get_state *state = private_data;
+       DATA_BLOB blob = { .data = data.dptr, .length = data.dsize };
+       enum ndr_err_code ndr_err;
+       struct leases_db_value *value;
+       uint32_t i;
+
+       value = talloc(talloc_tos(), struct leases_db_value);
+       if (value == NULL) {
+               state->status = NT_STATUS_NO_MEMORY;
+               return;
+       }
+
+       ndr_err = ndr_pull_struct_blob_all(
+               &blob, value, value,
+               (ndr_pull_flags_fn_t)ndr_pull_leases_db_value);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               DBG_DEBUG("ndr_pull_struct_blob_failed: %s\n",
+                         ndr_errstr(ndr_err));
+               TALLOC_FREE(value);
+               state->status = ndr_map_error2ntstatus(ndr_err);
+               return;
+       }
+
+       if (DEBUGLEVEL >= 10) {
+               DBG_DEBUG("\n");
+               NDR_PRINT_DEBUG(leases_db_value, value);
+       }
+
+       /* id must exist. */
+       for (i = 0; i < value->num_files; i++) {
+               if (file_id_equal(state->file_id, &value->files[i].id)) {
+                       break;
+               }
+       }
+
+       if (i == value->num_files) {
+               state->status = NT_STATUS_NOT_FOUND;
+               TALLOC_FREE(value);
+               return;
+       }
+
+       if (state->current_state != NULL) {
+               *state->current_state = value->current_state;
+       };
+       if (state->breaking != NULL) {
+               *state->breaking = value->breaking;
+       };
+       if (state->breaking_to_requested != NULL) {
+               *state->breaking_to_requested = value->breaking_to_requested;
+       };
+       if (state->breaking_to_required != NULL) {
+               *state->breaking_to_required = value->breaking_to_required;
+       };
+       if (state->lease_version != NULL) {
+               *state->lease_version = value->lease_version;
+       };
+       if (state->epoch != NULL) {
+               *state->epoch = value->epoch;
+       };
+
+       TALLOC_FREE(value);
+       state->status = NT_STATUS_OK;
+}
+
+NTSTATUS leases_db_get(const struct GUID *client_guid,
+                      const struct smb2_lease_key *lease_key,
+                      const struct file_id *file_id,
+                      uint32_t *current_state,
+                      bool *breaking,
+                      uint32_t *breaking_to_requested,
+                      uint32_t *breaking_to_required,
+                      uint16_t *lease_version,
+                      uint16_t *epoch)
+{
+       struct leases_db_get_state state = {
+               .file_id = file_id,
+               .current_state = current_state,
+               .breaking = breaking,
+               .breaking_to_requested = breaking_to_requested,
+               .breaking_to_required = breaking_to_required,
+               .lease_version = lease_version,
+               .epoch = epoch,
+       };
+       struct leases_db_key_buf keybuf;
+       TDB_DATA db_key = leases_db_key(&keybuf, client_guid, lease_key);
+       NTSTATUS status;
+
+       if (!leases_db_init(true)) {
+               return NT_STATUS_INTERNAL_ERROR;
+       }
+
+       status = dbwrap_parse_record(
+               leases_db, db_key, leases_db_get_fn, &state);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+       return state.status;
+
+}
+
 NTSTATUS leases_db_copy_file_ids(TALLOC_CTX *mem_ctx,
                        uint32_t num_files,
                        const struct leases_db_file *files,
diff --git a/source3/locking/leases_db.h b/source3/locking/leases_db.h
index 383575a2d88..99a4a78315c 100644
--- a/source3/locking/leases_db.h
+++ b/source3/locking/leases_db.h
@@ -30,6 +30,9 @@ bool leases_db_init(bool read_only);
 NTSTATUS leases_db_add(const struct GUID *client_guid,
                       const struct smb2_lease_key *lease_key,
                       const struct file_id *id,
+                      uint32_t current_state,
+                      uint16_t lease_version,
+                      uint16_t epoch,
                       const char *servicepath,
                       const char *filename,
                       const char *stream_name);
@@ -48,6 +51,23 @@ NTSTATUS leases_db_rename(const struct GUID *client_guid,
                        const char *servicepath_new,
                        const char *filename_new,
                        const char *stream_name_new);
+NTSTATUS leases_db_set(const struct GUID *client_guid,
+                      const struct smb2_lease_key *lease_key,
+                      uint32_t current_state,
+                      bool breaking,
+                      uint32_t breaking_to_requested,
+                      uint32_t breaking_to_required,
+                      uint16_t lease_version,
+                      uint16_t epoch);
+NTSTATUS leases_db_get(const struct GUID *client_guid,
+                      const struct smb2_lease_key *lease_key,
+                      const struct file_id *file_id,
+                      uint32_t *current_state,
+                      bool *breaking,
+                      uint32_t *breaking_to_requested,
+                      uint32_t *breaking_to_required,
+                      uint16_t *lease_version,
+                      uint16_t *epoch);
 NTSTATUS leases_db_copy_file_ids(TALLOC_CTX *mem_ctx,
                        uint32_t num_files,
                        const struct leases_db_file *files,
diff --git a/source3/locking/locking.c b/source3/locking/locking.c
index d4c3b32be7f..10e9606d134 100644
--- a/source3/locking/locking.c
+++ b/source3/locking/locking.c
@@ -459,6 +459,32 @@ struct share_mode_lock 
*get_existing_share_mode_lock(TALLOC_CTX *mem_ctx,
        return get_share_mode_lock(mem_ctx, id, NULL, NULL, NULL);
 }
 
+static bool rename_lease_fn(struct share_mode_lock *lck,
+                           struct share_mode_entry *e,
+                           void *private_data)
+{
+       struct share_mode_data *d = lck->data;
+       NTSTATUS status;
+
+       status = leases_db_rename(&e->client_guid,
+                                 &e->lease_key,
+                                 &d->id,
+                                 d->servicepath,
+                                 d->base_name,
+                                 d->stream_name);
+
+       if (!NT_STATUS_IS_OK(status)) {
+               /* Any error recovery possible here ? */
+               DBG_WARNING("Failed to rename lease key for "
+                           "renamed file %s:%s. %s\n",
+                           d->base_name,
+                           d->stream_name,
+                           nt_errstr(status));
+       }
+
+       return false;
+}
+
 /*******************************************************************
  Sets the service name and filename for rename.
  At this point we emit "file renamed" messages to all
@@ -484,6 +510,7 @@ bool rename_share_filename(struct messaging_context 
*msg_ctx,
        bool strip_two_chars = false;
        bool has_stream = smb_fname_dst->stream_name != NULL;
        struct server_id self_pid = messaging_server_id(msg_ctx);
+       bool ok;
 
        DEBUG(10, ("rename_share_filename: servicepath %s newname %s\n",
                   servicepath, smb_fname_dst->base_name));
@@ -576,28 +603,12 @@ bool rename_share_filename(struct messaging_context 
*msg_ctx,
                                   (uint8_t *)frm, msg_len);
        }
 
-       for (i=0; i<d->num_leases; i++) {
-               /* Update the filename in leases_db. */
-               NTSTATUS status;
-               struct share_mode_lease *l;
-
-               l = &d->leases[i];
-
-               status = leases_db_rename(&l->client_guid,
-                                       &l->lease_key,
-                                       &id,
-                                       d->servicepath,
-                                       d->base_name,
-                                       d->stream_name);
-               if (!NT_STATUS_IS_OK(status)) {
-                       /* Any error recovery possible here ? */
-                       DEBUG(1,("Failed to rename lease key for "
-                               "renamed file %s:%s. %s\n",
-                               d->base_name,
-                               d->stream_name,
-                               nt_errstr(status)));
-                       continue;
-               }
+       ok = share_mode_forall_leases(lck, rename_lease_fn, NULL);
+       if (!ok) {
+               /*
+                * Ignore error here. Not sure what to do..
+                */
+               DBG_WARNING("share_mode_forall_leases failed\n");
        }
 
        return True;
@@ -660,10 +671,7 @@ bool is_valid_share_mode_entry(const struct 
share_mode_entry *e)
 static void remove_share_mode_lease(struct share_mode_data *d,
                                    struct share_mode_entry *e)
 {
-       struct GUID client_guid;
-       struct smb2_lease_key lease_key;
        uint16_t op_type;
-       uint32_t lease_idx;
        uint32_t i;
 
        op_type = e->op_type;
@@ -680,18 +688,20 @@ static void remove_share_mode_lease(struct 
share_mode_data *d,
         * it, remove it.
         */
 
-       lease_idx = e->lease_idx;
-       e->lease_idx = UINT32_MAX;
-
        for (i=0; i<d->num_share_modes; i++) {
-               if (d->share_modes[i].stale) {
+               struct share_mode_entry *e2 = &d->share_modes[i];
+
+               if (e2->stale) {
                        continue;
                }
-               if (e == &d->share_modes[i]) {
+               if (e == e2) {
                        /* Not ourselves. */
                        continue;
                }
-               if (d->share_modes[i].lease_idx == lease_idx) {
+               if (smb2_lease_equal(&e->client_guid,
+                                    &e->lease_key,
+                                    &e2->client_guid,
+                                    &e2->lease_key)) {
                        break;
                }
        }
@@ -702,29 +712,12 @@ static void remove_share_mode_lease(struct 
share_mode_data *d,
                return;
        }
 
-       memcpy(&client_guid,
-               &d->leases[lease_idx].client_guid,
-               sizeof(client_guid));
-       lease_key = d->leases[lease_idx].lease_key;
-
-       d->num_leases -= 1;
-       d->leases[lease_idx] = d->leases[d->num_leases];
-
-       /*
-        * We changed the lease array. Fix all references to it.
-        */
-       for (i=0; i<d->num_share_modes; i++) {
-               if (d->share_modes[i].lease_idx == d->num_leases) {
-                       d->share_modes[i].lease_idx = lease_idx;
-               }
-       }
-
        {
                NTSTATUS status;
 
-               status = leases_db_del(&client_guid,
-                                       &lease_key,
-                                       &d->id);


-- 
Samba Shared Repository

Reply via email to