summaryrefslogtreecommitdiff
path: root/source3/locking/brlock.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2001-05-22 20:35:48 +0000
committerJeremy Allison <jra@samba.org>2001-05-22 20:35:48 +0000
commitfaa0bef196b732b45c4614acd655af4881504808 (patch)
treeea629d40dcd14be6fcdf1ced898971a2dd54a173 /source3/locking/brlock.c
parent58339ac6ccf6e6d264dfbfd6bf9bcf336e90256d (diff)
downloadsamba-faa0bef196b732b45c4614acd655af4881504808.tar.gz
samba-faa0bef196b732b45c4614acd655af4881504808.tar.bz2
samba-faa0bef196b732b45c4614acd655af4881504808.zip
Defensive brlock and locking database cleaning code.
Jeremy. (This used to be commit d7aa42e4593b02ee6e487f7a4633bd7e7620ef2f)
Diffstat (limited to 'source3/locking/brlock.c')
-rw-r--r--source3/locking/brlock.c49
1 files changed, 43 insertions, 6 deletions
diff --git a/source3/locking/brlock.c b/source3/locking/brlock.c
index 175ab5c9b0..089818c9aa 100644
--- a/source3/locking/brlock.c
+++ b/source3/locking/brlock.c
@@ -113,12 +113,16 @@ static BOOL brl_conflict(struct lock_struct *lck1,
/****************************************************************************
-delete a record if it is for a dead process
+ Delete a record if it is for a dead process, if check_self is true, then
+ delete any records belonging to this pid also (there shouldn't be any).
****************************************************************************/
+
static int delete_fn(TDB_CONTEXT *ttdb, TDB_DATA kbuf, TDB_DATA dbuf, void *state)
{
struct lock_struct *locks;
int count, i;
+ BOOL check_self = *(BOOL *)state;
+ pid_t mypid = sys_getpid();
tdb_chainlock(tdb, kbuf);
@@ -128,7 +132,20 @@ static int delete_fn(TDB_CONTEXT *ttdb, TDB_DATA kbuf, TDB_DATA dbuf, void *stat
for (i=0; i<count; i++) {
struct lock_struct *lock = &locks[i];
- if (process_exists(lock->context.pid)) continue;
+ /* If check_self is true we want to remove our own records. */
+ if (check_self && (mypid == lock->context.pid)) {
+
+ DEBUG(0,("brlock : delete_fn. LOGIC ERROR ! Shutting down and a record for my pid (%u) exists !\n",
+ (unsigned int)lock->context.pid ));
+
+ } else if (process_exists(lock->context.pid)) {
+
+ DEBUG(10,("brlock : delete_fn. pid %u exists.\n", (unsigned int)lock->context.pid ));
+ continue;
+ }
+
+ DEBUG(10,("brlock : delete_fn. Deleting record for process %u\n",
+ (unsigned int)lock->context.pid ));
if (count > 1 && i < count-1) {
memmove(&locks[i], &locks[i+1],
@@ -152,9 +169,13 @@ static int delete_fn(TDB_CONTEXT *ttdb, TDB_DATA kbuf, TDB_DATA dbuf, void *stat
/****************************************************************************
Open up the brlock.tdb database.
****************************************************************************/
+
void brl_init(int read_only)
{
- if (tdb) return;
+ BOOL check_self = False;
+
+ if (tdb)
+ return;
tdb = tdb_open(lock_path("brlock.tdb"), 0, TDB_CLEAR_IF_FIRST,
read_only?O_RDONLY:(O_RDWR|O_CREAT), 0644);
if (!tdb) {
@@ -163,11 +184,27 @@ void brl_init(int read_only)
}
/* delete any dead locks */
- if (!read_only) {
- tdb_traverse(tdb, delete_fn, NULL);
- }
+ if (!read_only)
+ tdb_traverse(tdb, delete_fn, &check_self);
}
+/****************************************************************************
+ Close down the brlock.tdb database.
+****************************************************************************/
+
+void brl_shutdown(int read_only)
+{
+ BOOL check_self = True;
+
+ if (tdb)
+ return;
+
+ /* delete any dead locks */
+ if (!read_only)
+ tdb_traverse(tdb, delete_fn, &check_self);
+
+ tdb_close(tdb);
+}
/****************************************************************************
Lock a range of bytes.