svn commit: samba r6543 - in branches/SAMBA_3_0/source/locking: .
jra at samba.org
jra at samba.org
Sun May 1 07:01:34 GMT 2005
Author: jra
Date: 2005-05-01 07:01:18 +0000 (Sun, 01 May 2005)
New Revision: 6543
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=6543
Log:
Fix EDEADLCK problem with deferred open calls. Problem found by
"Hu, David J" <david.hu at hp.com>
Jeremy.
Modified:
branches/SAMBA_3_0/source/locking/locking.c
Changeset:
Modified: branches/SAMBA_3_0/source/locking/locking.c
===================================================================
--- branches/SAMBA_3_0/source/locking/locking.c 2005-05-01 07:00:47 UTC (rev 6542)
+++ branches/SAMBA_3_0/source/locking/locking.c 2005-05-01 07:01:18 UTC (rev 6543)
@@ -42,6 +42,7 @@
/* the locking database handle */
static TDB_CONTEXT *tdb;
+static TDB_CONTEXT *deferred_open_tdb;
struct locking_data {
union {
@@ -318,7 +319,21 @@
DEBUG(0,("ERROR: Failed to initialise locking database\n"));
return False;
}
-
+
+ if (!read_only && !deferred_open_tdb) {
+ deferred_open_tdb = tdb_open_log(lock_path("deferred_open.tdb"),
+ 0, TDB_DEFAULT|TDB_CLEAR_IF_FIRST,
+ O_RDWR|O_CREAT,
+ 0644);
+
+ if (!deferred_open_tdb) {
+ DEBUG(0,("ERROR: Failed to initialise deferred open database\n"));
+ tdb_close(tdb);
+ tdb = NULL;
+ return False;
+ }
+ }
+
if (!posix_locking_init(read_only))
return False;
@@ -333,15 +348,20 @@
BOOL locking_end(void)
{
+ BOOL ret = True;
brl_shutdown(open_read_only);
if (tdb) {
+ if (tdb_close(tdb) != 0)
+ ret = False;
+ }
+ if (deferred_open_tdb) {
if (tdb_close(tdb) != 0)
- return False;
+ ret = False;
}
-
- return True;
+
+ return ret;
}
/*******************************************************************
@@ -975,7 +995,7 @@
*pp_de_entries = NULL;
- dbuf = tdb_fetch(tdb, key);
+ dbuf = tdb_fetch(deferred_open_tdb, key);
if (!dbuf.dptr)
return 0;
@@ -1032,13 +1052,13 @@
dbuf.dsize -= del_count * sizeof(deferred_open_entry);
if (data->u.num_deferred_open_entries == 0) {
- if (tdb_delete(tdb, key) == -1) {
+ if (tdb_delete(deferred_open_tdb, key) == -1) {
SAFE_FREE(de_entries);
SAFE_FREE(dbuf.dptr);
return 0;
}
} else {
- if (tdb_store(tdb, key, dbuf, TDB_REPLACE) == -1) {
+ if (tdb_store(deferred_open_tdb, key, dbuf, TDB_REPLACE) == -1) {
SAFE_FREE(de_entries);
SAFE_FREE(dbuf.dptr);
return 0;
@@ -1082,7 +1102,7 @@
TDB_DATA key = deferred_open_locking_key(entry->dev, entry->inode);
/* read in the existing share modes */
- dbuf = tdb_fetch(tdb, key);
+ dbuf = tdb_fetch(deferred_open_tdb, key);
if (!dbuf.dptr)
return -1;
@@ -1125,10 +1145,10 @@
/* store it back in the database */
if (data->u.num_deferred_open_entries == 0) {
- if (tdb_delete(tdb, key) == -1)
+ if (tdb_delete(deferred_open_tdb, key) == -1)
ret = False;
} else {
- if (tdb_store(tdb, key, dbuf, TDB_REPLACE) == -1)
+ if (tdb_store(deferred_open_tdb, key, dbuf, TDB_REPLACE) == -1)
ret = False;
}
}
@@ -1170,7 +1190,7 @@
BOOL ret = True;
/* read in the existing deferred open records if any */
- dbuf = tdb_fetch(tdb, key);
+ dbuf = tdb_fetch(deferred_open_tdb, key);
if (!dbuf.dptr) {
size_t offset;
/* we'll need to create a new record */
@@ -1190,7 +1210,7 @@
fill_deferred_open(p + sizeof(*data), mid, ptv, dev, inode, port);
dbuf.dptr = p;
dbuf.dsize = size;
- if (tdb_store(tdb, key, dbuf, TDB_REPLACE) == -1)
+ if (tdb_store(deferred_open_tdb, key, dbuf, TDB_REPLACE) == -1)
ret = False;
print_deferred_open_table((struct deferred_open_data *)p);
@@ -1220,7 +1240,7 @@
SAFE_FREE(dbuf.dptr);
dbuf.dptr = p;
dbuf.dsize = size;
- if (tdb_store(tdb, key, dbuf, TDB_REPLACE) == -1)
+ if (tdb_store(deferred_open_tdb, key, dbuf, TDB_REPLACE) == -1)
ret = False;
print_deferred_open_table((struct deferred_open_data *)p);
SAFE_FREE(p);
More information about the samba-cvs
mailing list