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.
|
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;
|
TDB_DATA key;
|
||||||
|
|
||||||
key.dptr = (char *)&br_lck->key;
|
key.dptr = (char *)&br_lck->key;
|
||||||
@ -1336,6 +1334,7 @@ static int byte_range_lock_destructor(void *p)
|
|||||||
|
|
||||||
tdb_chainunlock(tdb, key);
|
tdb_chainunlock(tdb, key);
|
||||||
SAFE_FREE(br_lck->lock_data);
|
SAFE_FREE(br_lck->lock_data);
|
||||||
|
SAFE_FREE(br_lck);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1344,12 +1343,11 @@ static int byte_range_lock_destructor(void *p)
|
|||||||
Leave the record locked.
|
Leave the record locked.
|
||||||
********************************************************************/
|
********************************************************************/
|
||||||
|
|
||||||
struct byte_range_lock *brl_get_locks(TALLOC_CTX *mem_ctx,
|
struct byte_range_lock *brl_get_locks(files_struct *fsp)
|
||||||
files_struct *fsp)
|
|
||||||
{
|
{
|
||||||
TDB_DATA key;
|
TDB_DATA key;
|
||||||
TDB_DATA data;
|
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) {
|
if (br_lck == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -1367,12 +1365,10 @@ struct byte_range_lock *brl_get_locks(TALLOC_CTX *mem_ctx,
|
|||||||
|
|
||||||
if (tdb_chainlock(tdb, key) != 0) {
|
if (tdb_chainlock(tdb, key) != 0) {
|
||||||
DEBUG(3, ("Could not lock byte range lock entry\n"));
|
DEBUG(3, ("Could not lock byte range lock entry\n"));
|
||||||
TALLOC_FREE(br_lck);
|
SAFE_FREE(br_lck);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
talloc_set_destructor(br_lck, byte_range_lock_destructor);
|
|
||||||
|
|
||||||
data = tdb_fetch(tdb, key);
|
data = tdb_fetch(tdb, key);
|
||||||
br_lck->lock_data = (void *)data.dptr;
|
br_lck->lock_data = (void *)data.dptr;
|
||||||
br_lck->num_locks = data.dsize / sizeof(struct lock_struct);
|
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 ));
|
DEBUG(10,("is_locked: optimisation - level II oplock on file %s\n", fsp->fsp_name ));
|
||||||
ret = False;
|
ret = False;
|
||||||
} else {
|
} 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) {
|
if (!br_lck) {
|
||||||
return False;
|
return False;
|
||||||
}
|
}
|
||||||
@ -111,10 +111,10 @@ BOOL is_locked(files_struct *fsp,
|
|||||||
count,
|
count,
|
||||||
lock_type,
|
lock_type,
|
||||||
lock_flav);
|
lock_flav);
|
||||||
TALLOC_FREE(br_lck);
|
byte_range_lock_destructor(br_lck);
|
||||||
}
|
}
|
||||||
} else {
|
} 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) {
|
if (!br_lck) {
|
||||||
return False;
|
return False;
|
||||||
}
|
}
|
||||||
@ -125,7 +125,7 @@ BOOL is_locked(files_struct *fsp,
|
|||||||
count,
|
count,
|
||||||
lock_type,
|
lock_type,
|
||||||
lock_flav);
|
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",
|
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;
|
return NT_STATUS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
br_lck = brl_get_locks(NULL, fsp);
|
br_lck = brl_get_locks(fsp);
|
||||||
if (!br_lck) {
|
if (!br_lck) {
|
||||||
return NT_STATUS_NO_MEMORY;
|
return NT_STATUS_NO_MEMORY;
|
||||||
}
|
}
|
||||||
@ -171,7 +171,7 @@ NTSTATUS query_lock(files_struct *fsp,
|
|||||||
plock_type,
|
plock_type,
|
||||||
lock_flav);
|
lock_flav);
|
||||||
|
|
||||||
TALLOC_FREE(br_lck);
|
byte_range_lock_destructor(br_lck);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -204,7 +204,7 @@ NTSTATUS do_lock(files_struct *fsp,
|
|||||||
lock_flav_name(lock_flav), lock_type_name(lock_type),
|
lock_flav_name(lock_flav), lock_type_name(lock_type),
|
||||||
(double)offset, (double)count, fsp->fnum, fsp->fsp_name ));
|
(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) {
|
if (!br_lck) {
|
||||||
return NT_STATUS_NO_MEMORY;
|
return NT_STATUS_NO_MEMORY;
|
||||||
}
|
}
|
||||||
@ -218,7 +218,7 @@ NTSTATUS do_lock(files_struct *fsp,
|
|||||||
lock_flav,
|
lock_flav,
|
||||||
my_lock_ctx);
|
my_lock_ctx);
|
||||||
|
|
||||||
TALLOC_FREE(br_lck);
|
byte_range_lock_destructor(br_lck);
|
||||||
return status;
|
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",
|
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 ));
|
(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) {
|
if (!br_lck) {
|
||||||
return NT_STATUS_NO_MEMORY;
|
return NT_STATUS_NO_MEMORY;
|
||||||
}
|
}
|
||||||
@ -317,7 +317,7 @@ NTSTATUS do_unlock(files_struct *fsp,
|
|||||||
count,
|
count,
|
||||||
lock_flav);
|
lock_flav);
|
||||||
|
|
||||||
TALLOC_FREE(br_lck);
|
byte_range_lock_destructor(br_lck);
|
||||||
|
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
DEBUG(10,("do_unlock: returning ERRlock.\n" ));
|
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.
|
* 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) {
|
if (br_lck) {
|
||||||
brl_close_fnum(br_lck, pid);
|
brl_close_fnum(br_lck, pid);
|
||||||
TALLOC_FREE(br_lck);
|
byte_range_lock_destructor(br_lck);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(lp_posix_locking(SNUM(fsp->conn))) {
|
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);
|
memcpy(blr->inbuf, inbuf, length);
|
||||||
blr->length = length;
|
blr->length = length;
|
||||||
|
|
||||||
br_lck = brl_get_locks(NULL, blr->fsp);
|
br_lck = brl_get_locks(blr->fsp);
|
||||||
if (!br_lck) {
|
if (!br_lck) {
|
||||||
free_blocking_lock_record(blr);
|
free_blocking_lock_record(blr);
|
||||||
return False;
|
return False;
|
||||||
@ -136,7 +136,7 @@ BOOL push_blocking_lock_request( char *inbuf, int length,
|
|||||||
PENDING_LOCK,
|
PENDING_LOCK,
|
||||||
blr->lock_flav,
|
blr->lock_flav,
|
||||||
&my_lock_ctx);
|
&my_lock_ctx);
|
||||||
TALLOC_FREE(br_lck);
|
byte_range_lock_destructor(br_lck);
|
||||||
|
|
||||||
if (!NT_STATUS_IS_OK(status)) {
|
if (!NT_STATUS_IS_OK(status)) {
|
||||||
DEBUG(0,("push_blocking_lock_request: failed to add PENDING_LOCK record.\n"));
|
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) {
|
for(blr = blocking_lock_queue; blr; blr = next) {
|
||||||
next = blr->next;
|
next = blr->next;
|
||||||
if(blr->fsp->fnum == fsp->fnum) {
|
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) {
|
if (br_lck) {
|
||||||
DEBUG(10,("remove_pending_lock_requests_by_fid - removing request type %d for \
|
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->offset,
|
||||||
blr->count,
|
blr->count,
|
||||||
blr->lock_flav);
|
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;
|
next = blr->next;
|
||||||
if(SVAL(blr->inbuf,smb_mid) == mid) {
|
if(SVAL(blr->inbuf,smb_mid) == mid) {
|
||||||
files_struct *fsp = blr->fsp;
|
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) {
|
if (br_lck) {
|
||||||
DEBUG(10,("remove_pending_lock_requests_by_mid - removing request type %d for \
|
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->offset,
|
||||||
blr->count,
|
blr->count,
|
||||||
blr->lock_flav);
|
blr->lock_flav);
|
||||||
TALLOC_FREE(br_lck);
|
byte_range_lock_destructor(br_lck);
|
||||||
}
|
}
|
||||||
|
|
||||||
blocking_lock_reply_error(blr,NT_STATUS_FILE_LOCK_CONFLICT);
|
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 ));
|
fsp->fnum, fsp->fsp_name ));
|
||||||
|
|
||||||
if((blr->expire_time != -1) && (blr->expire_time <= t)) {
|
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
|
* Lock expired - throw away all previously
|
||||||
@ -771,7 +771,7 @@ void process_blocking_lock_queue(time_t t)
|
|||||||
blr->offset,
|
blr->offset,
|
||||||
blr->count,
|
blr->count,
|
||||||
blr->lock_flav);
|
blr->lock_flav);
|
||||||
TALLOC_FREE(br_lck);
|
byte_range_lock_destructor(br_lck);
|
||||||
}
|
}
|
||||||
|
|
||||||
blocking_lock_reply_error(blr,NT_STATUS_FILE_LOCK_CONFLICT);
|
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)) {
|
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.
|
* 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->offset,
|
||||||
blr->count,
|
blr->count,
|
||||||
blr->lock_flav);
|
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",
|
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)) {
|
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.
|
* 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->offset,
|
||||||
blr->count,
|
blr->count,
|
||||||
blr->lock_flav);
|
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) ));
|
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)) {
|
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) {
|
if (br_lck) {
|
||||||
brl_remove_pending_lock(br_lck,
|
brl_remove_pending_lock(br_lck,
|
||||||
@ -843,7 +843,7 @@ void process_blocking_lock_queue(time_t t)
|
|||||||
blr->offset,
|
blr->offset,
|
||||||
blr->count,
|
blr->count,
|
||||||
blr->lock_flav);
|
blr->lock_flav);
|
||||||
TALLOC_FREE(br_lck);
|
byte_range_lock_destructor(br_lck);
|
||||||
}
|
}
|
||||||
|
|
||||||
free_blocking_lock_record(blr);
|
free_blocking_lock_record(blr);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user