From owner-freebsd-bugs Sun Mar 3 23:38:36 1996 Return-Path: owner-bugs Received: (from root@localhost) by freefall.freebsd.org (8.7.3/8.7.3) id XAA09587 for bugs-outgoing; Sun, 3 Mar 1996 23:38:36 -0800 (PST) Received: from lirmm.lirmm.fr (lirmm.lirmm.fr [193.49.104.10]) by freefall.freebsd.org (8.7.3/8.7.3) with ESMTP id XAA09582 for ; Sun, 3 Mar 1996 23:38:33 -0800 (PST) Received: from lirmm.fr (baobab.lirmm.fr [193.49.106.14]) by lirmm.lirmm.fr (8.7.1/8.6.4) with ESMTP id IAA14667 for ; Mon, 4 Mar 1996 08:38:18 +0100 (MET) Message-Id: <199603040738.IAA14667@lirmm.lirmm.fr> To: bugs@freebsd.org Subject: savecore patches Date: Mon, 04 Mar 1996 08:38:16 +0100 From: "Philippe Charnier" Sender: owner-bugs@freebsd.org Precedence: bulk Hi, You will find enclosed a patch for savecore that correct the following bugs: - dumpsize was used (in check_space) before being computed (in save_core): dumpsize was always 0 in check_space. Compute dumpsize before calling check_space which need it. - convert all quantities required for free space computation to a number of bytes (some of them were in Kbytes, others in bytes, making result a little bit silly). Minfree is really take into account now. - cosmetics changes. - only dump a core is minfree bytes are left on the disk after the dump. -------- -------- Philippe Charnier charnier@lirmm.fr LIRMM, 161 rue Ada, 34392 Montpellier cedex 5 -- France ------------------------------------------------------------------------ Index: sbin/savecore/./savecore.c =================================================================== RCS file: /home2h/FreeBSD.cvsroot/src/sbin/savecore/savecore.c,v retrieving revision 1.11 diff -u -r1.11 savecore.c --- savecore.c 1995/12/13 11:36:20 1.11 +++ savecore.c 1996/03/02 14:09:22 @@ -290,6 +290,11 @@ *cp = getc(fp); while (*cp++ && cp < &panic_mesg[sizeof(panic_mesg)]); } + /* Read the dump size, and convert it to a number of bytes. */ + (void)fseek(fp, + (off_t)(dumplo + ok(dump_nl[X_DUMPSIZE].n_value)), L_SET); + (void)fread(&dumpsize, sizeof(dumpsize), 1, fp); + dumpsize *= NBPG; /* Don't fclose(fp), we use dumpfd later. */ } @@ -369,15 +374,10 @@ ifd = dumpfd; } - /* Read the dump size. */ - Lseek(dumpfd, (off_t)(dumplo + ok(dump_nl[X_DUMPSIZE].n_value)), L_SET); - (void)Read(dumpfd, &dumpsize, sizeof(dumpsize)); - /* Seek to the start of the core. */ Lseek(ifd, (off_t)dumplo, L_SET); /* Copy the core file. */ - dumpsize *= NBPG; syslog(LOG_NOTICE, "writing %score to %s", compress ? "compressed " : "", path); for (; dumpsize > 0; dumpsize -= nr) { @@ -547,28 +547,27 @@ syslog(LOG_ERR, "%s: %m", dirname); exit(1); } - spacefree = (fsbuf.f_bavail * fsbuf.f_bsize) / 1024; - + spacefree = fsbuf.f_bavail * fsbuf.f_bsize; + minfree = 0; (void)snprintf(path, sizeof(path), "%s/minfree", dirname); - if ((fp = fopen(path, "r")) == NULL) - minfree = 0; - else { - if (fgets(buf, sizeof(buf), fp) == NULL) - minfree = 0; - else - minfree = atoi(buf); + if ((fp = fopen(path, "r"))) { + if (fgets(buf, sizeof(buf), fp)) minfree = atoi(buf); (void)fclose(fp); } - - needed = (dumpsize + kernelsize) / 1024; - if (minfree > 0 && spacefree - needed < minfree) { - syslog(LOG_WARNING, - "no dump, not enough free space on device"); + /* dumpsize, kernelsize, minfree, and spacefree are in bytes */ + needed = dumpsize + kernelsize; /* minfree? not yet */ + if (verbose) { + syslog(LOG_INFO, "dumpsize: %d", dumpsize); + syslog(LOG_INFO, "kernelsize: %d", kernelsize); + syslog(LOG_INFO, "minfree: %d", minfree); + syslog(LOG_INFO, "spacefree: %d", spacefree); + syslog(LOG_INFO, "needed: %d", needed); + } + /* space left (after the dump) must be greater than minfree */ + if (spacefree < needed + minfree) { + syslog(LOG_WARNING, "no dump, not enough free space on device"); return (0); } - if (spacefree - needed < minfree) - syslog(LOG_WARNING, - "dump performed, but free space threshold crossed"); return (1); }