[SCM] Samba Shared Repository - branch master updated
Stefan Metzmacher
metze at samba.org
Fri Feb 7 10:06:03 MST 2014
The branch, master has been updated
via b210e7a dbwrap: use DBWRAP_LOCK_ORDER_VALID() in db_open()
via c7961ee dbwrap: completely check validity of lock order in dbwrap_check_lock_order()
via 9914017 dbwrap: add a comment explaining the supported lock orders
via 5e5a31b dbwrap: add DBWRAP_LOCK_ORDER_VALID()
via 8dbb582 dbwrap: add DBWRAP_LOCK_ORDER_MIN
via 24e434d dbwrap: move definition of DBWRAP_LOCK_ORDER_MAX to the private header.
via 44c6643 dbwrap: explicitly use DBWRAP_LOCK_ORDER_NONE in tdb->ntdb conversion
via 31c2336 s4:cluster: use DBWRAP_LOCK_ODER_NONE for local_db_tmp_open()
via 85235d0 libcli: use DBWRAP_LOCK_ORDER_NONE when opening schannel_store.tdb
via 4eb57bd dbwrap: introduce DBWRAP_LOCK_ORDER_NONE for lock order "0".
via 7e766a0 dbwrap: add dbwrap_flags argument to dbwrap_local_open()
via e4fbaad dbwrap: add a dbwrap_flags argument to db_open_ntdb()
via bbf0903 dbwrap: add a dbwrap_flags argument to db_open_tdb()
via 906abe5 s3:registry: introduce REG_DBWRAP_FLAGS to use for all db_open calls
via 020fab3 s3:rpc_client: optimize the netlogon_creds_cli.tdb for read-only access
via a20c977 dbwrap_open: add 'dbwrap_optimize_readonly:* = yes' option
via a97b588 dbwrap_ctdb: implement DBWRAP_FLAG_OPTIMIZE_READONLY_ACCESS
via 56bd404 dbwrap: add DBWRAP_FLAG_OPTIMIZE_READONLY_ACCESS
via 6def1c3 dbwrap: add a dbwrap_flags argument to db_open_ctdb()
via cf0cb0a dbwrap: add a dbwrap_flags argument to db_open()
via 229dcfd dbwrap: add flags DBWRAP_FLAG_NONE
from 353fdc5 .gitignore: Ignore tag files from GNU Global tool
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit b210e7aade5bc6445df22e4cd4b9b906cb40c236
Author: Michael Adam <obnox at samba.org>
Date: Tue Jan 28 11:58:05 2014 +0100
dbwrap: use DBWRAP_LOCK_ORDER_VALID() in db_open()
instead of the hand written test.
Signed-off-by: Michael Adam <obnox at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
Autobuild-User(master): Stefan Metzmacher <metze at samba.org>
Autobuild-Date(master): Fri Feb 7 18:05:51 CET 2014 on sn-devel-104
commit c7961ee4953dbcc8c45790d3c92fe3172e924f47
Author: Michael Adam <obnox at samba.org>
Date: Mon Jan 27 17:34:31 2014 +0100
dbwrap: completely check validity of lock order in dbwrap_check_lock_order()
This is currently not strictly necessay, because the
only caller catches the DBWRAP_LOCK_ORDER_NONE case,
and maximum is already checked, but this seems too dangerous to me.
Use the new DBWRAP_LOCK_ORDER_VALID() macro.
Signed-off-by: Michael Adam <obnox at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 99140170a587102493e9f073145ba941987d01d3
Author: Michael Adam <obnox at samba.org>
Date: Tue Jan 28 11:44:21 2014 +0100
dbwrap: add a comment explaining the supported lock orders
Signed-off-by: Michael Adam <obnox at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 5e5a31bfb2de9ffa9829db1002118773a22ac9e4
Author: Michael Adam <obnox at samba.org>
Date: Tue Jan 28 11:54:06 2014 +0100
dbwrap: add DBWRAP_LOCK_ORDER_VALID()
Signed-off-by: Michael Adam <obnox at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 8dbb58285b6590203d3c510c22cb6936fd642e5f
Author: Michael Adam <obnox at samba.org>
Date: Tue Jan 28 12:04:38 2014 +0100
dbwrap: add DBWRAP_LOCK_ORDER_MIN
Signed-off-by: Michael Adam <obnox at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 24e434d1aec880d1292d003cbcf6f869e3d35526
Author: Michael Adam <obnox at samba.org>
Date: Tue Jan 28 11:52:36 2014 +0100
dbwrap: move definition of DBWRAP_LOCK_ORDER_MAX to the private header.
This is only needed internally.
Signed-off-by: Michael Adam <obnox at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 44c66435bafc786f8a4c10e3652c7de168f642b1
Author: Michael Adam <obnox at samba.org>
Date: Tue Jan 28 12:42:31 2014 +0100
dbwrap: explicitly use DBWRAP_LOCK_ORDER_NONE in tdb->ntdb conversion
Make lack of lock order checking more visible.
Signed-off-by: Michael Adam <obnox at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 31c233651972c94b66d7cebf42ebcdcb43c39036
Author: Michael Adam <obnox at samba.org>
Date: Mon Jan 27 17:26:50 2014 +0100
s4:cluster: use DBWRAP_LOCK_ODER_NONE for local_db_tmp_open()
Make lack of lock oder checking more visible.
Signed-off-by: Michael Adam <obnox at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 85235d03c1030a8bd510232a068da7f933ceb268
Author: Michael Adam <obnox at samba.org>
Date: Mon Jan 27 17:25:54 2014 +0100
libcli: use DBWRAP_LOCK_ORDER_NONE when opening schannel_store.tdb
Make lack of lock order checking more visible.
Signed-off-by: Michael Adam <obnox at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 4eb57bd6e7e9cdb6de5cb7510267a71917cfe393
Author: Michael Adam <obnox at samba.org>
Date: Mon Jan 27 17:20:56 2014 +0100
dbwrap: introduce DBWRAP_LOCK_ORDER_NONE for lock order "0".
Ther are still some databases which are opened (locally) with
lock oder 0, which means don't do lock oder checking,
thereby circumventing this deadlock-prevention mechanism.
Add a symbolic constant for this "0" to make this circumvention
more explicit.
Signed-off-by: Michael Adam <obnox at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 7e766a0a8ade1f018015684c22bda82595a33d38
Author: Michael Adam <obnox at samba.org>
Date: Mon Jan 27 16:38:25 2014 +0100
dbwrap: add dbwrap_flags argument to dbwrap_local_open()
To be consistent with db_open() and prepare for future
possible extensions.
Signed-off-by: Michael Adam <obnox at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit e4fbaadb5cadaa584f455d624eafe706703cda1a
Author: Michael Adam <obnox at samba.org>
Date: Tue Jan 28 12:37:36 2014 +0100
dbwrap: add a dbwrap_flags argument to db_open_ntdb()
for consistency and to perpare for possible future
flags that the ntdb backend might be aware of.
Signed-off-by: Michael Adam <obnox at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit bbf0903d6bf60afc38b75332e36d81868c05d22c
Author: Michael Adam <obnox at samba.org>
Date: Tue Jan 28 12:33:42 2014 +0100
dbwrap: add a dbwrap_flags argument to db_open_tdb()
...for consistency and in preparation of future flags
that the tdb backend might be aware of.
Signed-off-by: Michael Adam <obnox at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 906abe55cbc6f0e2daed93975411d4fc1ece5d3a
Author: Michael Adam <obnox at samba.org>
Date: Mon Jan 27 16:19:52 2014 +0100
s3:registry: introduce REG_DBWRAP_FLAGS to use for all db_open calls
This is in accordance with the use of REG_TDB_FLAGS.
Signed-off-by: Michael Adam <obnox at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 020fab300d2f4f19301eff19ad810c71f77bbb78
Author: Michael Adam <obnox at samba.org>
Date: Mon Jan 27 16:21:14 2014 +0100
s3:rpc_client: optimize the netlogon_creds_cli.tdb for read-only access
Usually a record in this DB will be written once and then read
many times by winbindd processes on multiple nodes (when run in
a cluster). In order not to introduce a big performance penalty
with the increased correctness achieved by storing the netlogon
creds, in a cluster setup, we should activate ctdb's read only
record copies on this db.
Signed-off-by: Michael Adam <obnox at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit a20c977c7a58a0c09d01bfa046c00fcd3f1462de
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Jan 28 21:31:17 2014 +0100
dbwrap_open: add 'dbwrap_optimize_readonly:* = yes' option
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Michael Adam <obnox at samba.org>
commit a97b588b63f437d25c4344c76014326dbf0cbdb0
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Jan 28 21:24:22 2014 +0100
dbwrap_ctdb: implement DBWRAP_FLAG_OPTIMIZE_READONLY_ACCESS
For non-persistent databases we try to use CTDB_CONTROL_SET_DB_READONLY
in order to make use of readonly records.
Pair-Programmed-With: Michael Adam <obnox at samba.org>
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Signed-off-by: Michael Adam <obnox at samba.org>
commit 56bd4040889dfe492ff820497b7a6d76624a6048
Author: Michael Adam <obnox at samba.org>
Date: Tue Jan 28 11:31:44 2014 +0100
dbwrap: add DBWRAP_FLAG_OPTIMIZE_READONLY_ACCESS
Signed-off-by: Michael Adam <obnox at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 6def1c3f6e145abcc81ea69505133bbe128eacac
Author: Michael Adam <obnox at samba.org>
Date: Tue Jan 28 12:53:24 2014 +0100
dbwrap: add a dbwrap_flags argument to db_open_ctdb()
This is in preparation of directly supporting ctdb read only
record copies when opening a ctdb database from samba.
Signed-off-by: Michael Adam <obnox at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit cf0cb0add9ed47b8974272237fee0e1a4ba7bf68
Author: Michael Adam <obnox at samba.org>
Date: Mon Jan 27 14:49:12 2014 +0100
dbwrap: add a dbwrap_flags argument to db_open()
This is in preparation to support handing flags to backends,
in particular activating read only record support for ctdb
databases. For a start, this does nothing but adding the
parameter, and all databases use DBWRAP_FLAG_NONE.
Signed-off-by: Michael Adam <obnox at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
commit 229dcfd3501e4743d5d9aea5c9f7a97d7612a499
Author: Michael Adam <obnox at samba.org>
Date: Mon Jan 27 13:38:51 2014 +0100
dbwrap: add flags DBWRAP_FLAG_NONE
This is in preparation of adding a dbwrap_flags argument to db_open
and firends.
Signed-off-by: Michael Adam <obnox at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
-----------------------------------------------------------------------
Summary of changes:
auth/credentials/credentials_secrets.c | 3 +-
lib/dbwrap/dbwrap.c | 4 +-
lib/dbwrap/dbwrap.h | 12 +++++++-
lib/dbwrap/dbwrap_local_open.c | 14 ++++++---
lib/dbwrap/dbwrap_ntdb.c | 3 +-
lib/dbwrap/dbwrap_ntdb.h | 3 +-
lib/dbwrap/dbwrap_private.h | 7 +++++
lib/dbwrap/dbwrap_tdb.c | 3 +-
lib/dbwrap/dbwrap_tdb.h | 3 +-
libcli/auth/netlogon_creds_cli.c | 3 +-
libcli/auth/schannel_state_tdb.c | 3 +-
source3/groupdb/mapping_tdb.c | 2 +-
source3/lib/dbwrap/dbwrap_ctdb.c | 27 +++++++++++++++++-
source3/lib/dbwrap/dbwrap_ctdb.h | 3 +-
source3/lib/dbwrap/dbwrap_open.c | 42 +++++++++++++++++++++--------
source3/lib/dbwrap/dbwrap_open.h | 3 +-
source3/lib/dbwrap/dbwrap_watch.c | 3 +-
source3/lib/g_lock.c | 3 +-
source3/lib/serverid.c | 3 +-
source3/lib/sharesec.c | 2 +-
source3/locking/brlock.c | 2 +-
source3/locking/share_mode_lock.c | 2 +-
source3/modules/vfs_acl_tdb.c | 2 +-
source3/modules/vfs_xattr_tdb.c | 2 +-
source3/passdb/account_pol.c | 4 +-
source3/passdb/pdb_tdb.c | 6 ++--
source3/passdb/secrets.c | 2 +-
source3/printing/printer_list.c | 3 +-
source3/registry/reg_backend_db.c | 6 ++--
source3/registry/reg_db.h | 1 +
source3/rpc_client/cli_netlogon.c | 3 +-
source3/smbd/notify_internal.c | 4 +-
source3/smbd/smbXsrv_open.c | 3 +-
source3/smbd/smbXsrv_session.c | 3 +-
source3/smbd/smbXsrv_tcon.c | 3 +-
source3/smbd/smbXsrv_version.c | 3 +-
source3/torture/test_dbwrap_ctdb.c | 2 +-
source3/torture/test_dbwrap_watch.c | 3 +-
source3/torture/test_idmap_tdb_common.c | 2 +-
source3/torture/torture.c | 3 +-
source3/utils/dbwrap_tool.c | 2 +-
source3/utils/dbwrap_torture.c | 2 +-
source3/utils/net_idmap.c | 8 +++---
source3/utils/net_idmap_check.c | 2 +-
source3/utils/net_registry_check.c | 4 +-
source3/utils/status.c | 2 +-
source3/winbindd/idmap_autorid_tdb.c | 2 +-
source3/winbindd/idmap_tdb.c | 2 +-
source3/winbindd/idmap_tdb2.c | 2 +-
source4/cluster/local.c | 2 +-
source4/ntvfs/posix/python/pyxattr_tdb.c | 6 +++-
51 files changed, 161 insertions(+), 78 deletions(-)
Changeset truncated at 500 lines:
diff --git a/auth/credentials/credentials_secrets.c b/auth/credentials/credentials_secrets.c
index 6c1cded..9fad104 100644
--- a/auth/credentials/credentials_secrets.c
+++ b/auth/credentials/credentials_secrets.c
@@ -255,7 +255,8 @@ _PUBLIC_ NTSTATUS cli_credentials_set_machine_account(struct cli_credentials *cr
db_ctx = dbwrap_local_open(cred, lp_ctx, secrets_tdb, 0,
TDB_DEFAULT, O_RDWR, 0600,
- DBWRAP_LOCK_ORDER_1);
+ DBWRAP_LOCK_ORDER_1,
+ DBWRAP_FLAG_NONE);
/* Bleh, nasty recursion issues: We are setting a machine
* account here, so we don't want the 'pending' flag around
* any more */
diff --git a/lib/dbwrap/dbwrap.c b/lib/dbwrap/dbwrap.c
index 8270b63..d75c714 100644
--- a/lib/dbwrap/dbwrap.c
+++ b/lib/dbwrap/dbwrap.c
@@ -167,7 +167,7 @@ static struct dbwrap_lock_order_state *dbwrap_check_lock_order(
static struct db_context *locked_dbs[DBWRAP_LOCK_ORDER_MAX];
struct dbwrap_lock_order_state *state = NULL;
- if (db->lock_order > DBWRAP_LOCK_ORDER_MAX) {
+ if (!DBWRAP_LOCK_ORDER_VALID(db->lock_order)) {
DEBUG(0,("Invalid lock order %d of %s\n",
(int)db->lock_order, db->name));
smb_panic("invalid lock_order\n");
@@ -212,7 +212,7 @@ static struct db_record *dbwrap_fetch_locked_internal(
struct db_record *rec;
struct dbwrap_lock_order_state *lock_order = NULL;
- if (db->lock_order != 0) {
+ if (db->lock_order != DBWRAP_LOCK_ORDER_NONE) {
lock_order = dbwrap_check_lock_order(db, mem_ctx);
if (lock_order == NULL) {
return NULL;
diff --git a/lib/dbwrap/dbwrap.h b/lib/dbwrap/dbwrap.h
index 8bf3286..d289243 100644
--- a/lib/dbwrap/dbwrap.h
+++ b/lib/dbwrap/dbwrap.h
@@ -26,11 +26,18 @@ struct db_record;
struct db_context;
enum dbwrap_lock_order {
+ DBWRAP_LOCK_ORDER_NONE = 0, /* Don't check lock orders for this db. */
+ /*
+ * We only allow orders 1, 2, 3:
+ * These are the orders that CTDB currently supports.
+ */
DBWRAP_LOCK_ORDER_1 = 1,
DBWRAP_LOCK_ORDER_2 = 2,
DBWRAP_LOCK_ORDER_3 = 3
};
-#define DBWRAP_LOCK_ORDER_MAX DBWRAP_LOCK_ORDER_3
+
+#define DBWRAP_FLAG_NONE 0x0000000000000000ULL
+#define DBWRAP_FLAG_OPTIMIZE_READONLY_ACCESS 0x0000000000000001ULL
/* The following definitions come from lib/dbwrap.c */
@@ -157,6 +164,7 @@ struct db_context *dbwrap_local_open(TALLOC_CTX *mem_ctx,
const char *name,
int hash_size, int tdb_flags,
int open_flags, mode_t mode,
- enum dbwrap_lock_order lock_order);
+ enum dbwrap_lock_order lock_order,
+ uint64_t dbwrap_flags);
#endif /* __DBWRAP_H__ */
diff --git a/lib/dbwrap/dbwrap_local_open.c b/lib/dbwrap/dbwrap_local_open.c
index 56048af..6e40139 100644
--- a/lib/dbwrap/dbwrap_local_open.c
+++ b/lib/dbwrap/dbwrap_local_open.c
@@ -103,7 +103,8 @@ static bool tdb_to_ntdb(TALLOC_CTX *ctx, struct loadparm_context *lp_ctx,
return false;
}
tdb = db_open_tdb(ctx, lp_ctx, tdbname, 0,
- TDB_DEFAULT, O_RDONLY, 0, 0);
+ TDB_DEFAULT, O_RDONLY, 0, DBWRAP_LOCK_ORDER_NONE,
+ DBWRAP_FLAG_NONE);
if (!tdb) {
DEBUG(0, ("tdb_to_ntdb: could not open %s: %s\n",
tdbname, strerror(errno)));
@@ -111,7 +112,8 @@ static bool tdb_to_ntdb(TALLOC_CTX *ctx, struct loadparm_context *lp_ctx,
}
ntdb = db_open_ntdb(ctx, lp_ctx, ntdbname, dbwrap_hash_size(tdb),
TDB_DEFAULT, O_RDWR|O_CREAT|O_EXCL,
- st.st_mode & 0777, 0);
+ st.st_mode & 0777, DBWRAP_LOCK_ORDER_NONE,
+ DBWRAP_FLAG_NONE);
if (!ntdb) {
DEBUG(0, ("tdb_to_ntdb: could not create %s: %s\n",
ntdbname, strerror(errno)));
@@ -160,7 +162,8 @@ struct db_context *dbwrap_local_open(TALLOC_CTX *mem_ctx,
const char *name,
int hash_size, int tdb_flags,
int open_flags, mode_t mode,
- enum dbwrap_lock_order lock_order)
+ enum dbwrap_lock_order lock_order,
+ uint64_t dbwrap_flags)
{
TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
const char *ntdbname, *tdbname;
@@ -204,7 +207,8 @@ struct db_context *dbwrap_local_open(TALLOC_CTX *mem_ctx,
}
}
db = db_open_ntdb(mem_ctx, lp_ctx, ntdbname, hash_size,
- ntdb_flags, open_flags, mode, lock_order);
+ ntdb_flags, open_flags, mode, lock_order,
+ dbwrap_flags);
} else {
if (!streq(ntdbname, tdbname) && file_exist(ntdbname)) {
DEBUG(0, ("Refusing to open '%s' when '%s' exists\n",
@@ -213,7 +217,7 @@ struct db_context *dbwrap_local_open(TALLOC_CTX *mem_ctx,
}
db = db_open_tdb(mem_ctx, lp_ctx, tdbname, hash_size,
tdb_flags, open_flags, mode,
- lock_order);
+ lock_order, dbwrap_flags);
}
out:
talloc_free(tmp_ctx);
diff --git a/lib/dbwrap/dbwrap_ntdb.c b/lib/dbwrap/dbwrap_ntdb.c
index 48fe39e..5be5414 100644
--- a/lib/dbwrap/dbwrap_ntdb.c
+++ b/lib/dbwrap/dbwrap_ntdb.c
@@ -502,7 +502,8 @@ struct db_context *db_open_ntdb(TALLOC_CTX *mem_ctx,
const char *ntdbname,
int hash_size, int ntdb_flags,
int open_flags, mode_t mode,
- enum dbwrap_lock_order lock_order)
+ enum dbwrap_lock_order lock_order,
+ uint64_t dbwrap_flags)
{
struct db_context *result = NULL;
struct db_ntdb_ctx *db_ntdb;
diff --git a/lib/dbwrap/dbwrap_ntdb.h b/lib/dbwrap/dbwrap_ntdb.h
index b00a567..a1da1bc 100644
--- a/lib/dbwrap/dbwrap_ntdb.h
+++ b/lib/dbwrap/dbwrap_ntdb.h
@@ -30,6 +30,7 @@ struct db_context *db_open_ntdb(TALLOC_CTX *mem_ctx,
const char *name,
int hash_size, int ntdb_flags,
int open_flags, mode_t mode,
- enum dbwrap_lock_order lock_order);
+ enum dbwrap_lock_order lock_order,
+ uint64_t dbwrap_flags);
#endif /* __DBWRAP_NTDB_H__ */
diff --git a/lib/dbwrap/dbwrap_private.h b/lib/dbwrap/dbwrap_private.h
index da904f0..a6bad04 100644
--- a/lib/dbwrap/dbwrap_private.h
+++ b/lib/dbwrap/dbwrap_private.h
@@ -69,5 +69,12 @@ struct db_context {
void *stored_callback_private_data;
};
+#define DBWRAP_LOCK_ORDER_MIN DBWRAP_LOCK_ORDER_1
+#define DBWRAP_LOCK_ORDER_MAX DBWRAP_LOCK_ORDER_3
+
+#define DBWRAP_LOCK_ORDER_VALID(order) \
+ (((order) >= DBWRAP_LOCK_ORDER_MIN) && \
+ ((order) <= DBWRAP_LOCK_ORDER_MAX))
+
#endif /* __DBWRAP_PRIVATE_H__ */
diff --git a/lib/dbwrap/dbwrap_tdb.c b/lib/dbwrap/dbwrap_tdb.c
index 3f21192..1b061e3 100644
--- a/lib/dbwrap/dbwrap_tdb.c
+++ b/lib/dbwrap/dbwrap_tdb.c
@@ -401,7 +401,8 @@ struct db_context *db_open_tdb(TALLOC_CTX *mem_ctx,
const char *name,
int hash_size, int tdb_flags,
int open_flags, mode_t mode,
- enum dbwrap_lock_order lock_order)
+ enum dbwrap_lock_order lock_order,
+ uint64_t dbrwap_flags)
{
struct db_context *result = NULL;
struct db_tdb_ctx *db_tdb;
diff --git a/lib/dbwrap/dbwrap_tdb.h b/lib/dbwrap/dbwrap_tdb.h
index 6a6da45..93ee09c 100644
--- a/lib/dbwrap/dbwrap_tdb.h
+++ b/lib/dbwrap/dbwrap_tdb.h
@@ -29,7 +29,8 @@ struct db_context *db_open_tdb(TALLOC_CTX *mem_ctx,
const char *name,
int hash_size, int tdb_flags,
int open_flags, mode_t mode,
- enum dbwrap_lock_order lock_order);
+ enum dbwrap_lock_order lock_order,
+ uint64_t dbwrap_flags);
#endif /* __DBWRAP_TDB_H__ */
diff --git a/libcli/auth/netlogon_creds_cli.c b/libcli/auth/netlogon_creds_cli.c
index 88893ad..d73335d 100644
--- a/libcli/auth/netlogon_creds_cli.c
+++ b/libcli/auth/netlogon_creds_cli.c
@@ -227,7 +227,8 @@ NTSTATUS netlogon_creds_cli_open_global_db(struct loadparm_context *lp_ctx)
fname, 0,
TDB_CLEAR_IF_FIRST|TDB_INCOMPATIBLE_HASH,
O_RDWR|O_CREAT,
- 0600, DBWRAP_LOCK_ORDER_2);
+ 0600, DBWRAP_LOCK_ORDER_2,
+ DBWRAP_FLAG_NONE);
if (global_db == NULL) {
DEBUG(0,("netlogon_creds_cli_open_global_db: Failed to open %s - %s\n",
fname, strerror(errno)));
diff --git a/libcli/auth/schannel_state_tdb.c b/libcli/auth/schannel_state_tdb.c
index 6669b46..2d3481d 100644
--- a/libcli/auth/schannel_state_tdb.c
+++ b/libcli/auth/schannel_state_tdb.c
@@ -49,7 +49,8 @@ struct db_context *open_schannel_session_store(TALLOC_CTX *mem_ctx,
db_sc = dbwrap_local_open(mem_ctx, lp_ctx, fname, 0,
TDB_CLEAR_IF_FIRST|TDB_NOSYNC, O_RDWR|O_CREAT,
- 0600, 0);
+ 0600, DBWRAP_LOCK_ORDER_NONE,
+ DBWRAP_FLAG_NONE);
if (!db_sc) {
DEBUG(0,("open_schannel_session_store: Failed to open %s - %s\n",
diff --git a/source3/groupdb/mapping_tdb.c b/source3/groupdb/mapping_tdb.c
index 3cb1024..cc397d9 100644
--- a/source3/groupdb/mapping_tdb.c
+++ b/source3/groupdb/mapping_tdb.c
@@ -54,7 +54,7 @@ static bool init_group_mapping(void)
db = db_open(NULL, state_path("group_mapping.tdb"), 0,
TDB_DEFAULT, O_RDWR|O_CREAT, 0600,
- DBWRAP_LOCK_ORDER_1);
+ DBWRAP_LOCK_ORDER_1, DBWRAP_FLAG_NONE);
if (db == NULL) {
DEBUG(0, ("Failed to open group mapping database: %s\n",
strerror(errno)));
diff --git a/source3/lib/dbwrap/dbwrap_ctdb.c b/source3/lib/dbwrap/dbwrap_ctdb.c
index 98a9138..87e644d 100644
--- a/source3/lib/dbwrap/dbwrap_ctdb.c
+++ b/source3/lib/dbwrap/dbwrap_ctdb.c
@@ -1569,7 +1569,8 @@ struct db_context *db_open_ctdb(TALLOC_CTX *mem_ctx,
const char *name,
int hash_size, int tdb_flags,
int open_flags, mode_t mode,
- enum dbwrap_lock_order lock_order)
+ enum dbwrap_lock_order lock_order,
+ uint64_t dbwrap_flags)
{
struct db_context *result;
struct db_ctdb_ctx *db_ctdb;
@@ -1648,6 +1649,27 @@ struct db_context *db_open_ctdb(TALLOC_CTX *mem_ctx,
return NULL;
}
+#ifdef HAVE_CTDB_WANT_READONLY_DECL
+ if (!result->persistent &&
+ (dbwrap_flags & DBWRAP_FLAG_OPTIMIZE_READONLY_ACCESS))
+ {
+ TDB_DATA indata;
+
+ indata = make_tdb_data((uint8_t *)&db_ctdb->db_id,
+ sizeof(db_ctdb->db_id));
+
+ status = ctdbd_control_local(
+ conn, CTDB_CONTROL_SET_DB_READONLY, 0, 0, indata,
+ NULL, NULL, &cstatus);
+ if (!NT_STATUS_IS_OK(status) || (cstatus != 0)) {
+ DEBUG(1, ("CTDB_CONTROL_SET_DB_READONLY failed: "
+ "%s, %d\n", nt_errstr(status), cstatus));
+ TALLOC_FREE(result);
+ return NULL;
+ }
+ }
+#endif
+
lp_ctx = loadparm_init_s3(db_path, loadparm_s3_helpers());
db_ctdb->wtdb = tdb_wrap_open(db_ctdb, db_path, hash_size, tdb_flags,
@@ -1703,7 +1725,8 @@ struct db_context *db_open_ctdb(TALLOC_CTX *mem_ctx,
const char *name,
int hash_size, int tdb_flags,
int open_flags, mode_t mode,
- enum dbwrap_lock_order lock_order)
+ enum dbwrap_lock_order lock_order,
+ uint64_t dbwrap_flags)
{
DEBUG(3, ("db_open_ctdb: no cluster support!\n"));
errno = ENOSYS;
diff --git a/source3/lib/dbwrap/dbwrap_ctdb.h b/source3/lib/dbwrap/dbwrap_ctdb.h
index bfbe3bd..3196b91 100644
--- a/source3/lib/dbwrap/dbwrap_ctdb.h
+++ b/source3/lib/dbwrap/dbwrap_ctdb.h
@@ -31,6 +31,7 @@ struct db_context *db_open_ctdb(TALLOC_CTX *mem_ctx,
const char *name,
int hash_size, int tdb_flags,
int open_flags, mode_t mode,
- enum dbwrap_lock_order lock_order);
+ enum dbwrap_lock_order lock_order,
+ uint64_t dbwrap_flags);
#endif /* __DBWRAP_CTDB_H__ */
diff --git a/source3/lib/dbwrap/dbwrap_open.c b/source3/lib/dbwrap/dbwrap_open.c
index 515b4bf..3c8756b 100644
--- a/source3/lib/dbwrap/dbwrap_open.c
+++ b/source3/lib/dbwrap/dbwrap_open.c
@@ -60,26 +60,44 @@ struct db_context *db_open(TALLOC_CTX *mem_ctx,
const char *name,
int hash_size, int tdb_flags,
int open_flags, mode_t mode,
- enum dbwrap_lock_order lock_order)
+ enum dbwrap_lock_order lock_order,
+ uint64_t dbwrap_flags)
{
struct db_context *result = NULL;
#ifdef CLUSTER_SUPPORT
const char *sockname;
#endif
- switch (lock_order) {
- case DBWRAP_LOCK_ORDER_1:
- case DBWRAP_LOCK_ORDER_2:
- case DBWRAP_LOCK_ORDER_3:
- break;
- default:
- /*
- * Only allow the 3 levels ctdb gives us.
- */
+ if (!DBWRAP_LOCK_ORDER_VALID(lock_order)) {
errno = EINVAL;
return NULL;
}
+ if (tdb_flags & TDB_CLEAR_IF_FIRST) {
+ const char *base;
+ bool try_readonly = false;
+
+ base = strrchr_m(name, '/');
+ if (base != NULL) {
+ base += 1;
+ } else {
+ base = name;
+ }
+
+ if (dbwrap_flags & DBWRAP_FLAG_OPTIMIZE_READONLY_ACCESS) {
+ try_readonly = true;
+ }
+
+ try_readonly = lp_parm_bool(-1, "dbwrap_optimize_readonly", "*", try_readonly);
+ try_readonly = lp_parm_bool(-1, "dbwrap_optimize_readonly", base, try_readonly);
+
+ if (try_readonly) {
+ dbwrap_flags |= DBWRAP_FLAG_OPTIMIZE_READONLY_ACCESS;
+ } else {
+ dbwrap_flags &= ~DBWRAP_FLAG_OPTIMIZE_READONLY_ACCESS;
+ }
+ }
+
#ifdef CLUSTER_SUPPORT
sockname = lp_ctdbd_socket();
@@ -103,7 +121,7 @@ struct db_context *db_open(TALLOC_CTX *mem_ctx,
if (lp_parm_bool(-1, "ctdb", partname, True)) {
result = db_open_ctdb(mem_ctx, partname, hash_size,
tdb_flags, open_flags, mode,
- lock_order);
+ lock_order, dbwrap_flags);
if (result == NULL) {
DEBUG(0,("failed to attach to ctdb %s\n",
partname));
@@ -121,7 +139,7 @@ struct db_context *db_open(TALLOC_CTX *mem_ctx,
struct loadparm_context *lp_ctx = loadparm_init_s3(mem_ctx, loadparm_s3_helpers());
result = dbwrap_local_open(mem_ctx, lp_ctx, name, hash_size,
tdb_flags, open_flags, mode,
- lock_order);
+ lock_order, dbwrap_flags);
talloc_unlink(mem_ctx, lp_ctx);
}
return result;
diff --git a/source3/lib/dbwrap/dbwrap_open.h b/source3/lib/dbwrap/dbwrap_open.h
index 51c7dfd..d14794e 100644
--- a/source3/lib/dbwrap/dbwrap_open.h
+++ b/source3/lib/dbwrap/dbwrap_open.h
@@ -39,6 +39,7 @@ struct db_context *db_open(TALLOC_CTX *mem_ctx,
const char *name,
int hash_size, int tdb_flags,
int open_flags, mode_t mode,
- enum dbwrap_lock_order lock_order);
+ enum dbwrap_lock_order lock_order,
+ uint64_t dbwrap_flags);
#endif /* __DBWRAP_OPEN_H__ */
diff --git a/source3/lib/dbwrap/dbwrap_watch.c b/source3/lib/dbwrap/dbwrap_watch.c
index b586b66..ba4381e 100644
--- a/source3/lib/dbwrap/dbwrap_watch.c
+++ b/source3/lib/dbwrap/dbwrap_watch.c
@@ -33,7 +33,8 @@ static struct db_context *dbwrap_record_watchers_db(void)
watchers_db = db_open(
NULL, lock_path("dbwrap_watchers.tdb"), 0,
TDB_CLEAR_IF_FIRST | TDB_INCOMPATIBLE_HASH,
- O_RDWR|O_CREAT, 0600, DBWRAP_LOCK_ORDER_3);
+ O_RDWR|O_CREAT, 0600, DBWRAP_LOCK_ORDER_3,
+ DBWRAP_FLAG_NONE);
}
return watchers_db;
}
diff --git a/source3/lib/g_lock.c b/source3/lib/g_lock.c
index 8c7a6c2..6813f06 100644
--- a/source3/lib/g_lock.c
+++ b/source3/lib/g_lock.c
@@ -61,7 +61,8 @@ struct g_lock_ctx *g_lock_ctx_init(TALLOC_CTX *mem_ctx,
result->db = db_open(result, lock_path("g_lock.tdb"), 0,
TDB_CLEAR_IF_FIRST|TDB_INCOMPATIBLE_HASH,
O_RDWR|O_CREAT, 0600,
- DBWRAP_LOCK_ORDER_2);
+ DBWRAP_LOCK_ORDER_2,
+ DBWRAP_FLAG_NONE);
if (result->db == NULL) {
DEBUG(1, ("g_lock_init: Could not open g_lock.tdb\n"));
TALLOC_FREE(result);
diff --git a/source3/lib/serverid.c b/source3/lib/serverid.c
index cb49520..4259887 100644
--- a/source3/lib/serverid.c
+++ b/source3/lib/serverid.c
@@ -77,7 +77,8 @@ static struct db_context *serverid_db(void)
}
db = db_open(NULL, lock_path("serverid.tdb"), 0,
TDB_DEFAULT|TDB_CLEAR_IF_FIRST|TDB_INCOMPATIBLE_HASH,
- O_RDWR|O_CREAT, 0644, DBWRAP_LOCK_ORDER_2);
+ O_RDWR|O_CREAT, 0644, DBWRAP_LOCK_ORDER_2,
+ DBWRAP_FLAG_NONE);
return db;
}
diff --git a/source3/lib/sharesec.c b/source3/lib/sharesec.c
index c7a8e51..095c851 100644
--- a/source3/lib/sharesec.c
+++ b/source3/lib/sharesec.c
@@ -149,7 +149,7 @@ bool share_info_db_init(void)
share_db = db_open(NULL, state_path("share_info.tdb"), 0,
TDB_DEFAULT, O_RDWR|O_CREAT, 0600,
- DBWRAP_LOCK_ORDER_1);
+ DBWRAP_LOCK_ORDER_1, DBWRAP_FLAG_NONE);
if (share_db == NULL) {
DEBUG(0,("Failed to open share info database %s (%s)\n",
state_path("share_info.tdb"), strerror(errno) ));
diff --git a/source3/locking/brlock.c b/source3/locking/brlock.c
index e1f0c15..a516b60 100644
--- a/source3/locking/brlock.c
+++ b/source3/locking/brlock.c
@@ -328,7 +328,7 @@ void brl_init(bool read_only)
brlock_db = db_open(NULL, lock_path("brlock.tdb"),
SMB_OPEN_DATABASE_TDB_HASH_SIZE, tdb_flags,
read_only?O_RDONLY:(O_RDWR|O_CREAT), 0644,
- DBWRAP_LOCK_ORDER_2);
+ DBWRAP_LOCK_ORDER_2, DBWRAP_FLAG_NONE);
if (!brlock_db) {
DEBUG(0,("Failed to open byte range locking database %s\n",
lock_path("brlock.tdb")));
diff --git a/source3/locking/share_mode_lock.c b/source3/locking/share_mode_lock.c
index 20756bf..5d0874c 100644
--- a/source3/locking/share_mode_lock.c
+++ b/source3/locking/share_mode_lock.c
@@ -67,7 +67,7 @@ static bool locking_init_internal(bool read_only)
SMB_OPEN_DATABASE_TDB_HASH_SIZE,
TDB_DEFAULT|TDB_VOLATILE|TDB_CLEAR_IF_FIRST|TDB_INCOMPATIBLE_HASH,
read_only?O_RDONLY:O_RDWR|O_CREAT, 0644,
- DBWRAP_LOCK_ORDER_1);
+ DBWRAP_LOCK_ORDER_1, DBWRAP_FLAG_NONE);
if (!lock_db) {
DEBUG(0,("ERROR: Failed to initialise locking database\n"));
diff --git a/source3/modules/vfs_acl_tdb.c b/source3/modules/vfs_acl_tdb.c
index 80839e3..8ee4bd5 100644
--- a/source3/modules/vfs_acl_tdb.c
+++ b/source3/modules/vfs_acl_tdb.c
@@ -60,7 +60,7 @@ static bool acl_tdb_init(void)
become_root();
acl_db = db_open(NULL, dbname, 0, TDB_DEFAULT, O_RDWR|O_CREAT, 0600,
- DBWRAP_LOCK_ORDER_1);
+ DBWRAP_LOCK_ORDER_1, DBWRAP_FLAG_NONE);
unbecome_root();
if (acl_db == NULL) {
diff --git a/source3/modules/vfs_xattr_tdb.c b/source3/modules/vfs_xattr_tdb.c
index 43456cf..63a12fd 100644
--- a/source3/modules/vfs_xattr_tdb.c
+++ b/source3/modules/vfs_xattr_tdb.c
@@ -320,7 +320,7 @@ static bool xattr_tdb_init(int snum, TALLOC_CTX *mem_ctx, struct db_context **p_
become_root();
db = db_open(NULL, dbname, 0, TDB_DEFAULT, O_RDWR|O_CREAT, 0600,
- DBWRAP_LOCK_ORDER_2);
+ DBWRAP_LOCK_ORDER_2, DBWRAP_FLAG_NONE);
unbecome_root();
if (db == NULL) {
diff --git a/source3/passdb/account_pol.c b/source3/passdb/account_pol.c
index 06925e8..5f2c7ab 100644
--- a/source3/passdb/account_pol.c
--
Samba Shared Repository
More information about the samba-cvs
mailing list