case it's in a performace critical path and it *hurts* us.
Go back to plain malloc/free with an explicit destructor
call.
Jeremy.
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;
tdb_chainunlock(tdb, key);
SAFE_FREE(br_lck->lock_data);
+ SAFE_FREE(br_lck);
return 0;
}
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;
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);
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;
}
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;
}
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",
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;
}
plock_type,
lock_flav);
- TALLOC_FREE(br_lck);
+ byte_range_lock_destructor(br_lck);
return status;
}
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;
}
lock_flav,
my_lock_ctx);
- TALLOC_FREE(br_lck);
+ byte_range_lock_destructor(br_lck);
return status;
}
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;
}
count,
lock_flav);
- TALLOC_FREE(br_lck);
+ byte_range_lock_destructor(br_lck);
if (!ok) {
DEBUG(10,("do_unlock: returning ERRlock.\n" ));
* 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))) {
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;
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"));
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 \
blr->offset,
blr->count,
blr->lock_flav);
- TALLOC_FREE(br_lck);
+ byte_range_lock_destructor(br_lck);
}
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 \
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);
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
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);
}
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.
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",
}
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.
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) ));
*/
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,
blr->offset,
blr->count,
blr->lock_flav);
- TALLOC_FREE(br_lck);
+ byte_range_lock_destructor(br_lck);
}
free_blocking_lock_record(blr);