]> err.no Git - varnish/commitdiff
Tweak storage file size calculations. Avoid overflow when calculating 80%
authordes <des@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Sat, 16 Sep 2006 12:23:33 +0000 (12:23 +0000)
committerdes <des@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Sat, 16 Sep 2006 12:23:33 +0000 (12:23 +0000)
of available storage on 32-bit Linux (most fields in struct statfs are long
instead of int64_t as in BSD)

git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@1009 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/bin/varnishd/storage_file.c

index bb61ba28cb8dc71be875be9df17dc01908622c95..517561117826f0b54b4e54d963315a77c5d04be2 100644 (file)
@@ -147,23 +147,26 @@ smf_calcsize(struct smf_sc *sc, const char *size, int newfile)
                        }
                }
 
+               /*
+                * This trickery wouldn't be necessary if X/Open would
+                * just add OFF_MAX to <limits.h>...
+                */
                o = l;
                if (o != l || o < 0) {
-                       fprintf(stderr,
-                           "Warning: size reduced to system limit (off_t)\n");
                        do {
                                l >>= 1;
                                o = l;
                        } while (o != l || o < 0);
+                       fprintf(stderr, "WARNING: storage file size reduced"
+                           " to %ju due to system limitations\n", l);
                }
 
                if (l < st.st_size) {
                        AZ(ftruncate(sc->fd, l));
                } else if (l - st.st_size > fsst.f_bsize * fsst.f_bavail) {
-                       fprintf(stderr,
-                           "Warning: size larger than filesystem free space,"
-                           " reduced to 80%% of free space.\n");
-                       l = (fsst.f_bsize * fsst.f_bavail * 80) / 100;
+                       l = ((uintmax_t)fsst.f_bsize * fsst.f_bavail * 80) / 100;
+                       fprintf(stderr, "WARNING: storage file size reduced"
+                           " to %ju (80%% of available disk space)\n", l);
                }
        }
 
@@ -177,13 +180,13 @@ smf_calcsize(struct smf_sc *sc, const char *size, int newfile)
                exit (2);
        }
 
-       if (expl < 3 && sizeof(void *) == 4 && l > (1ULL << 31)) {
+       if (expl < 3 && sizeof(void *) == 4 && l > INT32_MAX) {
                fprintf(stderr,
                    "NB: Limiting size to 2GB on 32 bit architecture to"
                    " prevent running out of\naddress space."
                    "  Specifiy explicit size to override.\n"
                );
-               l = 1ULL << 31;
+               l = INT32_MAX;
        }
 
        printf("file %s size %ju bytes (%ju fs-blocks, %ju pages)\n",