Changeset 988 for vendor/current/source3/smbd/dfree.c
- Timestamp:
- Nov 24, 2016, 1:14:11 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
vendor/current/source3/smbd/dfree.c
r740 r988 26 26 ****************************************************************************/ 27 27 28 static void disk_norm( bool small_query, uint64_t *bsize,uint64_t *dfree,uint64_t *dsize)28 static void disk_norm(uint64_t *bsize, uint64_t *dfree, uint64_t *dsize) 29 29 { 30 30 /* check if the disk is beyond the max disk size */ 31 uint64_t maxdisksize = lp_max disksize();31 uint64_t maxdisksize = lp_max_disk_size(); 32 32 if (maxdisksize) { 33 33 /* convert to blocks - and don't overflow */ 34 34 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 } 37 41 /* the -1 should stop applications getting div by 0 38 42 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 }58 43 } 59 44 } … … 65 50 ****************************************************************************/ 66 51 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)52 uint64_t sys_disk_free(connection_struct *conn, const char *path, 53 uint64_t *bsize, uint64_t *dfree, uint64_t *dsize) 69 54 { 70 55 uint64_t dfree_retval; … … 73 58 uint64_t dsize_q = 0; 74 59 const char *dfree_command; 60 static bool dfree_broken = false; 75 61 76 62 (*dfree) = (*dsize) = 0; … … 81 67 */ 82 68 83 dfree_command = lp_dfree_command( SNUM(conn));69 dfree_command = lp_dfree_command(talloc_tos(), SNUM(conn)); 84 70 if (dfree_command && *dfree_command) { 85 71 const char *p; … … 96 82 } 97 83 98 DEBUG (3, ("disk_free: Running command %s\n", syscmd));84 DEBUG (3, ("disk_free: Running command '%s'\n", syscmd)); 99 85 100 86 lines = file_lines_pload(syscmd, NULL); 101 if (lines ) {87 if (lines != NULL) { 102 88 char *line = lines[0]; 103 89 … … 123 109 if (!*dfree) 124 110 *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; 144 135 (*dfree) = MIN(*dfree,dfree_q); 145 136 (*dsize) = MIN(*dsize,dsize_q); … … 161 152 } 162 153 163 disk_norm(small_query,bsize,dfree,dsize); 154 dfree_done: 155 disk_norm(bsize, dfree, dsize); 164 156 165 157 if ((*bsize) < 1024) { … … 178 170 uint64_t get_dfree_info(connection_struct *conn, 179 171 const char *path, 180 bool small_query,181 172 uint64_t *bsize, 182 173 uint64_t *dfree, … … 188 179 189 180 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); 191 182 } 192 183 … … 199 190 } 200 191 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); 202 193 203 194 if (dfree_ret == (uint64_t)-1) { … … 208 199 /* No cached info or time to refresh. */ 209 200 if (!dfc) { 210 dfc = TALLOC_P(conn, struct dfree_cached_info);201 dfc = talloc(conn, struct dfree_cached_info); 211 202 if (!dfc) { 212 203 return dfree_ret;
Note:
See TracChangeset
for help on using the changeset viewer.