1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-12 09:18:10 +03:00

s3:locking:brlock: let validate_lock_entries keep entries for disconnected servers in traverses

We should not remove locks of disconnected opens just like that.
When getting the byte range lock record for a newly connected file
handle, we still do the clean up, because in that situation,
disconnected entries are not valid any more.

Signed-off-by: Gregor Beck <gbeck@sernet.de>
Reviewed-by: Michael Adam <obnox@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
This commit is contained in:
Gregor Beck 2013-03-05 14:49:28 +01:00 committed by Michael Adam
parent fe0bf0b6d6
commit f08bda22dc

View File

@ -1650,7 +1650,8 @@ bool brl_reconnect_disconnected(struct files_struct *fsp)
/**************************************************************************** /****************************************************************************
Ensure this set of lock entries is valid. Ensure this set of lock entries is valid.
****************************************************************************/ ****************************************************************************/
static bool validate_lock_entries(unsigned int *pnum_entries, struct lock_struct **pplocks) static bool validate_lock_entries(unsigned int *pnum_entries, struct lock_struct **pplocks,
bool keep_disconnected)
{ {
unsigned int i; unsigned int i;
unsigned int num_valid_entries = 0; unsigned int num_valid_entries = 0;
@ -1688,13 +1689,21 @@ static bool validate_lock_entries(unsigned int *pnum_entries, struct lock_struct
} }
for (i = 0; i < *pnum_entries; i++) { for (i = 0; i < *pnum_entries; i++) {
if (!exists[i]) { if (exists[i]) {
/* This process no longer exists - mark this
entry as invalid by zeroing it. */
ZERO_STRUCTP(&locks[i]);
} else {
num_valid_entries++; num_valid_entries++;
continue;
} }
if (keep_disconnected &&
server_id_is_disconnected(&ids[i]))
{
num_valid_entries++;
continue;
}
/* This process no longer exists - mark this
entry as invalid by zeroing it. */
ZERO_STRUCTP(&locks[i]);
} }
TALLOC_FREE(frame); TALLOC_FREE(frame);
@ -1770,7 +1779,7 @@ static int brl_traverse_fn(struct db_record *rec, void *state)
/* Ensure the lock db is clean of entries from invalid processes. */ /* Ensure the lock db is clean of entries from invalid processes. */
if (!validate_lock_entries(&num_locks, &locks)) { if (!validate_lock_entries(&num_locks, &locks, true)) {
SAFE_FREE(locks); SAFE_FREE(locks);
return -1; /* Terminate traversal */ return -1; /* Terminate traversal */
} }
@ -1963,10 +1972,16 @@ static struct byte_range_lock *brl_get_locks_internal(TALLOC_CTX *mem_ctx,
* record with this fsp. Go through and ensure all entries * record with this fsp. Go through and ensure all entries
* are valid - remove any that don't. * are valid - remove any that don't.
* This makes the lockdb self cleaning at low cost. * This makes the lockdb self cleaning at low cost.
*
* Note: Disconnected entries belong to disconnected
* durable handles. So at this point, we have a new
* handle on the file and the disconnected durable has
* already been closed (we are not a durable reconnect).
* So we need to clean the disconnected brl entry.
*/ */
if (!validate_lock_entries(&br_lck->num_locks, if (!validate_lock_entries(&br_lck->num_locks,
&br_lck->lock_data)) { &br_lck->lock_data, false)) {
SAFE_FREE(br_lck->lock_data); SAFE_FREE(br_lck->lock_data);
TALLOC_FREE(br_lck); TALLOC_FREE(br_lck);
return NULL; return NULL;