diff options
author | Volker Lendecke <vl@samba.org> | 2019-06-30 19:51:13 +0200 |
---|---|---|
committer | Ralph Boehme <slow@samba.org> | 2019-07-04 14:03:29 +0000 |
commit | 8bae5d82e2a101d37f5572e1d174b37816576840 (patch) | |
tree | d7be69f5f1dd2cff49fc67eb8f409f817a9b061a /source3/locking | |
parent | 2d7efba0d9dd212df127ffd697ff72fb30b72861 (diff) | |
download | samba-8bae5d82e2a101d37f5572e1d174b37816576840.tar.gz |
smbd: Don't store num_read_oplocks in brlock.tdb
This removes a kludgy implementation that worked around a locking
hierarchy problem: Setting a byte range lock had to contend the level2
oplocks, which are stored in locking.tdb/leases.tdb. We could not
access locking.tdb in the brlock.tdb code, as brlock.tdb might have
been locked first without locking.tdb, violating the locking hierarchy
locking.tdb->brlock.tdb. Now that that problem is gone (see the commit
wrapping do_lock() in share_mode_do_locked()), we can remove this
kludge.
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
Diffstat (limited to 'source3/locking')
-rw-r--r-- | source3/locking/brlock.c | 44 | ||||
-rw-r--r-- | source3/locking/proto.h | 3 |
2 files changed, 6 insertions, 41 deletions
diff --git a/source3/locking/brlock.c b/source3/locking/brlock.c index 75c020f57a6..cdfd09ceff1 100644 --- a/source3/locking/brlock.c +++ b/source3/locking/brlock.c @@ -48,7 +48,6 @@ struct byte_range_lock { struct files_struct *fsp; unsigned int num_locks; bool modified; - uint32_t num_read_oplocks; struct lock_struct *lock_data; struct db_record *record; }; @@ -85,21 +84,6 @@ struct files_struct *brl_fsp(struct byte_range_lock *brl) return brl->fsp; } -uint32_t brl_num_read_oplocks(const struct byte_range_lock *brl) -{ - return brl->num_read_oplocks; -} - -void brl_set_num_read_oplocks(struct byte_range_lock *brl, - uint32_t num_read_oplocks) -{ - DEBUG(10, ("Setting num_read_oplocks to %"PRIu32"\n", - num_read_oplocks)); - SMB_ASSERT(brl->record != NULL); /* otherwise we're readonly */ - brl->num_read_oplocks = num_read_oplocks; - brl->modified = true; -} - /**************************************************************************** See if two locking contexts are equal. ****************************************************************************/ @@ -1652,7 +1636,7 @@ static void byte_range_lock_flush(struct byte_range_lock *br_lck) } } - if ((br_lck->num_locks == 0) && (br_lck->num_read_oplocks == 0)) { + if (br_lck->num_locks == 0) { /* No locks - delete this entry. */ NTSTATUS status = dbwrap_record_delete(br_lck->record); if (!NT_STATUS_IS_OK(status)) { @@ -1661,25 +1645,13 @@ static void byte_range_lock_flush(struct byte_range_lock *br_lck) smb_panic("Could not delete byte range lock entry"); } } else { - size_t lock_len, data_len; - TDB_DATA data; + TDB_DATA data = { + .dsize = br_lck->num_locks * sizeof(struct lock_struct), + .dptr = (uint8_t *)br_lck->lock_data, + }; NTSTATUS status; - lock_len = br_lck->num_locks * sizeof(struct lock_struct); - data_len = lock_len + sizeof(br_lck->num_read_oplocks); - - data.dsize = data_len; - data.dptr = talloc_array(talloc_tos(), uint8_t, data_len); - SMB_ASSERT(data.dptr != NULL); - - if (lock_len > 0) { - memcpy(data.dptr, br_lck->lock_data, lock_len); - } - memcpy(data.dptr + lock_len, &br_lck->num_read_oplocks, - sizeof(br_lck->num_read_oplocks)); - status = dbwrap_record_store(br_lck->record, data, TDB_REPLACE); - TALLOC_FREE(data.dptr); if (!NT_STATUS_IS_OK(status)) { DEBUG(0, ("store returned %s\n", nt_errstr(status))); smb_panic("Could not store byte range mode entry"); @@ -1706,8 +1678,7 @@ static bool brl_parse_data(struct byte_range_lock *br_lck, TDB_DATA data) if (data.dsize == 0) { return true; } - if (data.dsize % sizeof(struct lock_struct) != - sizeof(br_lck->num_read_oplocks)) { + if (data.dsize % sizeof(struct lock_struct) != 0) { DEBUG(1, ("Invalid data size: %u\n", (unsigned)data.dsize)); return false; } @@ -1720,8 +1691,6 @@ static bool brl_parse_data(struct byte_range_lock *br_lck, TDB_DATA data) DEBUG(1, ("talloc_memdup failed\n")); return false; } - memcpy(&br_lck->num_read_oplocks, data.dptr + data_len, - sizeof(br_lck->num_read_oplocks)); return true; } @@ -1843,7 +1812,6 @@ struct byte_range_lock *brl_get_locks_readonly(files_struct *fsp) return NULL; } - br_lock->num_read_oplocks = 0; br_lock->num_locks = 0; br_lock->lock_data = NULL; diff --git a/source3/locking/proto.h b/source3/locking/proto.h index a1c6529183a..08d3f2c7ab8 100644 --- a/source3/locking/proto.h +++ b/source3/locking/proto.h @@ -30,9 +30,6 @@ void brl_shutdown(void); unsigned int brl_num_locks(const struct byte_range_lock *brl); struct files_struct *brl_fsp(struct byte_range_lock *brl); -uint32_t brl_num_read_oplocks(const struct byte_range_lock *brl); -void brl_set_num_read_oplocks(struct byte_range_lock *brl, - uint32_t num_read_oplocks); NTSTATUS brl_lock_windows_default(struct byte_range_lock *br_lck, struct lock_struct *plock); |