summaryrefslogtreecommitdiff
path: root/source3/smbd/smb2_setinfo.c
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2019-09-12 11:35:34 +0200
committerJeremy Allison <jra@samba.org>2019-09-17 22:49:38 +0000
commitc7a9e0e4cdfb22e66533b5c8e20af3cfdb8ae78c (patch)
treec6b42a1a3f96d88e3b3c711c976129a8f018f135 /source3/smbd/smb2_setinfo.c
parent2d9bb67d25181eba79b95df661e5a5d613b4a850 (diff)
downloadsamba-c7a9e0e4cdfb22e66533b5c8e20af3cfdb8ae78c.tar.gz
smbd: Use share_mode_forall_leases() in delay_rename_for_lease_break()
Signed-off-by: Volker Lendecke <vl@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'source3/smbd/smb2_setinfo.c')
-rw-r--r--source3/smbd/smb2_setinfo.c83
1 files changed, 48 insertions, 35 deletions
diff --git a/source3/smbd/smb2_setinfo.c b/source3/smbd/smb2_setinfo.c
index 47ac774f659..cfb49fb8d14 100644
--- a/source3/smbd/smb2_setinfo.c
+++ b/source3/smbd/smb2_setinfo.c
@@ -180,6 +180,47 @@ static int defer_rename_state_destructor(struct defer_rename_state *rename_state
static void defer_rename_done(struct tevent_req *subreq);
+struct delay_rename_lease_break_state {
+ struct files_struct *fsp;
+ bool delay;
+};
+
+static bool delay_rename_lease_break_fn(
+ struct share_mode_entry *e,
+ void *private_data)
+{
+ struct delay_rename_lease_break_state *state = private_data;
+ struct files_struct *fsp = state->fsp;
+ uint32_t e_lease_type, break_to;
+ bool ours, stale;
+
+ ours = smb2_lease_equal(fsp_client_guid(fsp),
+ &fsp->lease->lease.lease_key,
+ &e->client_guid,
+ &e->lease_key);
+ if (ours) {
+ return false;
+ }
+
+ e_lease_type = get_lease_type(e, fsp->file_id);
+
+ if ((e_lease_type & SMB2_LEASE_HANDLE) == 0) {
+ return false;
+ }
+
+ stale = share_entry_stale_pid(e);
+ if (stale) {
+ return false;
+ }
+
+ break_to = (e_lease_type & ~SMB2_LEASE_HANDLE);
+
+ send_break_message(
+ fsp->conn->sconn->msg_ctx, &fsp->file_id, e, break_to);
+
+ return false;
+}
+
static struct tevent_req *delay_rename_for_lease_break(struct tevent_req *req,
struct smbd_smb2_request *smb2req,
struct tevent_context *ev,
@@ -190,50 +231,22 @@ static struct tevent_req *delay_rename_for_lease_break(struct tevent_req *req,
{
struct tevent_req *subreq;
- uint32_t i;
- struct share_mode_data *d = lck->data;
struct defer_rename_state *rename_state;
- bool delay = false;
+ struct delay_rename_lease_break_state state = { .fsp = fsp };
struct timeval timeout;
+ bool ok;
if (fsp->oplock_type != LEASE_OPLOCK) {
return NULL;
}
- for (i=0; i<d->num_share_modes; i++) {
- struct share_mode_entry *e = &d->share_modes[i];
- uint32_t e_lease_type;
- uint32_t break_to;
-
- if (e->op_type != LEASE_OPLOCK) {
- continue;
- }
-
- e_lease_type = get_lease_type(e, d->id);
-
- if (!(e_lease_type & SMB2_LEASE_HANDLE)) {
- continue;
- }
-
- if (smb2_lease_equal(fsp_client_guid(fsp),
- &fsp->lease->lease.lease_key,
- &e->client_guid,
- &e->lease_key)) {
- continue;
- }
-
- if (share_mode_stale_pid(d, i)) {
- continue;
- }
-
- delay = true;
- break_to = (e_lease_type & ~SMB2_LEASE_HANDLE);
-
- send_break_message(fsp->conn->sconn->msg_ctx, &fsp->file_id,
- e, break_to);
+ ok = share_mode_forall_leases(
+ lck, delay_rename_lease_break_fn, &state);
+ if (!ok) {
+ return NULL;
}
- if (!delay) {
+ if (!state.delay) {
return NULL;
}