From bf69c63e09d862eff6fdfd2bd023e3b17b1a172e Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Fri, 1 Apr 2022 08:25:30 +0200 Subject: [PATCH] df: Fix calculation of Use% in "total" row Change formula from: "Used/Size * 100" to "Used/(Used + Avail) * 100". This formula also works if "Used" and "Avail" do not add up to "Size", which is the case if there are reserved disk blocks. --- src/uu/df/src/table.rs | 10 +++++++--- tests/by-util/test_df.rs | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/uu/df/src/table.rs b/src/uu/df/src/table.rs index 39c762711..0f4daa0e1 100644 --- a/src/uu/df/src/table.rs +++ b/src/uu/df/src/table.rs @@ -102,6 +102,7 @@ impl AddAssign for Row { fn add_assign(&mut self, rhs: Self) { let bytes = self.bytes + rhs.bytes; let bytes_used = self.bytes_used + rhs.bytes_used; + let bytes_avail = self.bytes_avail + rhs.bytes_avail; let inodes = self.inodes + rhs.inodes; let inodes_used = self.inodes_used + rhs.inodes_used; *self = Self { @@ -111,11 +112,14 @@ impl AddAssign for Row { fs_mount: "-".into(), bytes, bytes_used, - bytes_avail: self.bytes_avail + rhs.bytes_avail, + bytes_avail, bytes_usage: if bytes == 0 { None } else { - Some(bytes_used as f64 / bytes as f64) + // We use "(bytes_used + bytes_avail)" instead of "bytes" because on some filesystems (e.g. + // ext4) "bytes" also includes reserved blocks we ignore for the usage calculation. + // https://www.gnu.org/software/coreutils/faq/coreutils-faq.html#df-Size-and-Used-and-Available-do-not-add-up + Some(bytes_used as f64 / (bytes_used + bytes_avail) as f64) }, // TODO Figure out how to compute this. #[cfg(target_os = "macos")] @@ -164,7 +168,7 @@ impl From for Row { // We use "(bused + bavail)" instead of "blocks" because on some filesystems (e.g. // ext4) "blocks" also includes reserved blocks we ignore for the usage calculation. // https://www.gnu.org/software/coreutils/faq/coreutils-faq.html#df-Size-and-Used-and-Available-do-not-add-up - Some((bused as f64) / (bused + bavail) as f64) + Some(bused as f64 / (bused + bavail) as f64) }, #[cfg(target_os = "macos")] bytes_capacity: if bavail == 0 { diff --git a/tests/by-util/test_df.rs b/tests/by-util/test_df.rs index 2c3382ee3..b0ee8a2b3 100644 --- a/tests/by-util/test_df.rs +++ b/tests/by-util/test_df.rs @@ -140,7 +140,7 @@ fn test_total() { #[test] fn test_use_percentage() { let output = new_ucmd!() - .args(&["--output=used,avail,pcent"]) + .args(&["--total", "--output=used,avail,pcent"]) .succeeds() .stdout_move_str();