summaryrefslogtreecommitdiff
path: root/source3/locking
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2019-06-30 19:51:13 +0200
committerRalph Boehme <slow@samba.org>2019-07-04 14:03:29 +0000
commit8bae5d82e2a101d37f5572e1d174b37816576840 (patch)
treed7be69f5f1dd2cff49fc67eb8f409f817a9b061a /source3/locking
parent2d7efba0d9dd212df127ffd697ff72fb30b72861 (diff)
downloadsamba-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.c44
-rw-r--r--source3/locking/proto.h3
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);