[SCM] Samba Shared Repository - branch v3-2-test updated - release-3-2-0pre2-3336-g3954c69

Jeremy Allison jra at samba.org
Wed Jan 7 19:08:26 GMT 2009


The branch, v3-2-test has been updated
       via  3954c6965240836a467d16f447197681b7396a31 (commit)
      from  9995378cf3f28af183030c3867513552d85bf935 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-test


- Log -----------------------------------------------------------------
commit 3954c6965240836a467d16f447197681b7396a31
Author: boyang <boyang at suse.de>
Date:   Wed Jan 7 11:07:42 2009 -0800

    refresh sequence number as soon as possible when domain->sequence_number == -1 or domain->last_status is not ok.

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

Summary of changes:
 source/include/local.h           |    4 ++++
 source/include/smb.h             |    6 ++++++
 source/modules/vfs_default.c     |    6 +++++-
 source/param/loadparm.c          |   27 +++++++++++++++++++++------
 source/smbd/fileio.c             |    5 +++--
 source/smbd/vfs.c                |   13 +++++++++++--
 source/winbindd/winbindd_cache.c |   11 ++++++++---
 7 files changed, 58 insertions(+), 14 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/include/local.h b/source/include/local.h
index c125ded..b0fd7cb 100644
--- a/source/include/local.h
+++ b/source/include/local.h
@@ -253,4 +253,8 @@
 /* Windows minimum lock resolution timeout in ms */
 #define WINDOWS_MINIMUM_LOCK_TIMEOUT_MS 200
 
+/* When strict allocate = partial, define the limit on how far
+ * ahead we will write. */
+#define STRICT_ALLOCATE_PARTIAL_LIMIT 0x200000
+
 #endif
diff --git a/source/include/smb.h b/source/include/smb.h
index e248164..2aa708a 100644
--- a/source/include/smb.h
+++ b/source/include/smb.h
@@ -1966,4 +1966,10 @@ struct smb_extended_info {
 	char   samba_version_string[SAMBA_EXTENDED_INFO_VERSION_STRING_LENGTH];
 };
 
+enum smb_strict_allocate_options {
+	STRICT_ALLOCATE_OFF=0,
+	STRICT_ALLOCATE_ON=1,
+	STRICT_ALLOCATE_PARTIAL=2
+};
+
 #endif /* _SMB_H */
diff --git a/source/modules/vfs_default.c b/source/modules/vfs_default.c
index 2da97f1..ff8e19a 100644
--- a/source/modules/vfs_default.c
+++ b/source/modules/vfs_default.c
@@ -759,10 +759,14 @@ static int vfswrap_ftruncate(vfs_handle_struct *handle, files_struct *fsp, SMB_O
 	SMB_STRUCT_STAT st;
 	char c = 0;
 	SMB_OFF_T currpos;
+	enum smb_strict_allocate_options sa_options = lp_strict_allocate(SNUM(fsp->conn));
 
 	START_PROFILE(syscall_ftruncate);
 
-	if (lp_strict_allocate(SNUM(fsp->conn))) {
+	/* Only use allocation truncate if strict allocate
+ 	 * is set "on", not off or partial.
+ 	 */
+	if (sa_options == STRICT_ALLOCATE_ON) {
 		result = strict_allocate_ftruncate(handle, fsp, len);
 		END_PROFILE(syscall_ftruncate);
 		return result;
diff --git a/source/param/loadparm.c b/source/param/loadparm.c
index aa41bf9..456bc74 100644
--- a/source/param/loadparm.c
+++ b/source/param/loadparm.c
@@ -445,7 +445,7 @@ struct service {
 	bool bWidelinks;
 	bool bSymlinks;
 	bool bSyncAlways;
-	bool bStrictAllocate;
+	int iStrictAllocate;
 	bool bStrictSync;
 	char magic_char;
 	struct bitmap *copymap;
@@ -588,7 +588,7 @@ static struct service sDefault = {
 	True,			/* bWidelinks */
 	True,			/* bSymlinks */
 	False,			/* bSyncAlways */
-	False,			/* bStrictAllocate */
+	STRICT_ALLOCATE_OFF,	/* iStrictAllocate */
 	False,			/* bStrictSync */
 	'~',			/* magic char */
 	NULL,			/* copymap */
@@ -861,6 +861,21 @@ static const struct enum_list enum_config_backend[] = {
 	{-1, NULL}
 };
 
+static const struct enum_list enum_strict_allocate[] = {
+	{STRICT_ALLOCATE_OFF, "No"},
+	{STRICT_ALLOCATE_OFF, "False"},
+	{STRICT_ALLOCATE_OFF, "0"},
+	{STRICT_ALLOCATE_OFF, "Off"},
+	{STRICT_ALLOCATE_OFF, "disabled"},
+	{STRICT_ALLOCATE_ON, "Yes"},
+	{STRICT_ALLOCATE_ON, "True"},
+	{STRICT_ALLOCATE_ON, "1"},
+	{STRICT_ALLOCATE_ON, "On"},
+	{STRICT_ALLOCATE_ON, "enabled"},
+	{STRICT_ALLOCATE_PARTIAL, "partial"},
+	{-1, NULL}
+};
+
 /* Note: We do not initialise the defaults union - it is not allowed in ANSI C
  *
  * The FLAG_HIDE is explicit. Paramters set this way do NOT appear in any edit
@@ -2394,11 +2409,11 @@ static struct parm_struct parm_table[] = {
 	},
 	{
 		.label		= "strict allocate",
-		.type		= P_BOOL,
+		.type		= P_ENUM,
 		.p_class	= P_LOCAL,
-		.ptr		= &sDefault.bStrictAllocate,
+		.ptr		= &sDefault.iStrictAllocate,
 		.special	= NULL,
-		.enum_list	= NULL,
+		.enum_list	= enum_strict_allocate,
 		.flags		= FLAG_ADVANCED | FLAG_SHARE,
 	},
 	{
@@ -5274,7 +5289,7 @@ FN_LOCAL_PARM_BOOL(lp_manglednames, bMangledNames)
 FN_LOCAL_BOOL(lp_widelinks, bWidelinks)
 FN_LOCAL_BOOL(lp_symlinks, bSymlinks)
 FN_LOCAL_BOOL(lp_syncalways, bSyncAlways)
-FN_LOCAL_BOOL(lp_strict_allocate, bStrictAllocate)
+FN_LOCAL_INTEGER(lp_strict_allocate, iStrictAllocate)
 FN_LOCAL_BOOL(lp_strict_sync, bStrictSync)
 FN_LOCAL_BOOL(lp_map_system, bMap_system)
 FN_LOCAL_BOOL(lp_delete_readonly, bDeleteReadonly)
diff --git a/source/smbd/fileio.c b/source/smbd/fileio.c
index 60aeeef..e23f391 100644
--- a/source/smbd/fileio.c
+++ b/source/smbd/fileio.c
@@ -127,9 +127,10 @@ static ssize_t real_write_file(struct smb_request *req,
         if (pos == -1) {
                 ret = vfs_write_data(req, fsp, data, n);
         } else {
+		enum smb_strict_allocate_options sa_options = lp_strict_allocate(SNUM(fsp->conn));
 		fsp->fh->pos = pos;
-		if (pos && lp_strict_allocate(SNUM(fsp->conn))) {
-			if (vfs_fill_sparse(fsp, pos) == -1) {
+		if (pos && (sa_options != STRICT_ALLOCATE_OFF)) {
+			if (vfs_fill_sparse(fsp, pos, sa_options) == -1) {
 				return -1;
 			}
 		}
diff --git a/source/smbd/vfs.c b/source/smbd/vfs.c
index 6cf156c..e8c0ebb 100644
--- a/source/smbd/vfs.c
+++ b/source/smbd/vfs.c
@@ -545,8 +545,9 @@ int vfs_allocate_file_space(files_struct *fsp, SMB_BIG_UINT len)
 
 	/* Grow - we need to test if we have enough space. */
 
-	if (!lp_strict_allocate(SNUM(fsp->conn)))
+	if (lp_strict_allocate(SNUM(fsp->conn)) == STRICT_ALLOCATE_OFF) {
 		return 0;
+	}
 
 	len -= st.st_size;
 	len /= 1024; /* Len is now number of 1k blocks needed. */
@@ -600,7 +601,7 @@ int vfs_set_filelen(files_struct *fsp, SMB_OFF_T len)
 static char *sparse_buf;
 #define SPARSE_BUF_WRITE_SIZE (32*1024)
 
-int vfs_fill_sparse(files_struct *fsp, SMB_OFF_T len)
+int vfs_fill_sparse(files_struct *fsp, SMB_OFF_T len, enum smb_strict_allocate_options sa_options)
 {
 	int ret;
 	SMB_STRUCT_STAT st;
@@ -619,6 +620,14 @@ int vfs_fill_sparse(files_struct *fsp, SMB_OFF_T len)
 		return 0;
 	}
 
+	/* If strict allocate is set to "partial", ignore all allocate
+ 	 * retquests over the STRICT_ALLOCATE_PARTIAL_LIMIT. */
+
+	if ((sa_options == STRICT_ALLOCATE_PARTIAL) &&
+			(len - st.st_size > STRICT_ALLOCATE_PARTIAL_LIMIT)) {
+		return 0;
+	}
+
 	DEBUG(10,("vfs_fill_sparse: write zeros in file %s from len %.0f to len %.0f (%.0f bytes)\n",
 		fsp->fsp_name, (double)st.st_size, (double)len, (double)(len - st.st_size)));
 
diff --git a/source/winbindd/winbindd_cache.c b/source/winbindd/winbindd_cache.c
index d3e47d0..be44da4 100644
--- a/source/winbindd/winbindd_cache.c
+++ b/source/winbindd/winbindd_cache.c
@@ -486,7 +486,9 @@ static void refresh_sequence_number(struct winbindd_domain *domain, bool force)
 	time_diff = t - domain->last_seq_check;
 
 	/* see if we have to refetch the domain sequence number */
-	if (!force && (time_diff < cache_time)) {
+	if (!force && (time_diff < cache_time) &&
+			(domain->sequence_number != DOM_SEQUENCE_NONE) &&
+			NT_STATUS_IS_OK(domain->last_status)) {
 		DEBUG(10, ("refresh_sequence_number: %s time ok\n", domain->name));
 		goto done;
 	}
@@ -495,8 +497,11 @@ static void refresh_sequence_number(struct winbindd_domain *domain, bool force)
 	/* this will update the timestamp as well */
 	
 	status = fetch_cache_seqnum( domain, t );
-	if ( NT_STATUS_IS_OK(status) )
-		goto done;	
+	if (NT_STATUS_IS_OK(status) &&
+			(domain->sequence_number != DOM_SEQUENCE_NONE) &&
+			NT_STATUS_IS_OK(domain->last_status)) {
+		goto done;
+	}
 
 	/* important! make sure that we know if this is a native 
 	   mode domain or not.  And that we can contact it. */


-- 
Samba Shared Repository


More information about the samba-cvs mailing list