Ignore:
Timestamp:
Nov 24, 2016, 1:14:11 PM (9 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: update vendor to version 4.4.3

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vendor/current/source3/smbd/dfree.c

    r740 r988  
    2626****************************************************************************/
    2727
    28 static void disk_norm(bool small_query, uint64_t *bsize,uint64_t *dfree,uint64_t *dsize)
     28static void disk_norm(uint64_t *bsize, uint64_t *dfree, uint64_t *dsize)
    2929{
    3030        /* check if the disk is beyond the max disk size */
    31         uint64_t maxdisksize = lp_maxdisksize();
     31        uint64_t maxdisksize = lp_max_disk_size();
    3232        if (maxdisksize) {
    3333                /* convert to blocks - and don't overflow */
    3434                maxdisksize = ((maxdisksize*1024)/(*bsize))*1024;
    35                 if (*dsize > maxdisksize) *dsize = maxdisksize;
    36                 if (*dfree > maxdisksize) *dfree = maxdisksize-1;
     35                if (*dsize > maxdisksize) {
     36                        *dsize = maxdisksize;
     37                }
     38                if (*dfree > maxdisksize) {
     39                        *dfree = maxdisksize - 1;
     40                }
    3741                /* the -1 should stop applications getting div by 0
    3842                   errors */
    39         } 
    40 
    41         if(small_query) {       
    42                 while (*dfree > WORDMAX || *dsize > WORDMAX || *bsize < 512) {
    43                         *dfree /= 2;
    44                         *dsize /= 2;
    45                         *bsize *= 2;
    46                         /*
    47                          * Force max to fit in 16 bit fields.
    48                          */
    49                         if (*bsize > (WORDMAX*512)) {
    50                                 *bsize = (WORDMAX*512);
    51                                 if (*dsize > WORDMAX)
    52                                         *dsize = WORDMAX;
    53                                 if (*dfree >  WORDMAX)
    54                                         *dfree = WORDMAX;
    55                                 break;
    56                         }
    57                 }
    5843        }
    5944}
     
    6550****************************************************************************/
    6651
    67 uint64_t sys_disk_free(connection_struct *conn, const char *path, bool small_query,
    68                               uint64_t *bsize,uint64_t *dfree,uint64_t *dsize)
     52uint64_t sys_disk_free(connection_struct *conn, const char *path,
     53                       uint64_t *bsize, uint64_t *dfree, uint64_t *dsize)
    6954{
    7055        uint64_t dfree_retval;
     
    7358        uint64_t dsize_q = 0;
    7459        const char *dfree_command;
     60        static bool dfree_broken = false;
    7561
    7662        (*dfree) = (*dsize) = 0;
     
    8167         */
    8268
    83         dfree_command = lp_dfree_command(SNUM(conn));
     69        dfree_command = lp_dfree_command(talloc_tos(), SNUM(conn));
    8470        if (dfree_command && *dfree_command) {
    8571                const char *p;
     
    9682                }
    9783
    98                 DEBUG (3, ("disk_free: Running command %s\n", syscmd));
     84                DEBUG (3, ("disk_free: Running command '%s'\n", syscmd));
    9985
    10086                lines = file_lines_pload(syscmd, NULL);
    101                 if (lines) {
     87                if (lines != NULL) {
    10288                        char *line = lines[0];
    10389
     
    123109                        if (!*dfree)
    124110                                *dfree = 1024;
    125                 } else {
    126                         DEBUG (0, ("disk_free: sys_popen() failed for command %s. Error was : %s\n",
    127                                 syscmd, strerror(errno) ));
    128                         if (sys_fsusage(path, dfree, dsize) != 0) {
    129                                 DEBUG (0, ("disk_free: sys_fsusage() failed. Error was : %s\n",
    130                                         strerror(errno) ));
    131                                 return (uint64_t)-1;
    132                         }
    133                 }
    134         } else {
    135                 if (sys_fsusage(path, dfree, dsize) != 0) {
    136                         DEBUG (0, ("disk_free: sys_fsusage() failed. Error was : %s\n",
    137                                 strerror(errno) ));
    138                         return (uint64_t)-1;
    139                 }
    140         }
    141 
    142         if (disk_quotas(path, &bsize_q, &dfree_q, &dsize_q)) {
    143                 (*bsize) = bsize_q;
     111
     112                        goto dfree_done;
     113                }
     114                DEBUG (0, ("disk_free: file_lines_load() failed for "
     115                           "command '%s'. Error was : %s\n",
     116                           syscmd, strerror(errno) ));
     117        }
     118
     119        if (SMB_VFS_DISK_FREE(conn, path, bsize, dfree, dsize) ==
     120            (uint64_t)-1) {
     121                DBG_ERR("VFS disk_free failed. Error was : %s\n",
     122                        strerror(errno));
     123                return (uint64_t)-1;
     124        }
     125
     126        if (disk_quotas(conn, path, &bsize_q, &dfree_q, &dsize_q)) {
     127                uint64_t min_bsize = MIN(*bsize, bsize_q);
     128
     129                (*dfree) = (*dfree) * (*bsize) / min_bsize;
     130                (*dsize) = (*dsize) * (*bsize) / min_bsize;
     131                dfree_q = dfree_q * bsize_q / min_bsize;
     132                dsize_q = dsize_q * bsize_q / min_bsize;
     133
     134                (*bsize) = min_bsize;
    144135                (*dfree) = MIN(*dfree,dfree_q);
    145136                (*dsize) = MIN(*dsize,dsize_q);
     
    161152        }
    162153
    163         disk_norm(small_query,bsize,dfree,dsize);
     154dfree_done:
     155        disk_norm(bsize, dfree, dsize);
    164156
    165157        if ((*bsize) < 1024) {
     
    178170uint64_t get_dfree_info(connection_struct *conn,
    179171                        const char *path,
    180                         bool small_query,
    181172                        uint64_t *bsize,
    182173                        uint64_t *dfree,
     
    188179
    189180        if (!dfree_cache_time) {
    190                 return SMB_VFS_DISK_FREE(conn,path,small_query,bsize,dfree,dsize);
     181                return sys_disk_free(conn, path, bsize, dfree, dsize);
    191182        }
    192183
     
    199190        }
    200191
    201         dfree_ret = SMB_VFS_DISK_FREE(conn,path,small_query,bsize,dfree,dsize);
     192        dfree_ret = sys_disk_free(conn, path, bsize, dfree, dsize);
    202193
    203194        if (dfree_ret == (uint64_t)-1) {
     
    208199        /* No cached info or time to refresh. */
    209200        if (!dfc) {
    210                 dfc = TALLOC_P(conn, struct dfree_cached_info);
     201                dfc = talloc(conn, struct dfree_cached_info);
    211202                if (!dfc) {
    212203                        return dfree_ret;
Note: See TracChangeset for help on using the changeset viewer.