diff options
author | ngie <ngie@FreeBSD.org> | 2017-07-19 16:38:55 +0000 |
---|---|---|
committer | ngie <ngie@FreeBSD.org> | 2017-07-19 16:38:55 +0000 |
commit | 4fc0f73d1b4900bb6a1c591f1bedb01896528ba8 (patch) | |
tree | 9aa340f97ef385052514f305cb1477d81ea75792 /sbin/savecore/savecore.c | |
parent | 17463d6970c66db756b3de17e8f52d02b564231c (diff) | |
download | FreeBSD-src-4fc0f73d1b4900bb6a1c591f1bedb01896528ba8.zip FreeBSD-src-4fc0f73d1b4900bb6a1c591f1bedb01896528ba8.tar.gz |
Relnotes: yes (subtle output/behavior change)
MFC r316938,r316953:
r316938:
savecore: fix space calculation with respect to `minfree` in check_space(..)
- Use strtoll(3) instead of atoi(3), because atoi(3) limits the
representable data to INT_MAX. Check the values received from
strtoll(3), trimming trailing whitespace off the end to maintain
POLA.
- Use `KiB` instead of `kB` when describing free space, total space,
etc. I am now fully aware of `KiB` being the IEC standard for 1024
bytes and `kB` being the IEC standard for 1000 bytes.
- Store available number of KiB in `available` so it can be more
easily queried and compared to ensure that there are enough KiB to
store the dump image on disk.
- Print out the reserved space on disk, per `minfree`, so end-users
can troubleshoot why check_space(..) is reporting that there isn't
enough free space.
Tested with: positive/negative cases (see review); make tinderbox
r316953:
Switch back to non-IEC units for 1024 bytes
I was swayed a little too quickly when I saw the wiki page discussing
kB vs KiB. Switch back as none of the code in base openly uses
IEC units via humanize_number(3) (which was my next step), and there's
a large degree of dislike with IEC vs more SI-like units.
Diffstat (limited to 'sbin/savecore/savecore.c')
-rw-r--r-- | sbin/savecore/savecore.c | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/sbin/savecore/savecore.c b/sbin/savecore/savecore.c index 7f37673..2eb038d 100644 --- a/sbin/savecore/savecore.c +++ b/sbin/savecore/savecore.c @@ -68,6 +68,7 @@ __FBSDID("$FreeBSD$"); #include <sys/kerneldump.h> #include <sys/mount.h> #include <sys/stat.h> +#include <ctype.h> #include <errno.h> #include <fcntl.h> #include <fstab.h> @@ -252,7 +253,7 @@ static int check_space(const char *savedir, off_t dumpsize, int bounds) { FILE *fp; - off_t minfree, spacefree, totfree, needed; + off_t available, minfree, spacefree, totfree, needed; struct statfs fsbuf; char buf[100]; @@ -268,19 +269,37 @@ check_space(const char *savedir, off_t dumpsize, int bounds) else { if (fgets(buf, sizeof(buf), fp) == NULL) minfree = 0; - else - minfree = atoi(buf); + else { + char *endp; + + errno = 0; + minfree = strtoll(buf, &endp, 10); + if (minfree == 0 && errno != 0) + minfree = -1; + else { + while (*endp != '\0' && isspace(*endp)) + endp++; + if (*endp != '\0' || minfree < 0) + minfree = -1; + } + if (minfree < 0) + syslog(LOG_WARNING, + "`minfree` didn't contain a valid size " + "(`%s`). Defaulting to 0", buf); + } (void)fclose(fp); } + available = minfree > 0 ? spacefree - minfree : totfree; needed = dumpsize / 1024 + 2; /* 2 for info file */ needed -= saved_dump_size(bounds); - if ((minfree > 0 ? spacefree : totfree) - needed < minfree) { + if (available < needed) { syslog(LOG_WARNING, - "no dump: not enough free space on device (%lldkB " - "available; need at least %lldkB)", - (long long)(minfree > 0 ? spacefree : totfree), - (long long)needed); + "no dump: not enough free space on device (need at least " + "%jdkB for dump; %jdkB available; %jdkB reserved)", + (intmax_t)needed, + (intmax_t)available + minfree, + (intmax_t)minfree); return (0); } if (spacefree - needed < 0) |