mirror of
https://github.com/samba-team/samba.git
synced 2025-03-01 04:58:35 +03:00
r15083: Using talloc with destructors is nice and all, but in this
case it's in a performace critical path and it *hurts* us. Go back to plain malloc/free with an explicit destructor call. Jeremy. (This used to be commit 1c99aed563c29e1b3d70939878af747a0660bfec)
This commit is contained in:
parent
1f19676903
commit
713eaf1d67
@ -1304,10 +1304,8 @@ int brl_forall(BRLOCK_FN(fn))
|
||||
Unlock the record.
|
||||
********************************************************************/
|
||||
|
||||
static int byte_range_lock_destructor(void *p)
|
||||
int byte_range_lock_destructor(struct byte_range_lock *br_lck)
|
||||
{
|
||||
struct byte_range_lock *br_lck =
|
||||
talloc_get_type_abort(p, struct byte_range_lock);
|
||||
TDB_DATA key;
|
||||
|
||||
key.dptr = (char *)&br_lck->key;
|
||||
@ -1336,6 +1334,7 @@ static int byte_range_lock_destructor(void *p)
|
||||
|
||||
tdb_chainunlock(tdb, key);
|
||||
SAFE_FREE(br_lck->lock_data);
|
||||
SAFE_FREE(br_lck);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1344,12 +1343,11 @@ static int byte_range_lock_destructor(void *p)
|
||||
Leave the record locked.
|
||||
********************************************************************/
|
||||
|
||||
struct byte_range_lock *brl_get_locks(TALLOC_CTX *mem_ctx,
|
||||
files_struct *fsp)
|
||||
struct byte_range_lock *brl_get_locks(files_struct *fsp)
|
||||
{
|
||||
TDB_DATA key;
|
||||
TDB_DATA data;
|
||||
struct byte_range_lock *br_lck = TALLOC_P(mem_ctx, struct byte_range_lock);
|
||||
struct byte_range_lock *br_lck = SMB_MALLOC_P(struct byte_range_lock);
|
||||
|
||||
if (br_lck == NULL) {
|
||||
return NULL;
|
||||
@ -1367,12 +1365,10 @@ struct byte_range_lock *brl_get_locks(TALLOC_CTX *mem_ctx,
|
||||
|
||||
if (tdb_chainlock(tdb, key) != 0) {
|
||||
DEBUG(3, ("Could not lock byte range lock entry\n"));
|
||||
TALLOC_FREE(br_lck);
|
||||
SAFE_FREE(br_lck);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
talloc_set_destructor(br_lck, byte_range_lock_destructor);
|
||||
|
||||
data = tdb_fetch(tdb, key);
|
||||
br_lck->lock_data = (void *)data.dptr;
|
||||
br_lck->num_locks = data.dsize / sizeof(struct lock_struct);
|
||||
|
@ -100,7 +100,7 @@ BOOL is_locked(files_struct *fsp,
|
||||
DEBUG(10,("is_locked: optimisation - level II oplock on file %s\n", fsp->fsp_name ));
|
||||
ret = False;
|
||||
} else {
|
||||
struct byte_range_lock *br_lck = brl_get_locks(NULL, fsp);
|
||||
struct byte_range_lock *br_lck = brl_get_locks(fsp);
|
||||
if (!br_lck) {
|
||||
return False;
|
||||
}
|
||||
@ -111,10 +111,10 @@ BOOL is_locked(files_struct *fsp,
|
||||
count,
|
||||
lock_type,
|
||||
lock_flav);
|
||||
TALLOC_FREE(br_lck);
|
||||
byte_range_lock_destructor(br_lck);
|
||||
}
|
||||
} else {
|
||||
struct byte_range_lock *br_lck = brl_get_locks(NULL, fsp);
|
||||
struct byte_range_lock *br_lck = brl_get_locks(fsp);
|
||||
if (!br_lck) {
|
||||
return False;
|
||||
}
|
||||
@ -125,7 +125,7 @@ BOOL is_locked(files_struct *fsp,
|
||||
count,
|
||||
lock_type,
|
||||
lock_flav);
|
||||
TALLOC_FREE(br_lck);
|
||||
byte_range_lock_destructor(br_lck);
|
||||
}
|
||||
|
||||
DEBUG(10,("is_locked: flavour = %s brl start=%.0f len=%.0f %s for fnum %d file %s\n",
|
||||
@ -158,7 +158,7 @@ NTSTATUS query_lock(files_struct *fsp,
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
br_lck = brl_get_locks(NULL, fsp);
|
||||
br_lck = brl_get_locks(fsp);
|
||||
if (!br_lck) {
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
@ -171,7 +171,7 @@ NTSTATUS query_lock(files_struct *fsp,
|
||||
plock_type,
|
||||
lock_flav);
|
||||
|
||||
TALLOC_FREE(br_lck);
|
||||
byte_range_lock_destructor(br_lck);
|
||||
return status;
|
||||
}
|
||||
|
||||
@ -204,7 +204,7 @@ NTSTATUS do_lock(files_struct *fsp,
|
||||
lock_flav_name(lock_flav), lock_type_name(lock_type),
|
||||
(double)offset, (double)count, fsp->fnum, fsp->fsp_name ));
|
||||
|
||||
br_lck = brl_get_locks(NULL, fsp);
|
||||
br_lck = brl_get_locks(fsp);
|
||||
if (!br_lck) {
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
@ -218,7 +218,7 @@ NTSTATUS do_lock(files_struct *fsp,
|
||||
lock_flav,
|
||||
my_lock_ctx);
|
||||
|
||||
TALLOC_FREE(br_lck);
|
||||
byte_range_lock_destructor(br_lck);
|
||||
return status;
|
||||
}
|
||||
|
||||
@ -305,7 +305,7 @@ NTSTATUS do_unlock(files_struct *fsp,
|
||||
DEBUG(10,("do_unlock: unlock start=%.0f len=%.0f requested for fnum %d file %s\n",
|
||||
(double)offset, (double)count, fsp->fnum, fsp->fsp_name ));
|
||||
|
||||
br_lck = brl_get_locks(NULL, fsp);
|
||||
br_lck = brl_get_locks(fsp);
|
||||
if (!br_lck) {
|
||||
return NT_STATUS_NO_MEMORY;
|
||||
}
|
||||
@ -317,7 +317,7 @@ NTSTATUS do_unlock(files_struct *fsp,
|
||||
count,
|
||||
lock_flav);
|
||||
|
||||
TALLOC_FREE(br_lck);
|
||||
byte_range_lock_destructor(br_lck);
|
||||
|
||||
if (!ok) {
|
||||
DEBUG(10,("do_unlock: returning ERRlock.\n" ));
|
||||
@ -343,10 +343,10 @@ void locking_close_file(files_struct *fsp)
|
||||
* Just release all the brl locks, no need to release individually.
|
||||
*/
|
||||
|
||||
br_lck = brl_get_locks(NULL,fsp);
|
||||
br_lck = brl_get_locks(fsp);
|
||||
if (br_lck) {
|
||||
brl_close_fnum(br_lck, pid);
|
||||
TALLOC_FREE(br_lck);
|
||||
byte_range_lock_destructor(br_lck);
|
||||
}
|
||||
|
||||
if(lp_posix_locking(SNUM(fsp->conn))) {
|
||||
|
@ -121,7 +121,7 @@ BOOL push_blocking_lock_request( char *inbuf, int length,
|
||||
memcpy(blr->inbuf, inbuf, length);
|
||||
blr->length = length;
|
||||
|
||||
br_lck = brl_get_locks(NULL, blr->fsp);
|
||||
br_lck = brl_get_locks(blr->fsp);
|
||||
if (!br_lck) {
|
||||
free_blocking_lock_record(blr);
|
||||
return False;
|
||||
@ -136,7 +136,7 @@ BOOL push_blocking_lock_request( char *inbuf, int length,
|
||||
PENDING_LOCK,
|
||||
blr->lock_flav,
|
||||
&my_lock_ctx);
|
||||
TALLOC_FREE(br_lck);
|
||||
byte_range_lock_destructor(br_lck);
|
||||
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
DEBUG(0,("push_blocking_lock_request: failed to add PENDING_LOCK record.\n"));
|
||||
@ -625,7 +625,7 @@ void remove_pending_lock_requests_by_fid(files_struct *fsp)
|
||||
for(blr = blocking_lock_queue; blr; blr = next) {
|
||||
next = blr->next;
|
||||
if(blr->fsp->fnum == fsp->fnum) {
|
||||
struct byte_range_lock *br_lck = brl_get_locks(NULL, fsp);
|
||||
struct byte_range_lock *br_lck = brl_get_locks(fsp);
|
||||
|
||||
if (br_lck) {
|
||||
DEBUG(10,("remove_pending_lock_requests_by_fid - removing request type %d for \
|
||||
@ -637,7 +637,7 @@ file %s fnum = %d\n", blr->com_type, fsp->fsp_name, fsp->fnum ));
|
||||
blr->offset,
|
||||
blr->count,
|
||||
blr->lock_flav);
|
||||
TALLOC_FREE(br_lck);
|
||||
byte_range_lock_destructor(br_lck);
|
||||
|
||||
}
|
||||
|
||||
@ -658,7 +658,7 @@ void remove_pending_lock_requests_by_mid(int mid)
|
||||
next = blr->next;
|
||||
if(SVAL(blr->inbuf,smb_mid) == mid) {
|
||||
files_struct *fsp = blr->fsp;
|
||||
struct byte_range_lock *br_lck = brl_get_locks(NULL, fsp);
|
||||
struct byte_range_lock *br_lck = brl_get_locks(fsp);
|
||||
|
||||
if (br_lck) {
|
||||
DEBUG(10,("remove_pending_lock_requests_by_mid - removing request type %d for \
|
||||
@ -670,7 +670,7 @@ file %s fnum = %d\n", blr->com_type, fsp->fsp_name, fsp->fnum ));
|
||||
blr->offset,
|
||||
blr->count,
|
||||
blr->lock_flav);
|
||||
TALLOC_FREE(br_lck);
|
||||
byte_range_lock_destructor(br_lck);
|
||||
}
|
||||
|
||||
blocking_lock_reply_error(blr,NT_STATUS_FILE_LOCK_CONFLICT);
|
||||
@ -754,7 +754,7 @@ void process_blocking_lock_queue(time_t t)
|
||||
fsp->fnum, fsp->fsp_name ));
|
||||
|
||||
if((blr->expire_time != -1) && (blr->expire_time <= t)) {
|
||||
struct byte_range_lock *br_lck = brl_get_locks(NULL, fsp);
|
||||
struct byte_range_lock *br_lck = brl_get_locks(fsp);
|
||||
|
||||
/*
|
||||
* Lock expired - throw away all previously
|
||||
@ -771,7 +771,7 @@ void process_blocking_lock_queue(time_t t)
|
||||
blr->offset,
|
||||
blr->count,
|
||||
blr->lock_flav);
|
||||
TALLOC_FREE(br_lck);
|
||||
byte_range_lock_destructor(br_lck);
|
||||
}
|
||||
|
||||
blocking_lock_reply_error(blr,NT_STATUS_FILE_LOCK_CONFLICT);
|
||||
@ -780,7 +780,7 @@ void process_blocking_lock_queue(time_t t)
|
||||
}
|
||||
|
||||
if(!change_to_user(conn,vuid)) {
|
||||
struct byte_range_lock *br_lck = brl_get_locks(NULL, fsp);
|
||||
struct byte_range_lock *br_lck = brl_get_locks(fsp);
|
||||
|
||||
/*
|
||||
* Remove the entry and return an error to the client.
|
||||
@ -793,7 +793,7 @@ void process_blocking_lock_queue(time_t t)
|
||||
blr->offset,
|
||||
blr->count,
|
||||
blr->lock_flav);
|
||||
TALLOC_FREE(br_lck);
|
||||
byte_range_lock_destructor(br_lck);
|
||||
}
|
||||
|
||||
DEBUG(0,("process_blocking_lock_queue: Unable to become user vuid=%d.\n",
|
||||
@ -804,7 +804,7 @@ void process_blocking_lock_queue(time_t t)
|
||||
}
|
||||
|
||||
if(!set_current_service(conn,SVAL(blr->inbuf,smb_flg),True)) {
|
||||
struct byte_range_lock *br_lck = brl_get_locks(NULL, fsp);
|
||||
struct byte_range_lock *br_lck = brl_get_locks(fsp);
|
||||
|
||||
/*
|
||||
* Remove the entry and return an error to the client.
|
||||
@ -817,7 +817,7 @@ void process_blocking_lock_queue(time_t t)
|
||||
blr->offset,
|
||||
blr->count,
|
||||
blr->lock_flav);
|
||||
TALLOC_FREE(br_lck);
|
||||
byte_range_lock_destructor(br_lck);
|
||||
}
|
||||
|
||||
DEBUG(0,("process_blocking_lock_queue: Unable to become service Error was %s.\n", strerror(errno) ));
|
||||
@ -834,7 +834,7 @@ void process_blocking_lock_queue(time_t t)
|
||||
*/
|
||||
|
||||
if(blocking_lock_record_process(blr)) {
|
||||
struct byte_range_lock *br_lck = brl_get_locks(NULL, fsp);
|
||||
struct byte_range_lock *br_lck = brl_get_locks(fsp);
|
||||
|
||||
if (br_lck) {
|
||||
brl_remove_pending_lock(br_lck,
|
||||
@ -843,7 +843,7 @@ void process_blocking_lock_queue(time_t t)
|
||||
blr->offset,
|
||||
blr->count,
|
||||
blr->lock_flav);
|
||||
TALLOC_FREE(br_lck);
|
||||
byte_range_lock_destructor(br_lck);
|
||||
}
|
||||
|
||||
free_blocking_lock_record(blr);
|
||||
|
Loading…
x
Reference in New Issue
Block a user