[SCM] Samba Shared Repository - branch master updated

Michael Adam obnox at samba.org
Mon Aug 8 08:45:04 MDT 2011


The branch, master has been updated
       via  43f3d6a s3-net: Fixed typo in net conf
       via  3db91e6 s3:smbconf let drop leave the smbconf key in place to match a virgin registry.tdb
       via  356ed86 s3:registry avoid updating keys which are going to be deleted in reg_deletekey_recursive
      from  db06b61 build: Make credentials a public library for OpenChange to use

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 43f3d6ad339e7ca914f14e6e8eac3a2cf0ff09db
Author: Vicentiu Ciorbaru <cvicentiu at gmail.com>
Date:   Wed Aug 3 23:24:09 2011 +0300

    s3-net: Fixed typo in net conf
    
    There was a missing ']' in net conf addshare usage message.
    
    Signed-off-by: Michael Adam <obnox at samba.org>
    
    Autobuild-User: Michael Adam <obnox at samba.org>
    Autobuild-Date: Mon Aug  8 16:44:08 CEST 2011 on sn-devel-104

commit 3db91e6599092e28b3b89a6a37fb45c8c7f0bdfb
Author: Gregor Beck <gbeck at sernet.de>
Date:   Tue Aug 2 14:52:12 2011 +0200

    s3:smbconf let drop leave the smbconf key in place to match a virgin registry.tdb
    
    Signed-off-by: Michael Adam <obnox at samba.org>

commit 356ed8644c0099a70ece5b7d5104662454d03ef8
Author: Gregor Beck <gbeck at sernet.de>
Date:   Mon Aug 1 15:27:46 2011 +0200

    s3:registry avoid updating keys which are going to be deleted in
    reg_deletekey_recursive
    
    this changes the complexity from O(n^2) to O(n) and reduces the time of
    a 'net conf drop' with 10000 shares from 6min to 1.5s
    
    Signed-off-by: Michael Adam <obnox at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 source3/include/registry.h             |    2 +-
 source3/lib/smbconf/smbconf_reg.c      |    2 +-
 source3/registry/reg_api.c             |   57 +++++++++++++++++++-------------
 source3/registry/reg_backend_db.c      |    8 ++++-
 source3/registry/reg_backend_smbconf.c |    4 +-
 source3/registry/reg_dispatcher.c      |    4 +-
 source3/registry/reg_dispatcher.h      |    2 +-
 source3/utils/net_conf.c               |    2 +-
 8 files changed, 49 insertions(+), 32 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/registry.h b/source3/include/registry.h
index c87b89a..f7a537e 100644
--- a/source3/include/registry.h
+++ b/source3/include/registry.h
@@ -45,7 +45,7 @@ struct registry_ops {
 	int 	(*fetch_values) ( const char *key, struct regval_ctr *val );
 	bool 	(*store_subkeys)( const char *key, struct regsubkey_ctr *subkeys );
 	WERROR	(*create_subkey)(const char *key, const char *subkey);
-	WERROR	(*delete_subkey)(const char *key, const char *subkey);
+	WERROR	(*delete_subkey)(const char *key, const char *subkey, bool lazy);
 	bool 	(*store_values)( const char *key, struct regval_ctr *val );
 	bool	(*reg_access_check)( const char *keyname, uint32 requested,
 				     uint32 *granted,
diff --git a/source3/lib/smbconf/smbconf_reg.c b/source3/lib/smbconf/smbconf_reg.c
index 92dbcba..ec6b93f 100644
--- a/source3/lib/smbconf/smbconf_reg.c
+++ b/source3/lib/smbconf/smbconf_reg.c
@@ -754,7 +754,7 @@ static sbcErr smbconf_reg_drop(struct smbconf_ctx *ctx)
 		goto done;
 	}
 
-	werr = reg_deletekey_recursive(parent_key, p+1);
+	werr = reg_deletesubkeys_recursive(parent_key, p+1);
 	if (!W_ERROR_IS_OK(werr)) {
 		err = SBC_ERR_IO_FAILURE;
 		goto done;
diff --git a/source3/registry/reg_api.c b/source3/registry/reg_api.c
index c66a95e..289f77d 100644
--- a/source3/registry/reg_api.c
+++ b/source3/registry/reg_api.c
@@ -606,41 +606,29 @@ WERROR reg_createkey(TALLOC_CTX *ctx, struct registry_key *parent,
 	return err;
 }
 
-WERROR reg_deletekey(struct registry_key *parent, const char *path)
+static WERROR reg_deletekey_internal(TALLOC_CTX *mem_ctx,
+				     struct registry_key *parent,
+				     const char *path, bool lazy)
 {
 	WERROR err;
 	char *name, *end;
-	struct registry_key *tmp_key, *key;
-	TALLOC_CTX *mem_ctx = talloc_stackframe();
-
+	struct registry_key *key;
 	name = talloc_strdup(mem_ctx, path);
 	if (name == NULL) {
 		err = WERR_NOMEM;
 		goto done;
 	}
 
-	/* check if the key has subkeys */
-	err = reg_openkey(mem_ctx, parent, name, REG_KEY_READ, &key);
-	W_ERROR_NOT_OK_GOTO_DONE(err);
-
-	err = fill_subkey_cache(key);
-	W_ERROR_NOT_OK_GOTO_DONE(err);
-
-	if (regsubkey_ctr_numkeys(key->subkeys) > 0) {
-		err = WERR_ACCESS_DENIED;
-		goto done;
-	}
-
 	/* no subkeys - proceed with delete */
 	end = strrchr(name, '\\');
 	if (end != NULL) {
 		*end = '\0';
 
 		err = reg_openkey(mem_ctx, parent, name,
-				  KEY_CREATE_SUB_KEY, &tmp_key);
+				  KEY_CREATE_SUB_KEY, &key);
 		W_ERROR_NOT_OK_GOTO_DONE(err);
 
-		parent = tmp_key;
+		parent = key;
 		name = end+1;
 	}
 
@@ -649,13 +637,36 @@ WERROR reg_deletekey(struct registry_key *parent, const char *path)
 		goto done;
 	}
 
-	err = delete_reg_subkey(parent->key, name);
+	err = delete_reg_subkey(parent->key, name, lazy);
+
+done:
+	return err;
+}
+
+WERROR reg_deletekey(struct registry_key *parent, const char *path)
+{
+	WERROR err;
+	struct registry_key *key;
+	TALLOC_CTX *mem_ctx = talloc_stackframe();
+
+	/* check if the key has subkeys */
+	err = reg_openkey(mem_ctx, parent, path, REG_KEY_READ, &key);
+	W_ERROR_NOT_OK_GOTO_DONE(err);
+
+	err = fill_subkey_cache(key);
+	W_ERROR_NOT_OK_GOTO_DONE(err);
 
+	if (regsubkey_ctr_numkeys(key->subkeys) > 0) {
+		err = WERR_ACCESS_DENIED;
+		goto done;
+	}
+	err = reg_deletekey_internal(mem_ctx, parent, path, false);
 done:
 	TALLOC_FREE(mem_ctx);
 	return err;
 }
 
+
 WERROR reg_setvalue(struct registry_key *key, const char *name,
 		    const struct registry_value *val)
 {
@@ -796,7 +807,7 @@ WERROR reg_deleteallvalues(struct registry_key *key)
  */
 static WERROR reg_deletekey_recursive_internal(struct registry_key *parent,
 					       const char *path,
-					       bool del_key)
+					       bool del_key, bool lazy)
 {
 	WERROR werr = WERR_OK;
 	struct registry_key *key;
@@ -819,13 +830,13 @@ static WERROR reg_deletekey_recursive_internal(struct registry_key *parent,
 	 */
 	for (i = regsubkey_ctr_numkeys(key->subkeys) ; i > 0; i--) {
 		subkey_name = regsubkey_ctr_specific_key(key->subkeys, i-1);
-		werr = reg_deletekey_recursive_internal(key, subkey_name, true);
+		werr = reg_deletekey_recursive_internal(key, subkey_name, true, del_key);
 		W_ERROR_NOT_OK_GOTO_DONE(werr);
 	}
 
 	if (del_key) {
 		/* now delete the actual key */
-		werr = reg_deletekey(parent, path);
+		werr = reg_deletekey_internal(mem_ctx, parent, path, lazy);
 	}
 
 done:
@@ -847,7 +858,7 @@ static WERROR reg_deletekey_recursive_trans(struct registry_key *parent,
 		return werr;
 	}
 
-	werr = reg_deletekey_recursive_internal(parent, path, del_key);
+	werr = reg_deletekey_recursive_internal(parent, path, del_key, false);
 
 	if (!W_ERROR_IS_OK(werr)) {
 		WERROR werr2;
diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c
index 62d4820..57d6d39 100644
--- a/source3/registry/reg_backend_db.c
+++ b/source3/registry/reg_backend_db.c
@@ -1287,6 +1287,7 @@ struct regdb_delete_subkey_context {
 	const char *key;
 	const char *subkey;
 	const char *path;
+	bool lazy;
 };
 
 static NTSTATUS regdb_delete_subkey_action(struct db_context *db,
@@ -1302,6 +1303,10 @@ static NTSTATUS regdb_delete_subkey_action(struct db_context *db,
 	werr = regdb_delete_key_lists(db, delete_ctx->path);
 	W_ERROR_NOT_OK_GOTO_DONE(werr);
 
+	if (delete_ctx->lazy) {
+		goto done;
+	}
+
 	werr = regsubkey_ctr_init(mem_ctx, &subkeys);
 	W_ERROR_NOT_OK_GOTO_DONE(werr);
 
@@ -1323,7 +1328,7 @@ done:
 	return werror_to_ntstatus(werr);
 }
 
-static WERROR regdb_delete_subkey(const char *key, const char *subkey)
+static WERROR regdb_delete_subkey(const char *key, const char *subkey, bool lazy)
 {
 	WERROR werr;
 	char *path;
@@ -1349,6 +1354,7 @@ static WERROR regdb_delete_subkey(const char *key, const char *subkey)
 	delete_ctx.key = key;
 	delete_ctx.subkey = subkey;
 	delete_ctx.path = path;
+	delete_ctx.lazy = lazy;
 
 	werr = ntstatus_to_werror(dbwrap_trans_do(regdb,
 						  regdb_delete_subkey_action,
diff --git a/source3/registry/reg_backend_smbconf.c b/source3/registry/reg_backend_smbconf.c
index 912f5eb..11abb9c 100644
--- a/source3/registry/reg_backend_smbconf.c
+++ b/source3/registry/reg_backend_smbconf.c
@@ -42,9 +42,9 @@ static WERROR smbconf_create_subkey(const char *key, const char *subkey)
 	return regdb_ops.create_subkey(key, subkey);
 }
 
-static WERROR smbconf_delete_subkey(const char *key, const char *subkey)
+static WERROR smbconf_delete_subkey(const char *key, const char *subkey, bool lazy)
 {
-	return regdb_ops.delete_subkey(key, subkey);
+	return regdb_ops.delete_subkey(key, subkey, lazy);
 }
 
 static int smbconf_fetch_values(const char *key, struct regval_ctr *val)
diff --git a/source3/registry/reg_dispatcher.c b/source3/registry/reg_dispatcher.c
index a960478..5b52e98 100644
--- a/source3/registry/reg_dispatcher.c
+++ b/source3/registry/reg_dispatcher.c
@@ -113,10 +113,10 @@ WERROR create_reg_subkey(struct registry_key_handle *key, const char *subkey)
 	return WERR_NOT_SUPPORTED;
 }
 
-WERROR delete_reg_subkey(struct registry_key_handle *key, const char *subkey)
+WERROR delete_reg_subkey(struct registry_key_handle *key, const char *subkey, bool lazy)
 {
 	if (key->ops && key->ops->delete_subkey) {
-		return key->ops->delete_subkey(key->name, subkey);
+		return key->ops->delete_subkey(key->name, subkey, lazy);
 	}
 
 	return WERR_NOT_SUPPORTED;
diff --git a/source3/registry/reg_dispatcher.h b/source3/registry/reg_dispatcher.h
index c80ba15..ec44746 100644
--- a/source3/registry/reg_dispatcher.h
+++ b/source3/registry/reg_dispatcher.h
@@ -25,7 +25,7 @@ bool store_reg_keys(struct registry_key_handle *key,
 		    struct regsubkey_ctr *subkeys);
 bool store_reg_values(struct registry_key_handle *key, struct regval_ctr *val);
 WERROR create_reg_subkey(struct registry_key_handle *key, const char *subkey);
-WERROR delete_reg_subkey(struct registry_key_handle *key, const char *subkey);
+WERROR delete_reg_subkey(struct registry_key_handle *key, const char *subkey, bool lazy);
 int fetch_reg_keys(struct registry_key_handle *key,
 		   struct regsubkey_ctr *subkey_ctr);
 int fetch_reg_values(struct registry_key_handle *key, struct regval_ctr *val);
diff --git a/source3/utils/net_conf.c b/source3/utils/net_conf.c
index e4b335a..a79b788 100644
--- a/source3/utils/net_conf.c
+++ b/source3/utils/net_conf.c
@@ -91,7 +91,7 @@ static int net_conf_addshare_usage(struct net_context *c, int argc,
 	d_printf("%s\n%s",
 		 _("Usage:"),
 		 _(" net conf addshare <sharename> <path> "
-		   "[writeable={y|N} [guest_ok={y|N} [<comment>]]\n"
+		   "[writeable={y|N} [guest_ok={y|N} [<comment>]]]\n"
 		   "\t<sharename>      the new share name.\n"
 		   "\t<path>           the path on the filesystem to export.\n"
 		   "\twriteable={y|N}  set \"writeable to \"yes\" or "


-- 
Samba Shared Repository


More information about the samba-cvs mailing list