svn commit: r321213 - stable/11/sbin/savecore
Ngie Cooper
ngie at FreeBSD.org
Wed Jul 19 16:39:01 UTC 2017
Author: ngie
Date: Wed Jul 19 16:39:00 2017
New Revision: 321213
URL: https://svnweb.freebsd.org/changeset/base/321213
Log:
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.
Modified:
stable/11/sbin/savecore/savecore.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sbin/savecore/savecore.c
==============================================================================
--- stable/11/sbin/savecore/savecore.c Wed Jul 19 16:38:55 2017 (r321212)
+++ stable/11/sbin/savecore/savecore.c Wed Jul 19 16:39:00 2017 (r321213)
@@ -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 b
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)
More information about the svn-src-all
mailing list