From 51ea8b57b8ebcda1ec47bb86567ff0661ddfca7b Mon Sep 17 00:00:00 2001 From: Bruce Evans Date: Sun, 14 Jan 1996 18:55:09 +0000 Subject: [PATCH] Partially fixed negative and truncated "Avail" counts in df output. This fixes PR943. ffs/ffs_vfsops.c: ffs_statfs() multiplied by (100 - minfree) as part of calculating the minfree percentage (complemented in 100%), so with the standard minfree of 8, it was broken for file systems of size >= 1TB/92 = 11GB. Use the standard freespace() macro instead. This also fixes a rounding bug (the "Avail" count was sometimes 1 too small). ffs/* (not fixed): The freespace() macro multiplies by minfree, so with the standard minfree of 8, it is broken for file systems of size >= 1TB/8 = 128GB. This bug is more serious since it affects block allocation. ffs/ffs_alloc.c (not fixed): Ordinary users are sometimes allowed to allocate 1 (partial) block too many so that the "Avail" count goes negative. E.g., if there is 1 fragment available and the file is fairly large, one more full block is allocated. df/df.c: ufs_df() used/uses essentially the same code as ffs_statfs(), so it had/has the same bugs. ufs_df() gratuitously replaced "Avail" counts of < 0 by 0, so it gave different results for non-mounted file systems in this case. --- bin/df/df.c | 7 ++----- sys/ufs/ffs/ffs_vfsops.c | 5 ++--- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/bin/df/df.c b/bin/df/df.c index 80cbba4abe1..701a9adac46 100644 --- a/bin/df/df.c +++ b/bin/df/df.c @@ -35,7 +35,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: df.c,v 1.6 1995/03/19 13:28:15 joerg Exp $ + * $Id: df.c,v 1.7 1995/05/30 00:06:42 rgrimes Exp $ */ #ifndef lint @@ -386,10 +386,7 @@ ufs_df(file, maxwidth) sfsp->f_blocks = sblock.fs_dsize; sfsp->f_bfree = sblock.fs_cstotal.cs_nbfree * sblock.fs_frag + sblock.fs_cstotal.cs_nffree; - sfsp->f_bavail = (sblock.fs_dsize * (100 - sblock.fs_minfree) / 100) - - (sblock.fs_dsize - sfsp->f_bfree); - if (sfsp->f_bavail < 0) - sfsp->f_bavail = 0; + sfsp->f_bavail = freespace(&sblock, sblock.fs_minfree); sfsp->f_files = sblock.fs_ncg * sblock.fs_ipg; sfsp->f_ffree = sblock.fs_cstotal.cs_nifree; sfsp->f_fsid.val[0] = 0; diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c index 203a535b7ba..e3107084d37 100644 --- a/sys/ufs/ffs/ffs_vfsops.c +++ b/sys/ufs/ffs/ffs_vfsops.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)ffs_vfsops.c 8.8 (Berkeley) 4/18/94 - * $Id: ffs_vfsops.c,v 1.32 1995/12/17 21:09:35 phk Exp $ + * $Id: ffs_vfsops.c,v 1.33 1996/01/05 18:31:49 wollman Exp $ */ #include "opt_quota.h" @@ -728,8 +728,7 @@ ffs_statfs(mp, sbp, p) sbp->f_blocks = fs->fs_dsize; sbp->f_bfree = fs->fs_cstotal.cs_nbfree * fs->fs_frag + fs->fs_cstotal.cs_nffree; - sbp->f_bavail = (fs->fs_dsize * (100 - fs->fs_minfree) / 100) - - (fs->fs_dsize - sbp->f_bfree); + sbp->f_bavail = freespace(fs, fs->fs_minfree); sbp->f_files = fs->fs_ncg * fs->fs_ipg - ROOTINO; sbp->f_ffree = fs->fs_cstotal.cs_nifree; if (sbp != &mp->mnt_stat) {