1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-24 10:50:22 +03:00

s3: Use dbwrap_util for windows_lock_ref_count

Signed-off-by: Stefan Metzmacher <metze@samba.org>
This commit is contained in:
Volker Lendecke 2012-06-12 12:11:40 +02:00 committed by Stefan Metzmacher
parent e0abd1938a
commit 6658a2f6ef

View File

@ -406,37 +406,18 @@ bool posix_locking_end(void)
static void increment_windows_lock_ref_count(files_struct *fsp)
{
struct lock_ref_count_key tmp;
struct db_record *rec;
int lock_ref_count = 0;
int32_t lock_ref_count = 0;
NTSTATUS status;
TDB_DATA value;
rec = dbwrap_fetch_locked(
posix_pending_close_db, talloc_tos(),
locking_ref_count_key_fsp(fsp, &tmp));
SMB_ASSERT(rec != NULL);
value = dbwrap_record_get_value(rec);
if (value.dptr != NULL) {
SMB_ASSERT(value.dsize == sizeof(lock_ref_count));
memcpy(&lock_ref_count, value.dptr,
sizeof(lock_ref_count));
}
lock_ref_count++;
status = dbwrap_record_store(rec,
make_tdb_data((uint8 *)&lock_ref_count,
sizeof(lock_ref_count)), 0);
status = dbwrap_change_int32_atomic(
posix_pending_close_db, locking_ref_count_key_fsp(fsp, &tmp),
&lock_ref_count, 1);
SMB_ASSERT(NT_STATUS_IS_OK(status));
TALLOC_FREE(rec);
SMB_ASSERT(lock_ref_count < INT32_MAX);
DEBUG(10,("increment_windows_lock_ref_count for file now %s = %d\n",
fsp_str_dbg(fsp), lock_ref_count));
fsp_str_dbg(fsp), (int)lock_ref_count));
}
/****************************************************************************
@ -446,44 +427,18 @@ static void increment_windows_lock_ref_count(files_struct *fsp)
void reduce_windows_lock_ref_count(files_struct *fsp, unsigned int dcount)
{
struct lock_ref_count_key tmp;
struct db_record *rec;
int lock_ref_count = 0;
int32_t lock_ref_count = 0;
NTSTATUS status;
TDB_DATA value;
rec = dbwrap_fetch_locked(
posix_pending_close_db, talloc_tos(),
locking_ref_count_key_fsp(fsp, &tmp));
if (rec == NULL) {
DEBUG(0, ("reduce_windows_lock_ref_count: rec not found\n"));
return;
}
value = dbwrap_record_get_value(rec);
if ((value.dptr == NULL) || (value.dsize != sizeof(lock_ref_count))) {
DEBUG(0, ("reduce_windows_lock_ref_count: wrong value\n"));
TALLOC_FREE(rec);
return;
}
memcpy(&lock_ref_count, value.dptr, sizeof(lock_ref_count));
SMB_ASSERT(lock_ref_count > 0);
lock_ref_count -= dcount;
status = dbwrap_record_store(rec,
make_tdb_data((uint8 *)&lock_ref_count,
sizeof(lock_ref_count)), 0);
status = dbwrap_change_int32_atomic(
posix_pending_close_db, locking_ref_count_key_fsp(fsp, &tmp),
&lock_ref_count, -dcount);
SMB_ASSERT(NT_STATUS_IS_OK(status));
TALLOC_FREE(rec);
SMB_ASSERT(lock_ref_count >= 0);
DEBUG(10,("reduce_windows_lock_ref_count for file now %s = %d\n",
fsp_str_dbg(fsp), lock_ref_count));
fsp_str_dbg(fsp), (int)lock_ref_count));
}
static void decrement_windows_lock_ref_count(files_struct *fsp)
@ -495,43 +450,22 @@ static void decrement_windows_lock_ref_count(files_struct *fsp)
Fetch the lock ref count.
****************************************************************************/
static int get_windows_lock_ref_count(files_struct *fsp)
static int32_t get_windows_lock_ref_count(files_struct *fsp)
{
struct lock_ref_count_key tmp;
TDB_DATA dbuf;
NTSTATUS status;
int lock_ref_count = 0;
int32_t lock_ref_count = 0;
status = dbwrap_fetch(
posix_pending_close_db, talloc_tos(),
locking_ref_count_key_fsp(fsp, &tmp), &dbuf);
status = dbwrap_fetch_int32(
posix_pending_close_db, locking_ref_count_key_fsp(fsp, &tmp),
&lock_ref_count);
if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND)) {
goto done;
}
if (!NT_STATUS_IS_OK(status)) {
if (!NT_STATUS_IS_OK(status) &&
!NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND)) {
DEBUG(0, ("get_windows_lock_ref_count: Error fetching "
"lock ref count for file %s: %s\n",
fsp_str_dbg(fsp), nt_errstr(status)));
goto done;
}
if (dbuf.dsize != sizeof(lock_ref_count)) {
DEBUG(0, ("get_windows_lock_ref_count: invalid entry "
"in lock ref count record for file %s: "
"(invalid data size %u)\n",
fsp_str_dbg(fsp), (unsigned int)dbuf.dsize));
goto done;
}
memcpy(&lock_ref_count, dbuf.dptr, sizeof(lock_ref_count));
TALLOC_FREE(dbuf.dptr);
done:
DEBUG(10,("get_windows_lock_count for file %s = %d\n",
fsp_str_dbg(fsp), lock_ref_count));
return lock_ref_count;
}
@ -542,18 +476,11 @@ done:
static void delete_windows_lock_ref_count(files_struct *fsp)
{
struct lock_ref_count_key tmp;
struct db_record *rec;
rec = dbwrap_fetch_locked(
posix_pending_close_db, talloc_tos(),
locking_ref_count_key_fsp(fsp, &tmp));
SMB_ASSERT(rec != NULL);
/* Not a bug if it doesn't exist - no locks were ever granted. */
dbwrap_record_delete(rec);
TALLOC_FREE(rec);
dbwrap_delete(posix_pending_close_db,
locking_ref_count_key_fsp(fsp, &tmp));
DEBUG(10,("delete_windows_lock_ref_count for file %s\n",
fsp_str_dbg(fsp)));