r5636: Re-add the allocation size - parameterized by share as
authorJeremy Allison <jra@samba.org>
Thu, 3 Mar 2005 03:43:57 +0000 (03:43 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:55:52 +0000 (10:55 -0500)
"allocation roundup size", by default set as 1Mb. From
advice by BlueArc about Windows client behaviour. VC++
people can set this to zero to turn it off.
Jeremy.
(This used to be commit 833ca101772bfab65dbd79eb64f63464177f144e)

source3/configure.in
source3/include/local.h
source3/include/smb_macros.h
source3/param/loadparm.c
source3/smbd/nttrans.c
source3/smbd/trans2.c

index 54499292c55a22dc3d59b84e16183a1c57ee0a3c..40aa263c7a1357383d6a7fb2316c8a46a0fac978 100644 (file)
@@ -238,7 +238,7 @@ AC_ARG_ENABLE(debug,
 AC_ARG_ENABLE(developer, [  --enable-developer      Turn on developer warnings and debugging (default=no)],
     [if eval "test x$enable_developer = xyes"; then
         developer=yes
-       CFLAGS="${CFLAGS} -gstabs -Wall -Wshadow -Wstrict-prototypes -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wdeclaration-after-statement -DDEBUG_PASSWORD -DDEVELOPER"
+       CFLAGS="${CFLAGS} -gstabs -Wall -Wshadow -Wstrict-prototypes -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -DDEBUG_PASSWORD -DDEVELOPER"
     fi])
 
 AC_ARG_ENABLE(krb5developer, [  --enable-krb5developer  Turn on developer warnings and debugging, except -Wstrict-prototypes (default=no)],
index 7d5baa21fa82c132c21bcff29ff3cefa1c46070f..8960a4af553e4db0f315e2bb75b5bb65f08de480 100644 (file)
 /* the maximum age in seconds of a password. Should be a lp_ parameter */
 #define MAX_PASSWORD_AGE (21*24*60*60)
 
+/* Default allocation roundup. */
+#define SMB_ROUNDUP_ALLOCATION_SIZE 0x100000
+
 /* shall we deny oplocks to clients that get timeouts? */
 #define FASCIST_OPLOCK_BACKOFF 1
 
index b1ac617f5cfd79271d4655846b6db2a3bedbf65c..4fa9ffa5ace418c34caf98052185326ed1916333 100644 (file)
 /* this is how errors are generated */
 #define UNIXERROR(defclass,deferror) unix_error_packet(outbuf,defclass,deferror,__LINE__,__FILE__)
 
+#define SMB_ROUNDUP(x,r) ( ((x)%(r)) ? ( (((x)+(r))/(r))*(r) ) : (x))
+
 /* Extra macros added by Ying Chen at IBM - speed increase by inlining. */
 #define smb_buf(buf) (((char *)(buf)) + smb_size + CVAL(buf,smb_wct)*2)
 #define smb_buflen(buf) (SVAL(buf,smb_vwv0 + (int)CVAL(buf, smb_wct)*2))
index ac979566454ea47da79333ec77304555425a38f7..21abafb578353e1a7b59ab5bd4d1073b370d2a15 100644 (file)
@@ -424,6 +424,7 @@ typedef struct
        BOOL bMap_acl_inherit;
        BOOL bAfs_Share;
        BOOL bEASupport;
+       int iallocation_roundup_size;
        param_opt_struct *param_opt;
 
        char dummy[3];          /* for alignment */
@@ -549,6 +550,7 @@ static service sDefault = {
        False,                  /* bMap_acl_inherit */
        False,                  /* bAfs_Share */
        False,                  /* bEASupport */
+       SMB_ROUNDUP_ALLOCATION_SIZE,            /* iallocation_roundup_size */
        
        NULL,                   /* Parametric options */
 
@@ -893,6 +895,7 @@ static struct parm_struct parm_table[] = {
 
        {N_("Protocol Options"), P_SEP, P_SEPARATOR}, 
 
+       {"allocation roundup size", P_INTEGER, P_LOCAL, &sDefault.iallocation_roundup_size, NULL, NULL, FLAG_ADVANCED}, 
        {"smb ports", P_STRING, P_GLOBAL, &Globals.smb_ports, NULL, NULL, FLAG_ADVANCED}, 
        {"large readwrite", P_BOOL, P_GLOBAL, &Globals.bLargeReadwrite, NULL, NULL, FLAG_ADVANCED}, 
        {"max protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, FLAG_ADVANCED}, 
@@ -1931,6 +1934,7 @@ FN_LOCAL_INTEGER(lp_oplock_contention_limit, iOplockContentionLimit)
 FN_LOCAL_INTEGER(lp_csc_policy, iCSCPolicy)
 FN_LOCAL_INTEGER(lp_write_cache_size, iWriteCacheSize)
 FN_LOCAL_INTEGER(lp_block_size, iBlock_size)
+FN_LOCAL_INTEGER(lp_allocation_roundup_size, iallocation_roundup_size);
 FN_LOCAL_CHAR(lp_magicchar, magic_char)
 FN_GLOBAL_INTEGER(lp_winbind_cache_time, &Globals.winbind_cache_time)
 FN_GLOBAL_INTEGER(lp_algorithmic_rid_base, &Globals.AlgorithmicRidBase)
index 675da4c74786bd534ef476fc40a9c8d7a9e4ea0e..aaf1d1679b3cdb5840914cb4dac00b09cf96f772 100644 (file)
@@ -929,7 +929,7 @@ create_options = 0x%x root_dir_fid = 0x%x\n", flags, desired_access, file_attrib
        allocation_size |= (((SMB_BIG_UINT)IVAL(inbuf,smb_ntcreate_AllocationSize + 4)) << 32);
 #endif
        if (allocation_size && (allocation_size > (SMB_BIG_UINT)file_len)) {
-               fsp->initial_allocation_size = allocation_size;
+               fsp->initial_allocation_size = smb_roundup(fsp->conn, allocation_size);
                if (fsp->is_directory) {
                        close_file(fsp,False);
                        END_PROFILE(SMBntcreateX);
@@ -942,7 +942,7 @@ create_options = 0x%x root_dir_fid = 0x%x\n", flags, desired_access, file_attrib
                        return ERROR_NT(NT_STATUS_DISK_FULL);
                }
        } else {
-               fsp->initial_allocation_size = (SMB_BIG_UINT)file_len;
+               fsp->initial_allocation_size = smb_roundup(fsp->conn,(SMB_BIG_UINT)file_len);
        }
 
        /* 
@@ -1472,7 +1472,7 @@ static int call_nt_transact_create(connection_struct *conn, char *inbuf, char *o
        allocation_size |= (((SMB_BIG_UINT)IVAL(params,16)) << 32);
 #endif
        if (allocation_size && (allocation_size > file_len)) {
-               fsp->initial_allocation_size = allocation_size;
+               fsp->initial_allocation_size = smb_roundup(fsp->conn, allocation_size);
                if (fsp->is_directory) {
                        close_file(fsp,False);
                        END_PROFILE(SMBntcreateX);
@@ -1484,7 +1484,7 @@ static int call_nt_transact_create(connection_struct *conn, char *inbuf, char *o
                        return ERROR_NT(NT_STATUS_DISK_FULL);
                }
        } else {
-               fsp->initial_allocation_size = (SMB_BIG_UINT)file_len;
+               fsp->initial_allocation_size = smb_roundup(fsp->conn, (SMB_BIG_UINT)file_len);
        }
 
        /* Realloc the size of parameters and data we will return */
index d22705214e4973b26c1da15e28893395baf2b2f7..16cea326f928cb31e524e47cb93d6763f862716e 100644 (file)
@@ -32,6 +32,23 @@ extern struct current_user current_user;
 #define get_file_size(sbuf) ((sbuf).st_size)
 #define DIR_ENTRY_SAFETY_MARGIN 4096
 
+/********************************************************************
+ Roundup a value to the nearest allocation roundup size boundary.
+ Only do this for Windows clients.
+********************************************************************/
+
+SMB_BIG_UINT smb_roundup(connection_struct *conn, SMB_BIG_UINT val)
+{
+       SMB_BIG_UINT rval = lp_allocation_roundup_size(SNUM(conn));
+
+       /* Only roundup for Windows clients. */
+       enum remote_arch_types ra_type = get_remote_arch();
+       if (rval && (ra_type != RA_SAMBA) && (ra_type != RA_CIFSFS)) {
+               val = SMB_ROUNDUP(val,rval);
+       }
+       return val;
+}
+
 /********************************************************************
  Given a stat buffer return the allocated size on disk, taking into
  account sparse files.
@@ -50,7 +67,7 @@ SMB_BIG_UINT get_allocation_size(files_struct *fsp, SMB_STRUCT_STAT *sbuf)
        if (!ret && fsp && fsp->initial_allocation_size)
                ret = fsp->initial_allocation_size;
 
-       return ret;
+       return smb_roundup(fsp->conn, ret);
 }
 
 /****************************************************************************
@@ -3333,6 +3350,10 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char
                        DEBUG(10,("call_trans2setfilepathinfo: Set file allocation info for file %s to %.0f\n",
                                        fname, (double)allocation_size ));
 
+                       if (allocation_size) {
+                               allocation_size = smb_roundup(conn, allocation_size);
+                       }
+
                        if(allocation_size != get_file_size(sbuf)) {
                                SMB_STRUCT_STAT new_sbuf;