diff options
author | Volker Lendecke <vl@samba.org> | 2019-09-12 11:35:34 +0200 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2019-09-17 22:49:38 +0000 |
commit | c7a9e0e4cdfb22e66533b5c8e20af3cfdb8ae78c (patch) | |
tree | c6b42a1a3f96d88e3b3c711c976129a8f018f135 /source3/smbd/smb2_setinfo.c | |
parent | 2d9bb67d25181eba79b95df661e5a5d613b4a850 (diff) | |
download | samba-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.c | 83 |
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; } |