summaryrefslogtreecommitdiff
path: root/lib/tdb/common/traverse.c
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2009-07-18 15:28:58 +0930
committerMichael Adam <obnox@samba.org>2009-07-20 22:17:20 +0200
commit54a51839ea65aa788b18fce8de0ae4f9ba63e4e7 (patch)
tree110e1d6c35973f38026705aa5c1cea31dd1b2007 /lib/tdb/common/traverse.c
parentc80783eafd28bb3d749761cbbed80423c908d247 (diff)
downloadsamba-54a51839ea65aa788b18fce8de0ae4f9ba63e4e7.tar.gz
samba-54a51839ea65aa788b18fce8de0ae4f9ba63e4e7.tar.bz2
samba-54a51839ea65aa788b18fce8de0ae4f9ba63e4e7.zip
Make tdb transaction lock recursive (samba version)
This patch replaces 6ed27edbcd3ba1893636a8072c8d7a621437daf7 and 1a416ff13ca7786f2e8d24c66addf00883e9cb12, which fixed the bug where traversals inside transactions would release the transaction lock early. This solution is more general, and solves the more minor symptom that nested traversals would also release the transaction lock early. (It was also suggestd in Volker's comment in 6ed27ed). This patch also applies to ctdb, if the traverse.c part is removed (ctdb's tdb code never received the previous two fixes). Tested using the testsuite from ccan (adapted to the samba code). Thanks to Michael Adam for feedback. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Signed-off-by: Michael Adam <obnox@samba.org>
Diffstat (limited to 'lib/tdb/common/traverse.c')
-rw-r--r--lib/tdb/common/traverse.c22
1 files changed, 6 insertions, 16 deletions
diff --git a/lib/tdb/common/traverse.c b/lib/tdb/common/traverse.c
index 69c81e6e98..07b0c23858 100644
--- a/lib/tdb/common/traverse.c
+++ b/lib/tdb/common/traverse.c
@@ -204,23 +204,18 @@ int tdb_traverse_read(struct tdb_context *tdb,
{
struct tdb_traverse_lock tl = { NULL, 0, 0, F_RDLCK };
int ret;
- bool in_transaction = (tdb->transaction != NULL);
/* we need to get a read lock on the transaction lock here to
cope with the lock ordering semantics of solaris10 */
- if (!in_transaction) {
- if (tdb_transaction_lock(tdb, F_RDLCK)) {
- return -1;
- }
+ if (tdb_transaction_lock(tdb, F_RDLCK)) {
+ return -1;
}
tdb->traverse_read++;
ret = tdb_traverse_internal(tdb, fn, private_data, &tl);
tdb->traverse_read--;
- if (!in_transaction) {
- tdb_transaction_unlock(tdb);
- }
+ tdb_transaction_unlock(tdb);
return ret;
}
@@ -237,25 +232,20 @@ int tdb_traverse(struct tdb_context *tdb,
{
struct tdb_traverse_lock tl = { NULL, 0, 0, F_WRLCK };
int ret;
- bool in_transaction = (tdb->transaction != NULL);
if (tdb->read_only || tdb->traverse_read) {
return tdb_traverse_read(tdb, fn, private_data);
}
- if (!in_transaction) {
- if (tdb_transaction_lock(tdb, F_WRLCK)) {
- return -1;
- }
+ if (tdb_transaction_lock(tdb, F_WRLCK)) {
+ return -1;
}
tdb->traverse_write++;
ret = tdb_traverse_internal(tdb, fn, private_data, &tl);
tdb->traverse_write--;
- if (!in_transaction) {
- tdb_transaction_unlock(tdb);
- }
+ tdb_transaction_unlock(tdb);
return ret;
}