uint64_t get_dfree_info(connection_struct *conn, struct smb_filename *fname, uint64_t *bsize, uint64_t *dfree, uint64_t *dsize) { int dfree_cache_time = lp_dfree_cache_time(SNUM(conn)); struct dfree_cached_info *dfc = conn->dfree_info; uint64_t dfree_ret; if (!dfree_cache_time) { return sys_disk_free(conn, fname, 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 = sys_disk_free(conn, fname, bsize, dfree, dsize); if (dfree_ret == (uint64_t)-1) { /* Don't cache bad data. */ return dfree_ret; } /* No cached info or time to refresh. */ if (!dfc) { dfc = talloc(conn, struct dfree_cached_info); if (!dfc) { return dfree_ret; } conn->dfree_info = dfc; }
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) { 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; }