[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Fri Aug 19 19:40:01 UTC 2022


The branch, master has been updated
       via  d4f18f99d3a s3:smbd: let delay_for_oplock_fn() only call leases_db_get() once
       via  60ae7a5a2ed s3:smbd: lease_match_break_fn() only needs leases_db_get() once
       via  76da56aa65b s3:smbd: inline fsp_lease_type_is_exclusive() logic into contend_level2_oplocks_begin_default
       via  bf8f2258497 s3:locking: move get_existing_share_mode_lock() to share_mode_lock.[ch]
       via  8b3b3166802 s3:locking: pass lease_key explicitly to set_share_mode()
       via  0fbca175ae4 s3:smbd: only run validate_oplock_types() with smbd:validate_oplock_types = yes
       via  c75de325710 s3:g_lock: avoid useless talloc_array(0) in g_lock_dump()
       via  bb3dddcdf11 s3:g_lock: add some const to the shared array passed via g_lock_dump*()
       via  bf1dd1a188c lib/util: add unlikely() to SMB_ASSERT()
      from  06f35edaf12 lib: Map ERANGE to NT_STATUS_INTEGER_OVERFLOW

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


- Log -----------------------------------------------------------------
commit d4f18f99d3a40a8df00beb006e2731959aa6fad9
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Aug 15 09:56:15 2022 +0200

    s3:smbd: let delay_for_oplock_fn() only call leases_db_get() once
    
    get_lease_type() will just call leases_db_get() again for leases,
    so only call it for oplocks.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15125
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Fri Aug 19 19:39:18 UTC 2022 on sn-devel-184

commit 60ae7a5a2ed9a03d8693b9b455b7b3696386aeb1
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Aug 15 09:45:43 2022 +0200

    s3:smbd: lease_match_break_fn() only needs leases_db_get() once
    
    get_lease_type() will just call leases_db_get() again...
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15125
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 76da56aa65bb9fe7f2f8c4a2e30e278a61db1ff5
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Aug 18 12:52:54 2022 +0200

    s3:smbd: inline fsp_lease_type_is_exclusive() logic into contend_level2_oplocks_begin_default
    
    SMB2_LEASE_WRITE is the indication for an exclusive lease,
    the fact that a SMB2_LEASE_WRITE can't exists without
    SMB2_LEASE_READ is not important here.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15125
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit bf8f2258497f7d2a5a5f8d1cacf1a30899ed455c
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Aug 18 14:14:20 2022 +0200

    s3:locking: move get_existing_share_mode_lock() to share_mode_lock.[ch]
    
    This should be where get_share_mode_lock() is located.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15125
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 8b3b316680221487f84a7cfe14f52e8ffd64ba85
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Aug 10 08:27:15 2022 +0000

    s3:locking: pass lease_key explicitly to set_share_mode()
    
    We should avoid accessing fsp->lease if possible.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15125
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 0fbca175ae4763d82f8a414ee3d6354c95d5294e
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Aug 19 15:17:41 2022 +0000

    s3:smbd: only run validate_oplock_types() with smbd:validate_oplock_types = yes
    
    This is really expensive as share_mode_forall_entries() is currently
    doing a talloc_memdup() of the whole record...
    
    This is mainly used to avoid regressions, so only
    use smbd:validate_oplock_types = yes in make test,
    but skip it for production.
    
    This improves the following test:
    
     time smbtorture //127.0.0.1/m -Uroot%test \
            smb2.create.bench-path-contention-shared \
            --option='torture:bench_path=file.dat' \
            --option="torture:timelimit=60" \
            --option="torture:nprocs=256" \
            --option="torture:qdepth=1"
    
    From:
    
       open[num/s=8852,avslat=0.014999,minlat=0.000042,maxlat=0.054600]
       close[num/s=8850,avslat=0.014136,minlat=0.000025,maxlat=0.054537]
    
    to:
    
       open[num/s=11377,avslat=0.012075,minlat=0.000041,maxlat=0.054107]
       close[num/s=11375,avslat=0.010594,minlat=0.000023,maxlat=0.053620]
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15125
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit c75de325710c0fbbd50a0acd3af55404165440d6
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Aug 18 17:32:43 2022 +0200

    s3:g_lock: avoid useless talloc_array(0) in g_lock_dump()
    
    In the common case we don't have any shared lock holders,
    so there's no need to allocate memory for the empty array.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15125
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit bb3dddcdf11e6c2f5319d64bf2ef20636d0ed82f
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Aug 18 17:52:33 2022 +0200

    s3:g_lock: add some const to the shared array passed via g_lock_dump*()
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15125
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit bf1dd1a188c096093bedc628a14bb037e3209630
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Aug 18 16:06:02 2022 +0200

    lib/util: add unlikely() to SMB_ASSERT()
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=15125
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

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

Summary of changes:
 lib/util/fault.h                  |  2 +-
 selftest/target/Samba3.pm         |  1 +
 selftest/target/Samba4.pm         |  1 +
 source3/include/g_lock.h          |  4 ++--
 source3/lib/g_lock.c              | 20 +++++++++++---------
 source3/locking/leases_util.c     | 17 -----------------
 source3/locking/locking.c         | 11 -----------
 source3/locking/proto.h           |  3 ---
 source3/locking/share_mode_lock.c | 30 +++++++++++++++++++++---------
 source3/locking/share_mode_lock.h |  4 ++++
 source3/smbd/open.c               | 32 +++++++++++++++++++++++++++-----
 source3/smbd/server.c             |  2 +-
 source3/smbd/smb2_oplock.c        |  3 ++-
 source3/smbd/smbd.h               |  1 +
 source3/torture/test_g_lock.c     | 12 ++++++------
 source3/utils/net_g_lock.c        |  2 +-
 16 files changed, 79 insertions(+), 66 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/util/fault.h b/lib/util/fault.h
index f3b1666a172..6aceaf6dabc 100644
--- a/lib/util/fault.h
+++ b/lib/util/fault.h
@@ -33,7 +33,7 @@
 #ifdef _SAMBA_DEBUG_H
 #define SMB_ASSERT(b) \
 do { \
-	if (!(b)) { \
+	if (unlikely(!(b))) { \
 		DEBUG(0,("PANIC: assert failed at %s(%d): %s\n", \
 			 __FILE__, __LINE__, #b)); \
 		smb_panic("assert failed: " #b); \
diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm
index 88898807428..d413f14bacd 100755
--- a/selftest/target/Samba3.pm
+++ b/selftest/target/Samba3.pm
@@ -2772,6 +2772,7 @@ sub provision($$)
 	panic action = cd $self->{srcdir} && $self->{srcdir}/selftest/gdb_backtrace %d %\$(MAKE_TEST_BINARY)
 	smbd:suicide mode = yes
 	smbd:FSCTL_SMBTORTURE = yes
+	smbd:validate_oplock_types = yes
 
 	client min protocol = SMB2_02
 	server min protocol = SMB2_02
diff --git a/selftest/target/Samba4.pm b/selftest/target/Samba4.pm
index 1762ae4ae79..e5ae57cb7fc 100755
--- a/selftest/target/Samba4.pm
+++ b/selftest/target/Samba4.pm
@@ -778,6 +778,7 @@ sub provision_raw_step1($$)
 	panic action = $RealBin/gdb_backtrace \%d
 	smbd:suicide mode = yes
 	smbd:FSCTL_SMBTORTURE = yes
+	smbd:validate_oplock_types = yes
 	wins support = yes
 	server role = $ctx->{server_role}
 	server services = +echo $services
diff --git a/source3/include/g_lock.h b/source3/include/g_lock.h
index 3a94879d209..749cb57ed45 100644
--- a/source3/include/g_lock.h
+++ b/source3/include/g_lock.h
@@ -71,7 +71,7 @@ struct tevent_req *g_lock_dump_send(
 	TDB_DATA key,
 	void (*fn)(struct server_id exclusive,
 		   size_t num_shared,
-		   struct server_id *shared,
+		   const struct server_id *shared,
 		   const uint8_t *data,
 		   size_t datalen,
 		   void *private_data),
@@ -81,7 +81,7 @@ NTSTATUS g_lock_dump(struct g_lock_ctx *ctx,
 		     TDB_DATA key,
 		     void (*fn)(struct server_id exclusive,
 				size_t num_shared,
-				struct server_id *shared,
+				const struct server_id *shared,
 				const uint8_t *data,
 				size_t datalen,
 				void *private_data),
diff --git a/source3/lib/g_lock.c b/source3/lib/g_lock.c
index d683c4ddee6..8a07949b3d9 100644
--- a/source3/lib/g_lock.c
+++ b/source3/lib/g_lock.c
@@ -1210,7 +1210,7 @@ struct g_lock_dump_state {
 	TDB_DATA key;
 	void (*fn)(struct server_id exclusive,
 		   size_t num_shared,
-		   struct server_id *shared,
+		   const struct server_id *shared,
 		   const uint8_t *data,
 		   size_t datalen,
 		   void *private_data);
@@ -1238,12 +1238,14 @@ static void g_lock_dump_fn(TDB_DATA key, TDB_DATA data,
 		return;
 	}
 
-	shared = talloc_array(
-		state->mem_ctx, struct server_id, lck.num_shared);
-	if (shared == NULL) {
-		DBG_DEBUG("talloc failed\n");
-		state->status = NT_STATUS_NO_MEMORY;
-		return;
+	if (lck.num_shared > 0) {
+		shared = talloc_array(
+			state->mem_ctx, struct server_id, lck.num_shared);
+		if (shared == NULL) {
+			DBG_DEBUG("talloc failed\n");
+			state->status = NT_STATUS_NO_MEMORY;
+			return;
+		}
 	}
 
 	for (i=0; i<lck.num_shared; i++) {
@@ -1265,7 +1267,7 @@ static void g_lock_dump_fn(TDB_DATA key, TDB_DATA data,
 NTSTATUS g_lock_dump(struct g_lock_ctx *ctx, TDB_DATA key,
 		     void (*fn)(struct server_id exclusive,
 				size_t num_shared,
-				struct server_id *shared,
+				const struct server_id *shared,
 				const uint8_t *data,
 				size_t datalen,
 				void *private_data),
@@ -1300,7 +1302,7 @@ struct tevent_req *g_lock_dump_send(
 	TDB_DATA key,
 	void (*fn)(struct server_id exclusive,
 		   size_t num_shared,
-		   struct server_id *shared,
+		   const struct server_id *shared,
 		   const uint8_t *data,
 		   size_t datalen,
 		   void *private_data),
diff --git a/source3/locking/leases_util.c b/source3/locking/leases_util.c
index cb62bffbd7d..9ae4081cd7b 100644
--- a/source3/locking/leases_util.c
+++ b/source3/locking/leases_util.c
@@ -71,23 +71,6 @@ uint32_t fsp_lease_type(struct files_struct *fsp)
 	return fsp->lease_type;
 }
 
-static uint32_t lease_type_is_exclusive(uint32_t lease_type)
-{
-	if ((lease_type & (SMB2_LEASE_READ | SMB2_LEASE_WRITE)) ==
-	    (SMB2_LEASE_READ | SMB2_LEASE_WRITE)) {
-		return true;
-	}
-
-	return false;
-}
-
-bool fsp_lease_type_is_exclusive(struct files_struct *fsp)
-{
-	uint32_t lease_type = fsp_lease_type(fsp);
-
-	return lease_type_is_exclusive(lease_type);
-}
-
 const struct GUID *fsp_client_guid(const files_struct *fsp)
 {
 	return &fsp->conn->sconn->client->global->client_guid;
diff --git a/source3/locking/locking.c b/source3/locking/locking.c
index b002e80fee4..befdc10f369 100644
--- a/source3/locking/locking.c
+++ b/source3/locking/locking.c
@@ -468,17 +468,6 @@ char *share_mode_str(TALLOC_CTX *ctx, int num,
 		 (unsigned int)e->name_hash);
 }
 
-/*******************************************************************
- Fetch a share mode where we know one MUST exist. This call reference
- counts it internally to allow for nested lock fetches.
-********************************************************************/
-
-struct share_mode_lock *get_existing_share_mode_lock(TALLOC_CTX *mem_ctx,
-						     const struct file_id id)
-{
-	return get_share_mode_lock(mem_ctx, id, NULL, NULL, NULL);
-}
-
 struct rename_share_filename_state {
 	struct share_mode_lock *lck;
 	struct messaging_context *msg_ctx;
diff --git a/source3/locking/proto.h b/source3/locking/proto.h
index d6e7a54a766..7fc177d7aa6 100644
--- a/source3/locking/proto.h
+++ b/source3/locking/proto.h
@@ -128,8 +128,6 @@ void locking_close_file(files_struct *fsp,
 char *share_mode_str(TALLOC_CTX *ctx, int num,
 		     const struct file_id *id,
 		     const struct share_mode_entry *e);
-struct share_mode_lock *get_existing_share_mode_lock(TALLOC_CTX *mem_ctx,
-						     struct file_id id);
 
 bool rename_share_filename(struct messaging_context *msg_ctx,
 			struct share_mode_lock *lck,
@@ -212,7 +210,6 @@ bool release_posix_lock_posix_flavour(files_struct *fsp,
 /* The following definitions come from locking/leases_util.c */
 uint32_t map_oplock_to_lease_type(uint16_t op_type);
 uint32_t fsp_lease_type(struct files_struct *fsp);
-bool fsp_lease_type_is_exclusive(struct files_struct *fsp);
 const struct GUID *fsp_client_guid(const files_struct *fsp);
 
 #endif /* _LOCKING_PROTO_H_ */
diff --git a/source3/locking/share_mode_lock.c b/source3/locking/share_mode_lock.c
index dd19c53024b..75912ec5dc8 100644
--- a/source3/locking/share_mode_lock.c
+++ b/source3/locking/share_mode_lock.c
@@ -468,7 +468,7 @@ struct locking_tdb_data_fetch_state {
 static void locking_tdb_data_fetch_fn(
 	struct server_id exclusive,
 	size_t num_shared,
-	struct server_id *shared,
+	const struct server_id *shared,
 	const uint8_t *data,
 	size_t datalen,
 	void *private_data)
@@ -768,7 +768,7 @@ struct get_static_share_mode_data_state {
 static void get_static_share_mode_data_fn(
 	struct server_id exclusive,
 	size_t num_shared,
-	struct server_id *shared,
+	const struct server_id *shared,
 	const uint8_t *data,
 	size_t datalen,
 	void *private_data)
@@ -1005,6 +1005,17 @@ static int share_mode_lock_destructor(struct share_mode_lock *lck)
 	return 0;
 }
 
+/*******************************************************************
+ Fetch a share mode where we know one MUST exist. This call reference
+ counts it internally to allow for nested lock fetches.
+********************************************************************/
+
+struct share_mode_lock *get_existing_share_mode_lock(TALLOC_CTX *mem_ctx,
+						     const struct file_id id)
+{
+	return get_share_mode_lock(mem_ctx, id, NULL, NULL, NULL);
+}
+
 struct share_mode_do_locked_state {
 	TDB_DATA key;
 	void (*fn)(const uint8_t *buf,
@@ -1017,7 +1028,7 @@ struct share_mode_do_locked_state {
 static void share_mode_do_locked_fn(
 	struct server_id exclusive,
 	size_t num_shared,
-	struct server_id *shared,
+	const struct server_id *shared,
 	const uint8_t *data,
 	size_t datalen,
 	void *private_data)
@@ -1324,7 +1335,7 @@ struct fetch_share_mode_unlocked_state {
 static void fetch_share_mode_unlocked_parser(
 	struct server_id exclusive,
 	size_t num_shared,
-	struct server_id *shared,
+	const struct server_id *shared,
 	const uint8_t *data,
 	size_t datalen,
 	void *private_data)
@@ -1395,7 +1406,7 @@ struct fetch_share_mode_state {
 static void fetch_share_mode_fn(
 	struct server_id exclusive,
 	size_t num_shared,
-	struct server_id *shared,
+	const struct server_id *shared,
 	const uint8_t *data,
 	size_t datalen,
 	void *private_data);
@@ -1460,7 +1471,7 @@ struct tevent_req *fetch_share_mode_send(TALLOC_CTX *mem_ctx,
 static void fetch_share_mode_fn(
 	struct server_id exclusive,
 	size_t num_shared,
-	struct server_id *shared,
+	const struct server_id *shared,
 	const uint8_t *data,
 	size_t datalen,
 	void *private_data)
@@ -1564,7 +1575,7 @@ struct share_mode_forall_state {
 static void share_mode_forall_dump_fn(
 	struct server_id exclusive,
 	size_t num_shared,
-	struct server_id *shared,
+	const struct server_id *shared,
 	const uint8_t *data,
 	size_t datalen,
 	void *private_data)
@@ -1782,6 +1793,7 @@ bool set_share_mode(struct share_mode_lock *lck,
 		    uid_t uid,
 		    uint64_t mid,
 		    uint16_t op_type,
+		    const struct smb2_lease_key *lease_key,
 		    uint32_t share_access,
 		    uint32_t access_mask)
 {
@@ -1839,7 +1851,7 @@ bool set_share_mode(struct share_mode_lock *lck,
 	if (op_type == LEASE_OPLOCK) {
 		const struct GUID *client_guid = fsp_client_guid(fsp);
 		e.client_guid = *client_guid;
-		e.lease_key = fsp->lease->lease.lease_key;
+		e.lease_key = *lease_key;
 	}
 
 	ok = share_mode_entry_put(&e, &e_buf);
@@ -2108,7 +2120,7 @@ struct share_mode_count_entries_state {
 static void share_mode_count_entries_fn(
 	struct server_id exclusive,
 	size_t num_shared,
-	struct server_id *shared,
+	const struct server_id *shared,
 	const uint8_t *data,
 	size_t datalen,
 	void *private_data)
diff --git a/source3/locking/share_mode_lock.h b/source3/locking/share_mode_lock.h
index bd4e98ccecd..4f47b6fbcbe 100644
--- a/source3/locking/share_mode_lock.h
+++ b/source3/locking/share_mode_lock.h
@@ -26,6 +26,7 @@ struct share_mode_lock;
 struct share_mode_entry;
 struct smb_filename;
 struct files_struct;
+struct smb2_lease_key;
 
 bool locking_init(void);
 bool locking_init_readonly(void);
@@ -37,6 +38,8 @@ struct share_mode_lock *get_share_mode_lock(
 	const char *servicepath,
 	const struct smb_filename *smb_fname,
 	const struct timespec *old_write_time);
+struct share_mode_lock *get_existing_share_mode_lock(TALLOC_CTX *mem_ctx,
+						     struct file_id id);
 
 bool del_share_mode(struct share_mode_lock *lck,
 		    struct files_struct *fsp);
@@ -52,6 +55,7 @@ bool set_share_mode(
 	uid_t uid,
 	uint64_t mid,
 	uint16_t op_type,
+	const struct smb2_lease_key *lease_key,
 	uint32_t share_access,
 	uint32_t access_mask);
 bool reset_share_mode_entry(
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index 1d6c3cfbfbc..d5c2f4c830f 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -2210,8 +2210,21 @@ static bool validate_oplock_types_fn(
 static bool validate_oplock_types(struct share_mode_lock *lck)
 {
 	struct validate_oplock_types_state state = { .valid = true };
+	static bool skip_validation;
+	bool validate;
 	bool ok;
 
+	if (skip_validation) {
+		return true;
+	}
+
+	validate = lp_parm_bool(-1, "smbd", "validate_oplock_types", false);
+	if (!validate) {
+		DBG_DEBUG("smbd:validate_oplock_types not set to yes\n");
+		skip_validation = true;
+		return true;
+	}
+
 	ok = share_mode_forall_entries(lck, validate_oplock_types_fn, &state);
 	if (!ok) {
 		DBG_DEBUG("share_mode_forall_entries failed\n");
@@ -2523,7 +2536,7 @@ static bool delay_for_oplock_fn(
 	struct files_struct *fsp = state->fsp;
 	const struct smb2_lease *lease = state->lease;
 	bool e_is_lease = (e->op_type == LEASE_OPLOCK);
-	uint32_t e_lease_type = get_lease_type(e, fsp->file_id);
+	uint32_t e_lease_type = SMB2_LEASE_NONE;
 	uint32_t break_to;
 	bool lease_is_breaking = false;
 
@@ -2542,7 +2555,7 @@ static bool delay_for_oplock_fn(
 			&e->client_guid,
 			&e->lease_key,
 			&fsp->file_id,
-			NULL, /* current_state */
+			&e_lease_type, /* current_state */
 			&lease_is_breaking,
 			NULL, /* breaking_to_requested */
 			NULL, /* breaking_to_required */
@@ -2584,6 +2597,8 @@ static bool delay_for_oplock_fn(
 				nt_errstr(status));
 			smb_panic("leases_db_get() failed");
 		}
+	} else {
+		e_lease_type = get_lease_type(e, fsp->file_id);
 	}
 
 	if (!state->got_handle_lease &&
@@ -3535,6 +3550,7 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
 	uint32_t existing_dos_attributes = 0;
 	struct share_mode_lock *lck = NULL;
 	uint32_t open_access_mask = access_mask;
+	const struct smb2_lease_key *lease_key = NULL;
 	NTSTATUS status;
 	SMB_STRUCT_STAT saved_stat = smb_fname->st;
 	struct timespec old_write_time;
@@ -4051,6 +4067,10 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
 		return status;
 	}
 
+	if (fsp->oplock_type == LEASE_OPLOCK) {
+		lease_key = &lease->lease_key;
+	}
+
 	share_mode_flags_restrict(lck, access_mask, share_access, 0);
 
 	ok = set_share_mode(
@@ -4059,6 +4079,7 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
 		get_current_uid(fsp->conn),
 		req ? req->mid : 0,
 		fsp->oplock_type,
+		lease_key,
 		share_access,
 		access_mask);
 	if (!ok) {
@@ -4739,6 +4760,7 @@ static NTSTATUS open_directory(connection_struct *conn,
 		get_current_uid(conn),
 		req ? req->mid : 0,
 		NO_OPLOCK,
+		NULL,
 		share_access,
 		fsp->access_mask);
 	if (!ok) {
@@ -5471,7 +5493,7 @@ static bool lease_match_break_fn(
 {
 	struct lease_match_break_state *state = private_data;
 	bool stale, equal;
-	uint32_t e_lease_type;
+	uint32_t e_lease_type = SMB2_LEASE_NONE;
 	NTSTATUS status;
 
 	stale = share_entry_stale_pid(e);
@@ -5488,7 +5510,7 @@ static bool lease_match_break_fn(
 		&e->client_guid,
 		&e->lease_key,
 		&state->id,
-		NULL, /* current_state */
+		&e_lease_type, /* current_state */
 		NULL, /* breaking */
 		NULL, /* breaking_to_requested */
 		NULL, /* breaking_to_required */
@@ -5499,9 +5521,9 @@ static bool lease_match_break_fn(
 	} else {
 		DBG_WARNING("Could not find version/epoch: %s\n",
 			    nt_errstr(status));
+		return false;
 	}
 
-	e_lease_type = get_lease_type(e, state->id);
 	if (e_lease_type == SMB2_LEASE_NONE) {
 		return false;
 	}
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index 7e2a10532f6..25cb84ab9d0 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -1436,7 +1436,7 @@ struct smbd_claim_version_state {
 
 static void smbd_claim_version_parser(struct server_id exclusive,
 				      size_t num_shared,
-				      struct server_id *shared,
+				      const struct server_id *shared,
 				      const uint8_t *data,
 				      size_t datalen,
 				      void *private_data)
diff --git a/source3/smbd/smb2_oplock.c b/source3/smbd/smb2_oplock.c
index 1f143840b34..404746d6f6a 100644
--- a/source3/smbd/smb2_oplock.c
+++ b/source3/smbd/smb2_oplock.c
@@ -1248,6 +1248,7 @@ static void contend_level2_oplocks_begin_default(files_struct *fsp,
 		.sconn = fsp->conn->sconn, .id = fsp->file_id,
 	};
 	struct share_mode_lock *lck = NULL;
+	uint32_t fsp_lease = fsp_lease_type(fsp);
 	bool ok, has_read_lease;
 
 	/*
@@ -1258,7 +1259,7 @@ static void contend_level2_oplocks_begin_default(files_struct *fsp,
 	 * the shared memory area whilst doing this.
 	 */
 
-	if (fsp_lease_type_is_exclusive(fsp)) {
+	if (fsp_lease & SMB2_LEASE_WRITE) {
 		/*
 		 * There can't be any level2 oplocks, we're alone.
 		 */
diff --git a/source3/smbd/smbd.h b/source3/smbd/smbd.h
index f2c3abcda2d..6cf2b64a5a1 100644
--- a/source3/smbd/smbd.h
+++ b/source3/smbd/smbd.h
@@ -25,6 +25,7 @@ struct dptr_struct;
 #include "vfs.h"
 #include "smbd/proto.h"
 #include "locking/proto.h"
+#include "locking/share_mode_lock.h"
 #include "smbd/fd_handle.h"
 #if defined(WITH_SMB1SERVER)
 #include "smbd/smb1_message.h"
diff --git a/source3/torture/test_g_lock.c b/source3/torture/test_g_lock.c
index 002e390af19..51133393960 100644
--- a/source3/torture/test_g_lock.c
+++ b/source3/torture/test_g_lock.c
@@ -115,7 +115,7 @@ struct lock2_parser_state {
 
 static void lock2_parser(struct server_id exclusive,
 			 size_t num_shared,
-			 struct server_id *shared,
+			 const struct server_id *shared,
 			 const uint8_t *data,
 			 size_t datalen,
 			 void *private_data)
@@ -216,14 +216,14 @@ struct lock3_parser_state {
 


-- 
Samba Shared Repository



More information about the samba-cvs mailing list