[SCM] Samba Shared Repository - branch master updated

Volker Lendecke vlendec at samba.org
Sun Mar 28 07:26:07 MDT 2010


The branch, master has been updated
       via  cae4105... s3: Remove unused bitmap_[allocate|free]
       via  59d09cb... s3: Use bitmap_talloc in vfs_full_audit.c
       via  d3c6f4a... s3: Use bitmap_talloc for smb1 server tcons
       via  c67e498... s3: Use bitmap_talloc in init_dptrs
       via  30c708b... s3: Use bitmap_talloc in files.c
       via  0205633... s3: Use bitmap_talloc in loadparm
       via  48f90be... s3: A NULL context might be perfectly valid for bitmap_talloc
       via  2356c22... s3: Fix a memleak in bitmap_talloc
       via  8a43679... s3: Use TALLOC_ZERO_ARRAY in bitmap_talloc
       via  ed5a65d... s3: Fix the memory hierarchy in bitmap_talloc
       via  d77a1fb... s3: Slightly simplify logic in conv_str_size
       via  ea0f937... s3: Fix indentation in conv_str_size
       via  e541013... s3: Fix some nonempty blank lines
       via  4d8a974... s3: Use tdb_transaction_start_nonblock in gencache_stabilize
       via  d5fd1f2... Revert "s3: Optimize gencache for smbd exit"
       via  3caaca9... s3: Fix typos in a debug message in vfs_init_custom
      from  09a676a... s4-selftest: use CONFIG_H environment variable to find config.h

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


- Log -----------------------------------------------------------------
commit cae4105c9232c4d11a13fe21c139b99e803a0282
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Mar 28 14:32:47 2010 +0200

    s3: Remove unused bitmap_[allocate|free]

commit 59d09cbed8e6fde867b88dce4408b64132e4ca6d
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Mar 28 14:26:53 2010 +0200

    s3: Use bitmap_talloc in vfs_full_audit.c
    
    This also simplifies the calling convention for init_bitmap() slightly

commit d3c6f4ae17d1311f90d549bd8d7e22e802e0be1a
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Mar 28 14:19:17 2010 +0200

    s3: Use bitmap_talloc for smb1 server tcons

commit c67e498ae863bb5f25dcb36162c473ede46400be
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Mar 28 14:16:55 2010 +0200

    s3: Use bitmap_talloc in init_dptrs

commit 30c708b902b6945e2cbcb7e1de40d475ce00eaad
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Mar 28 14:14:48 2010 +0200

    s3: Use bitmap_talloc in files.c

commit 0205633ed94a19d8723c3f2f252daf1b96729375
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Mar 28 14:13:48 2010 +0200

    s3: Use bitmap_talloc in loadparm

commit 48f90be7b9560258054486dce6514476b669ebfb
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Mar 28 14:05:55 2010 +0200

    s3: A NULL context might be perfectly valid for bitmap_talloc

commit 2356c22825de020ebf4ae8cb664fea96dc981749
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Mar 28 14:03:57 2010 +0200

    s3: Fix a memleak in bitmap_talloc

commit 8a43679cea769b3f568def53006690ef23c083c6
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Mar 28 14:03:31 2010 +0200

    s3: Use TALLOC_ZERO_ARRAY in bitmap_talloc

commit ed5a65d7a0f6a3e9697184b4e32081a77b65f78b
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Mar 28 14:02:47 2010 +0200

    s3: Fix the memory hierarchy in bitmap_talloc

commit d77a1fb272d06e9fa4f4b1cbe9b151625334ca9f
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Mar 28 13:16:58 2010 +0200

    s3: Slightly simplify logic in conv_str_size

commit ea0f9378a02ed3b64ab3b4f71862bfcb449d2b42
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Mar 28 13:16:18 2010 +0200

    s3: Fix indentation in conv_str_size

commit e541013e20572c96f7fe12814742b6f9eb3084db
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Mar 28 13:13:03 2010 +0200

    s3: Fix some nonempty blank lines

commit 4d8a974ddc1333a1e3c6ddf4a0e215a5e41e1074
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Mar 26 13:18:52 2010 +0100

    s3: Use tdb_transaction_start_nonblock in gencache_stabilize
    
    This avoids the thundering herd problem when 5000 smbds exit simultaneously
    because the network went down.

commit d5fd1f207757b4f15d15b8744db0c9380fe63cab
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Mar 26 13:15:53 2010 +0100

    Revert "s3: Optimize gencache for smbd exit"
    
    This reverts commit 5ca63676dc59e83ffd9560fdcfa26063f267f283.
    
    That does not fully fix the problem, adding a tdb_transaction_start_nonblock to fix it.

commit 3caaca90219c1fd8f7f9d668d3a537f6368b9417
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Mar 28 14:21:49 2010 +0200

    s3: Fix typos in a debug message in vfs_init_custom

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

Summary of changes:
 source3/include/proto.h          |    2 -
 source3/lib/bitmap.c             |   44 +----------------
 source3/lib/gencache.c           |  100 +++++++++-----------------------------
 source3/lib/util_str.c           |   66 +++++++++++++------------
 source3/modules/vfs_full_audit.c |   60 ++++++++---------------
 source3/modules/vfs_recycle.c    |   39 +++++++--------
 source3/param/loadparm.c         |   11 ++--
 source3/smbd/conn.c              |    6 +-
 source3/smbd/dir.c               |    3 +-
 source3/smbd/files.c             |    3 +-
 source3/smbd/vfs.c               |    3 +-
 11 files changed, 115 insertions(+), 222 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/proto.h b/source3/include/proto.h
index 7cc211b..c270a1d 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -334,8 +334,6 @@ const char *audit_policy_str(TALLOC_CTX *mem_ctx, uint32 policy);
 
 /* The following definitions come from lib/bitmap.c  */
 
-struct bitmap *bitmap_allocate(int n);
-void bitmap_free(struct bitmap *bm);
 struct bitmap *bitmap_talloc(TALLOC_CTX *mem_ctx, int n);
 int bitmap_copy(struct bitmap * const dst, const struct bitmap * const src);
 bool bitmap_set(struct bitmap *bm, unsigned i);
diff --git a/source3/lib/bitmap.c b/source3/lib/bitmap.c
index f753ffd..bd56b4a 100644
--- a/source3/lib/bitmap.c
+++ b/source3/lib/bitmap.c
@@ -23,62 +23,22 @@
    pool without repetition */
 
 /****************************************************************************
-allocate a bitmap of the specified size
-****************************************************************************/
-struct bitmap *bitmap_allocate(int n)
-{
-	struct bitmap *bm;
-
-	bm = SMB_MALLOC_P(struct bitmap);
-
-	if (!bm) return NULL;
-
-	bm->n = n;
-	bm->b = SMB_MALLOC_ARRAY(uint32, (n+31)/32);
-	if (!bm->b) {
-		SAFE_FREE(bm);
-		return NULL;
-	}
-
-	memset(bm->b, 0, sizeof(uint32)*((n+31)/32));
-
-	return bm;
-}
-
-/****************************************************************************
-free a bitmap.
-****************************************************************************/
-
-void bitmap_free(struct bitmap *bm)
-{
-	if (!bm)
-		return;
-
-	SAFE_FREE(bm->b);
-	SAFE_FREE(bm);
-}
-
-/****************************************************************************
 talloc a bitmap
 ****************************************************************************/
 struct bitmap *bitmap_talloc(TALLOC_CTX *mem_ctx, int n)
 {
 	struct bitmap *bm;
 
-	if (!mem_ctx) return NULL;
-
 	bm = TALLOC_P(mem_ctx, struct bitmap);
 
 	if (!bm) return NULL;
 
 	bm->n = n;
-	bm->b = TALLOC_ARRAY(mem_ctx, uint32, (n+31)/32);
+	bm->b = TALLOC_ZERO_ARRAY(bm, uint32, (n+31)/32);
 	if (!bm->b) {
+		TALLOC_FREE(bm);
 		return NULL;
 	}
-
-	memset(bm->b, 0, sizeof(uint32)*((n+31)/32));
-
 	return bm;
 }
 
diff --git a/source3/lib/gencache.c b/source3/lib/gencache.c
index 577ff12..a78e60a 100644
--- a/source3/lib/gencache.c
+++ b/source3/lib/gencache.c
@@ -40,13 +40,6 @@ static struct tdb_context *cache_notrans;
  * @brief Generic, persistent and shared between processes cache mechanism
  *        for use by various parts of the Samba code
  *
- * We have two cache files, one with transactions (gencache.tdb) and
- * one without (gencache_notrans.tdb) that is CLEAR_IF_FIRST. Normal
- * writes go to the gencache_notrans.tdb to be fast. Every 100 writes
- * to the gencache (settable with gencache:stabilize_count) or every 5
- * minutes (settable with gencache:stabilize_interval) we stabilize
- * gencache_notrans.tdb with one transaction to gencache.tdb.
- *
  **/
 
 
@@ -114,8 +107,7 @@ again:
 
 	DEBUG(5, ("Opening cache file at %s\n", cache_fname));
 
-	cache_notrans = tdb_open_log(cache_fname, 0,
-				     TDB_CLEAR_IF_FIRST | TDB_SEQNUM,
+	cache_notrans = tdb_open_log(cache_fname, 0, TDB_CLEAR_IF_FIRST,
 				     open_flags, 0644);
 	if (cache_notrans == NULL) {
 		DEBUG(5, ("Opening %s failed: %s\n", cache_fname,
@@ -136,51 +128,6 @@ static TDB_DATA last_stabilize_key(void)
 	return result;
 }
 
-struct gencache_parse_last_stabilize_state {
-	bool found;
-	int last_time;
-	int last_seqnum;
-};
-
-static int gencache_parse_last_stabilize_fn(TDB_DATA key, TDB_DATA data,
-					    void *private_data)
-{
-	struct gencache_parse_last_stabilize_state *state =
-		(struct gencache_parse_last_stabilize_state *)private_data;
-
-	if ((data.dptr == NULL) || (data.dsize == 0) ||
-	    (data.dptr[data.dsize-1] != '\0')) {
-		return -1;
-	}
-
-	if (sscanf((char *)data.dptr, "%d/%d", &state->last_time,
-		   &state->last_seqnum) != 2) {
-		return -1;
-	}
-
-	state->found = true;
-	return 0;
-}
-
-static bool gencache_parse_last_stabilize(time_t *last_time, int *last_seqnum)
-{
-	struct gencache_parse_last_stabilize_state state;
-
-	state.found = false;
-
-	if (tdb_parse_record(cache_notrans, last_stabilize_key(),
-			     gencache_parse_last_stabilize_fn,
-			     &state) == -1) {
-		return false;
-	}
-	if (!state.found) {
-		return false;
-	}
-	*last_time = state.last_time;
-	*last_seqnum = state.last_seqnum;
-	return true;
-}
-
 /**
  * Set an entry in the cache file. If there's no such
  * one, then add it.
@@ -197,9 +144,9 @@ bool gencache_set_data_blob(const char *keystr, const DATA_BLOB *blob,
 			    time_t timeout)
 {
 	int ret;
+	TDB_DATA databuf;
 	char* val;
 	time_t last_stabilize;
-	int last_seqnum;
 	static int writecount;
 
 	if (tdb_data_cmp(string_term_tdb_data(keystr),
@@ -259,15 +206,17 @@ bool gencache_set_data_blob(const char *keystr, const DATA_BLOB *blob,
 	 * gencache_notrans.tdb too large.
 	 */
 
-	if (gencache_parse_last_stabilize(&last_stabilize, &last_seqnum)) {
-		time_t next;
-
-		next = last_stabilize + lp_parm_int(
-			-1, "gencache", "stabilize_interval", 300);
-
-		if (next < time(NULL)) {
-			gencache_stabilize();
-		}
+	last_stabilize = 0;
+	databuf = tdb_fetch(cache_notrans, last_stabilize_key());
+	if ((databuf.dptr != NULL)
+	    && (databuf.dptr[databuf.dsize-1] == '\0')) {
+		last_stabilize = atoi((char *)databuf.dptr);
+		SAFE_FREE(databuf.dptr);
+	}
+	if ((last_stabilize
+	     + lp_parm_int(-1, "gencache", "stabilize_interval", 300))
+	    < time(NULL)) {
+		gencache_stabilize();
 	}
 
 done:
@@ -462,21 +411,22 @@ bool gencache_stabilize(void)
 	struct stabilize_state state;
 	int res;
 	char *now;
-	time_t last_time;
-	int last_seqnum;
 
 	if (!gencache_init()) {
 		return false;
 	}
 
-	if (gencache_parse_last_stabilize(&last_time, &last_seqnum)
-	    && (last_seqnum == tdb_get_seqnum(cache_notrans))) {
-		/* Nothing changed */
-		return true;
-	}
-
-	res = tdb_transaction_start(cache);
+	res = tdb_transaction_start_nonblock(cache);
 	if (res == -1) {
+
+		if (tdb_error(cache) == TDB_ERR_NOLOCK) {
+			/*
+			 * Someone else already does the stabilize,
+			 * this does not have to be done twice
+			 */
+			return true;
+		}
+
 		DEBUG(10, ("Could not start transaction on gencache.tdb: "
 			   "%s\n", tdb_errorstr(cache)));
 		return false;
@@ -527,9 +477,7 @@ bool gencache_stabilize(void)
 		return false;
 	}
 
-	now = talloc_asprintf(talloc_tos(), "%d/%d",
-			      (int)time(NULL),
-			      tdb_get_seqnum(cache_notrans)+1);
+	now = talloc_asprintf(talloc_tos(), "%d", (int)time(NULL));
 	if (now != NULL) {
 		tdb_store(cache_notrans, last_stabilize_key(),
 			  string_term_tdb_data(now), 0);
diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c
index 9a0b12a..3247682 100644
--- a/source3/lib/util_str.c
+++ b/source3/lib/util_str.c
@@ -2003,6 +2003,7 @@ uint64_t STR_TO_SMB_BIG_UINT(const char *nptr, const char **entptr)
  */
 SMB_OFF_T conv_str_size(const char * str)
 {
+	SMB_OFF_T lval_orig;
         SMB_OFF_T lval;
 	char * end;
 
@@ -2012,9 +2013,9 @@ SMB_OFF_T conv_str_size(const char * str)
 
 #ifdef HAVE_STRTOULL
 	if (sizeof(SMB_OFF_T) == 8) {
-	    lval = strtoull(str, &end, 10 /* base */);
+		lval = strtoull(str, &end, 10 /* base */);
 	} else {
-	    lval = strtoul(str, &end, 10 /* base */);
+		lval = strtoul(str, &end, 10 /* base */);
 	}
 #else
 	lval = strtoul(str, &end, 10 /* base */);
@@ -2024,35 +2025,38 @@ SMB_OFF_T conv_str_size(const char * str)
                 return 0;
         }
 
-        if (*end) {
-		SMB_OFF_T lval_orig = lval;
-
-                if (strwicmp(end, "K") == 0) {
-                        lval *= (SMB_OFF_T)1024;
-                } else if (strwicmp(end, "M") == 0) {
-                        lval *= ((SMB_OFF_T)1024 * (SMB_OFF_T)1024);
-                } else if (strwicmp(end, "G") == 0) {
-                        lval *= ((SMB_OFF_T)1024 * (SMB_OFF_T)1024 *
-				(SMB_OFF_T)1024);
-                } else if (strwicmp(end, "T") == 0) {
-                        lval *= ((SMB_OFF_T)1024 * (SMB_OFF_T)1024 *
-				(SMB_OFF_T)1024 * (SMB_OFF_T)1024);
-                } else if (strwicmp(end, "P") == 0) {
-                        lval *= ((SMB_OFF_T)1024 * (SMB_OFF_T)1024 *
-				(SMB_OFF_T)1024 * (SMB_OFF_T)1024 *
-				(SMB_OFF_T)1024);
-                } else {
-                        return 0;
-                }
-
-		/* Primitive attempt to detect wrapping on platforms with
-		 * 4-byte SMB_OFF_T. It's better to let the caller handle
-		 * a failure than some random number.
-		 */
-		if (lval_orig <= lval) {
-			return 0;
-		}
-        }
+        if (*end == '\0') {
+		return lval;
+	}
+
+	lval_orig = lval;
+
+	if (strwicmp(end, "K") == 0) {
+		lval *= (SMB_OFF_T)1024;
+	} else if (strwicmp(end, "M") == 0) {
+		lval *= ((SMB_OFF_T)1024 * (SMB_OFF_T)1024);
+	} else if (strwicmp(end, "G") == 0) {
+		lval *= ((SMB_OFF_T)1024 * (SMB_OFF_T)1024 *
+			 (SMB_OFF_T)1024);
+	} else if (strwicmp(end, "T") == 0) {
+		lval *= ((SMB_OFF_T)1024 * (SMB_OFF_T)1024 *
+			 (SMB_OFF_T)1024 * (SMB_OFF_T)1024);
+	} else if (strwicmp(end, "P") == 0) {
+		lval *= ((SMB_OFF_T)1024 * (SMB_OFF_T)1024 *
+			 (SMB_OFF_T)1024 * (SMB_OFF_T)1024 *
+			 (SMB_OFF_T)1024);
+	} else {
+		return 0;
+	}
+
+	/*
+	 * Primitive attempt to detect wrapping on platforms with
+	 * 4-byte SMB_OFF_T. It's better to let the caller handle a
+	 * failure than some random number.
+	 */
+	if (lval_orig <= lval) {
+		return 0;
+	}
 
 	return lval;
 }
diff --git a/source3/modules/vfs_full_audit.c b/source3/modules/vfs_full_audit.c
index 7e7a4f4..6986a86 100644
--- a/source3/modules/vfs_full_audit.c
+++ b/source3/modules/vfs_full_audit.c
@@ -431,22 +431,19 @@ static bool log_failure(vfs_handle_struct *handle, vfs_op_type op)
 	return bitmap_query(pd->failure_ops, op);
 }
 
-static void init_bitmap(struct bitmap **bm, const char **ops)
+static struct bitmap *init_bitmap(TALLOC_CTX *mem_ctx, const char **ops)
 {
-	if (*bm != NULL) {
-		return;
-	}
+	struct bitmap *bm;
 
 	if (ops == NULL) {
-		*bm = NULL;
-		return;
+		return NULL;
 	}
 
-	*bm = bitmap_allocate(SMB_VFS_OP_LAST);
-	if (*bm == NULL) {
+	bm = bitmap_talloc(mem_ctx, SMB_VFS_OP_LAST);
+	if (bm == NULL) {
 		DEBUG(0, ("Could not alloc bitmap -- "
 			  "defaulting to logging everything\n"));
-		return;
+		return NULL;
 	}
 
 	for (; *ops != NULL; ops += 1) {
@@ -456,7 +453,7 @@ static void init_bitmap(struct bitmap **bm, const char **ops)
 
 		if (strequal(*ops, "all")) {
 			for (i=0; i<SMB_VFS_OP_LAST; i++) {
-				bitmap_set(*bm, i);
+				bitmap_set(bm, i);
 			}
 			continue;
 		}
@@ -478,9 +475,9 @@ static void init_bitmap(struct bitmap **bm, const char **ops)
 			}
 			if (strequal(op, vfs_op_names[i].name)) {
 				if (neg) {
-					bitmap_clear(*bm, i);
+					bitmap_clear(bm, i);
 				} else {
-					bitmap_set(*bm, i);
+					bitmap_set(bm, i);
 				}
 				break;
 			}
@@ -488,11 +485,11 @@ static void init_bitmap(struct bitmap **bm, const char **ops)
 		if (i == SMB_VFS_OP_LAST) {
 			DEBUG(0, ("Could not find opname %s, logging all\n",
 				  *ops));
-			bitmap_free(*bm);
-			*bm = NULL;
-			break;
+			TALLOC_FREE(bm);
+			return NULL;
 		}
 	}
+	return bm;
 }
 
 static const char *audit_opname(vfs_op_type op)
@@ -588,22 +585,6 @@ static const char *fsp_str_do_log(const struct files_struct *fsp)
 	return smb_fname_str_do_log(fsp->fsp_name);
 }
 
-/* Free function for the private data. */
-
-static void free_private_data(void **p_data)
-{
-	struct vfs_full_audit_private_data *pd = *(struct vfs_full_audit_private_data **)p_data;
-
-	if (pd->success_ops) {
-		bitmap_free(pd->success_ops);
-	}
-	if (pd->failure_ops) {
-		bitmap_free(pd->failure_ops);
-	}
-	SAFE_FREE(pd);
-	*p_data = NULL;
-}
-
 /* Implementation of vfs_ops.  Pass everything on to the default
    operation but log event first. */
 
@@ -618,26 +599,25 @@ static int smb_full_audit_connect(vfs_handle_struct *handle,
 		return result;
 	}
 
-	pd = SMB_MALLOC_P(struct vfs_full_audit_private_data);
+	pd = TALLOC_ZERO_P(handle, struct vfs_full_audit_private_data);
 	if (!pd) {
 		SMB_VFS_NEXT_DISCONNECT(handle);
 		return -1;
 	}
-	ZERO_STRUCTP(pd);
 
 #ifndef WITH_SYSLOG
 	openlog("smbd_audit", 0, audit_syslog_facility(handle));
 #endif
 
-	init_bitmap(&pd->success_ops,
-		    lp_parm_string_list(SNUM(handle->conn), "full_audit", "success",
-					NULL));
-	init_bitmap(&pd->failure_ops,
-		    lp_parm_string_list(SNUM(handle->conn), "full_audit", "failure",
-					NULL));
+	pd->success_ops = init_bitmap(
+		pd, lp_parm_string_list(SNUM(handle->conn), "full_audit",
+					"success", NULL));
+	pd->failure_ops = init_bitmap(
+		pd, lp_parm_string_list(SNUM(handle->conn), "full_audit",
+					"failure", NULL));
 
 	/* Store the private data. */
-	SMB_VFS_HANDLE_SET_DATA(handle, pd, free_private_data,
+	SMB_VFS_HANDLE_SET_DATA(handle, pd, NULL,
 				struct vfs_full_audit_private_data, return -1);
 
 	do_log(SMB_VFS_OP_CONNECT, True, handle,
diff --git a/source3/modules/vfs_recycle.c b/source3/modules/vfs_recycle.c
index 6674427..fb009a1 100644
--- a/source3/modules/vfs_recycle.c
+++ b/source3/modules/vfs_recycle.c
@@ -61,23 +61,22 @@ static void recycle_disconnect(vfs_handle_struct *handle)
 static const char *recycle_repository(vfs_handle_struct *handle)
 {
 	const char *tmp_str = NULL;
-	
 
 	tmp_str = lp_parm_const_string(SNUM(handle->conn), "recycle", "repository",".recycle");
 
 	DEBUG(10, ("recycle: repository = %s\n", tmp_str));
-	
+
 	return tmp_str;
 }
 
 static bool recycle_keep_dir_tree(vfs_handle_struct *handle)
 {
 	bool ret;
-	
+
 	ret = lp_parm_bool(SNUM(handle->conn), "recycle", "keeptree", False);
 
 	DEBUG(10, ("recycle_bin: keeptree = %s\n", ret?"True":"False"));
-	
+
 	return ret;
 }
 
@@ -88,7 +87,7 @@ static bool recycle_versions(vfs_handle_struct *handle)
 	ret = lp_parm_bool(SNUM(handle->conn), "recycle", "versions", False);
 
 	DEBUG(10, ("recycle: versions = %s\n", ret?"True":"False"));
-	
+
 	return ret;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list