1
0
mirror of https://github.com/samba-team/samba.git synced 2025-02-23 09:57:40 +03:00

r11190: Fix enhancement request #3192.

This does 2 things.
1). Makes dfree command a per-share parameter (it should be anyway IMHO).
2). Adds a "dfree cache time" parameter in seconds that specifies how long a
dfree command output should be cached for. Default is zero (no caching).
Jeremy.
(This used to be commit 49ef8b88a3e12883148eb28d8e86fb07dbc3d12d)
This commit is contained in:
Jeremy Allison 2005-10-19 20:02:12 +00:00 committed by Gerald (Jerry) Carter
parent ad93243f23
commit c6aea6ef2d
4 changed files with 72 additions and 16 deletions

View File

@ -508,6 +508,14 @@ typedef struct
#include "smb_acls.h"
#include "vfs.h"
struct dfree_cached_info {
time_t last_dfree_time;
SMB_BIG_UINT dfree_ret;
SMB_BIG_UINT bsize;
SMB_BIG_UINT dfree;
SMB_BIG_UINT dsize;
};
struct dptr_struct;
typedef struct connection_struct
@ -559,7 +567,7 @@ typedef struct connection_struct
name_compare_entry *veto_list; /* Per-share list of files to veto (never show). */
name_compare_entry *veto_oplock_list; /* Per-share list of files to refuse oplocks on. */
name_compare_entry *aio_write_behind_list; /* Per-share list of files to use aio write behind on. */
struct dfree_cached_info *dfree_info;
} connection_struct;
struct current_user

View File

@ -109,7 +109,6 @@ typedef struct
char *szPidDir;
char *szRootdir;
char *szDefaultService;
char *szDfree;
char *szGetQuota;
char *szSetQuota;
char *szMsgCommand;
@ -358,6 +357,7 @@ typedef struct
char **szVfsObjects;
char *szMSDfsProxy;
char *szAioWriteBehind;
char *szDfree;
int iMinPrintSpace;
int iMaxPrintJobs;
int iMaxReportedPrintJobs;
@ -376,6 +376,7 @@ typedef struct
int iOplockContentionLimit;
int iCSCPolicy;
int iBlock_size;
int iDfreeCacheTime;
BOOL bPreexecClose;
BOOL bRootpreexecClose;
int iCaseSensitive;
@ -492,6 +493,7 @@ static service sDefault = {
NULL, /* vfs objects */
NULL, /* szMSDfsProxy */
NULL, /* szAioWriteBehind */
NULL, /* szDfree */
0, /* iMinPrintSpace */
1000, /* iMaxPrintJobs */
0, /* iMaxReportedPrintJobs */
@ -509,7 +511,8 @@ static service sDefault = {
DEFAULT_PRINTING, /* iPrinting */
2, /* iOplockContentionLimit */
0, /* iCSCPolicy */
1024, /* iBlock_size */
1024, /* iBlock_size */
0, /* iDfreeCacheTime */
False, /* bPreexecClose */
False, /* bRootpreexecClose */
Auto, /* case sensitive */
@ -1180,7 +1183,8 @@ static struct parm_struct parm_table[] = {
{"default service", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, FLAG_ADVANCED},
{"default", P_STRING, P_GLOBAL, &Globals.szDefaultService, NULL, NULL, FLAG_ADVANCED},
{"message command", P_STRING, P_GLOBAL, &Globals.szMsgCommand, NULL, NULL, FLAG_ADVANCED},
{"dfree command", P_STRING, P_GLOBAL, &Globals.szDfree, NULL, NULL, FLAG_ADVANCED},
{"dfree cache time", P_STRING, P_LOCAL, &sDefault.iDfreeCacheTime, NULL, NULL, FLAG_ADVANCED},
{"dfree command", P_STRING, P_LOCAL, &sDefault.szDfree, NULL, NULL, FLAG_ADVANCED},
{"get quota command", P_STRING, P_GLOBAL, &Globals.szGetQuota, NULL, NULL, FLAG_ADVANCED},
{"set quota command", P_STRING, P_GLOBAL, &Globals.szSetQuota, NULL, NULL, FLAG_ADVANCED},
{"remote announce", P_STRING, P_GLOBAL, &Globals.szRemoteAnnounce, NULL, NULL, FLAG_ADVANCED},
@ -1721,7 +1725,6 @@ FN_GLOBAL_BOOL(lp_utmp, &Globals.bUtmp)
FN_GLOBAL_STRING(lp_rootdir, &Globals.szRootdir)
FN_GLOBAL_STRING(lp_defaultservice, &Globals.szDefaultService)
FN_GLOBAL_STRING(lp_msg_command, &Globals.szMsgCommand)
FN_GLOBAL_STRING(lp_dfree_command, &Globals.szDfree)
FN_GLOBAL_STRING(lp_get_quota_command, &Globals.szGetQuota)
FN_GLOBAL_STRING(lp_set_quota_command, &Globals.szSetQuota)
FN_GLOBAL_STRING(lp_hosts_equiv, &Globals.szHostsEquiv)
@ -1933,6 +1936,7 @@ FN_LOCAL_STRING(lp_hide_files, szHideFiles)
FN_LOCAL_STRING(lp_veto_oplocks, szVetoOplockFiles)
FN_LOCAL_BOOL(lp_msdfs_root, bMSDfsRoot)
FN_LOCAL_STRING(lp_aio_write_behind, szAioWriteBehind)
FN_LOCAL_STRING(lp_dfree_command, szDfree)
FN_LOCAL_BOOL(lp_autoloaded, autoloaded)
FN_LOCAL_BOOL(lp_preexec_close, bPreexecClose)
FN_LOCAL_BOOL(lp_rootpreexec_close, bRootpreexecClose)
@ -2007,6 +2011,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_dfree_cache_time, iDfreeCacheTime)
FN_LOCAL_INTEGER(lp_allocation_roundup_size, iallocation_roundup_size)
FN_LOCAL_INTEGER(lp_aio_read_size, iAioReadSize)
FN_LOCAL_INTEGER(lp_aio_write_size, iAioWriteSize)

View File

@ -21,8 +21,9 @@
#include "includes.h"
/****************************************************************************
normalise for DOS usage
Normalise for DOS usage.
****************************************************************************/
static void disk_norm(BOOL small_query, SMB_BIG_UINT *bsize,SMB_BIG_UINT *dfree,SMB_BIG_UINT *dsize)
{
/* check if the disk is beyond the max disk size */
@ -59,17 +60,17 @@ static void disk_norm(BOOL small_query, SMB_BIG_UINT *bsize,SMB_BIG_UINT *dfree,
/****************************************************************************
return number of 1K blocks available on a path and total number
Return number of 1K blocks available on a path and total number.
****************************************************************************/
static SMB_BIG_UINT disk_free(const char *path, BOOL small_query,
SMB_BIG_UINT sys_disk_free(connection_struct *conn, const char *path, BOOL small_query,
SMB_BIG_UINT *bsize,SMB_BIG_UINT *dfree,SMB_BIG_UINT *dsize)
{
int dfree_retval;
SMB_BIG_UINT dfree_q = 0;
SMB_BIG_UINT bsize_q = 0;
SMB_BIG_UINT dsize_q = 0;
char *dfree_command;
const char *dfree_command;
(*dfree) = (*dsize) = 0;
(*bsize) = 512;
@ -78,7 +79,7 @@ static SMB_BIG_UINT disk_free(const char *path, BOOL small_query,
* If external disk calculation specified, use it.
*/
dfree_command = lp_dfree_command();
dfree_command = lp_dfree_command(SNUM(conn));
if (dfree_command && *dfree_command) {
const char *p;
char **lines;
@ -162,12 +163,54 @@ static SMB_BIG_UINT disk_free(const char *path, BOOL small_query,
return(dfree_retval);
}
/****************************************************************************
wrap it to get filenames right
Potentially returned cached dfree info.
****************************************************************************/
SMB_BIG_UINT sys_disk_free(const char *path, BOOL small_query,
SMB_BIG_UINT *bsize,SMB_BIG_UINT *dfree,SMB_BIG_UINT *dsize)
SMB_BIG_UINT get_dfree_info(connection_struct *conn,
const char *path,
BOOL small_query,
SMB_BIG_UINT *bsize,
SMB_BIG_UINT *dfree,
SMB_BIG_UINT *dsize)
{
return disk_free(path,small_query, bsize,dfree,dsize);
int dfree_cache_time = lp_dfree_cache_time(SNUM(conn));
struct dfree_cached_info *dfc = conn->dfree_info;
SMB_BIG_UINT dfree_ret;
if (!dfree_cache_time) {
return SMB_VFS_DISK_FREE(conn,path,small_query,bsize,dfree,dsize);
}
if (dfc && (conn->lastused - dfc->last_dfree_time < dfree_cache_time)) {
/* Return cached info. */
*bsize = dfc->bsize;
*dfree = dfc->dfree;
*dsize = dfc->dsize;
return dfc->dfree_ret;
}
dfree_ret = SMB_VFS_DISK_FREE(conn,path,small_query,bsize,dfree,dsize);
if (dfree_ret == (SMB_BIG_UINT)-1) {
/* Don't cache bad data. */
return dfree_ret;
}
/* No cached info or time to refresh. */
if (!dfc) {
dfc = TALLOC_P(conn->mem_ctx, struct dfree_cached_info);
if (!dfc) {
return dfree_ret;
}
conn->dfree_info = dfc;
}
dfc->bsize = *bsize;
dfc->dfree = *dfree;
dfc->dsize = *dsize;
dfc->dfree_ret = dfree_ret;
dfc->last_dfree_time = conn->lastused;
return dfree_ret;
}

View File

@ -46,7 +46,7 @@ SMB_BIG_UINT vfswrap_disk_free(vfs_handle_struct *handle, connection_struct *con
{
SMB_BIG_UINT result;
result = sys_disk_free(path, small_query, bsize, dfree, dsize);
result = sys_disk_free(conn, path, small_query, bsize, dfree, dsize);
return result;
}