summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2009-03-27 12:09:51 -0700
committerKarolin Seeger <kseeger@samba.org>2009-03-30 12:02:44 +0200
commit8a5d0e0989ea0ba40b0d08752248c3d2e4fb061b (patch)
treed06b082cdc03d7e28222e686c2f606847eec5d5d
parentf64d676dd13cf2c84d8e12dd07cad5fd77cc5891 (diff)
downloadsamba-8a5d0e0989ea0ba40b0d08752248c3d2e4fb061b.tar.gz
Fix bug #6195 - Migrating from 3.0.x to 3.3.x can fail to update passdb.tdb correctly. For the clustering case.
Clustered setups should have only ever used the unsigned version of TDB_DATA in the first place so they can't be in this mess :-). Just do the normal upgrade in the clustered case. Jeremy. (cherry picked from commit 52fe104996439db24a7e6b17baa7fec47ba230bb)
-rw-r--r--source/include/dbwrap.h2
-rw-r--r--source/lib/dbwrap.c27
-rw-r--r--source/passdb/pdb_tdb.c3
3 files changed, 31 insertions, 1 deletions
diff --git a/source/include/dbwrap.h b/source/include/dbwrap.h
index 1f388165dba..329c191af57 100644
--- a/source/include/dbwrap.h
+++ b/source/include/dbwrap.h
@@ -49,6 +49,8 @@ struct db_context {
bool persistent;
};
+bool db_is_local(const char *name);
+
struct db_context *db_open(TALLOC_CTX *mem_ctx,
const char *name,
int hash_size, int tdb_flags,
diff --git a/source/lib/dbwrap.c b/source/lib/dbwrap.c
index 7fe1631bff0..00182aa15e3 100644
--- a/source/lib/dbwrap.c
+++ b/source/lib/dbwrap.c
@@ -42,6 +42,33 @@ static int dbwrap_fallback_fetch(struct db_context *db, TALLOC_CTX *mem_ctx,
return 0;
}
+bool db_is_local(const char *name)
+{
+#ifdef CLUSTER_SUPPORT
+ const char *sockname = lp_ctdbd_socket();
+
+ if(!sockname || !*sockname) {
+ sockname = CTDB_PATH;
+ }
+
+ if (lp_clustering() && socket_exist(sockname)) {
+ const char *partname;
+ /* ctdb only wants the file part of the name */
+ partname = strrchr(name, '/');
+ if (partname) {
+ partname++;
+ } else {
+ partname = name;
+ }
+ /* allow ctdb for individual databases to be disabled */
+ if (lp_parm_bool(-1, "ctdb", partname, True)) {
+ return false;
+ }
+ }
+#endif
+ return true;
+}
+
/**
* If you need transaction support use db_open_trans()
*/
diff --git a/source/passdb/pdb_tdb.c b/source/passdb/pdb_tdb.c
index 9928768a219..f60517f7c1e 100644
--- a/source/passdb/pdb_tdb.c
+++ b/source/passdb/pdb_tdb.c
@@ -921,7 +921,8 @@ static bool tdbsam_convert(struct db_context **pp_db, const char *name, int32 fr
struct db_context *db = NULL;
int ret;
- if (!tdbsam_convert_backup(name, pp_db)) {
+ /* We only need the update backup for local db's. */
+ if (db_is_local(name) && !tdbsam_convert_backup(name, pp_db)) {
DEBUG(0, ("tdbsam_convert: Could not backup %s\n", name));
return false;
}