coreutils icon indicating copy to clipboard operation
coreutils copied to clipboard

`df` crashes in Windows WSL consistently

Open hbina opened this issue 3 years ago • 3 comments
trafficstars

hbina@DESKTOP-56FNR1F:~/git/uutils$ RUST_BACKTRACE=full cargo run --quiet -- df
thread 'main' panicked at 'attempt to subtract with overflow', src/uu/df/src/table.rs:156:21
stack backtrace:
   0:     0x55f2a7c8c0fd - std::backtrace_rs::backtrace::libunwind::trace::h22893a5306c091b4
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/../../backtrace/src/backtrace/libunwind.rs:93:5
   1:     0x55f2a7c8c0fd - std::backtrace_rs::backtrace::trace_unsynchronized::h29c3bc6f9e91819d
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
   2:     0x55f2a7c8c0fd - std::sys_common::backtrace::_print_fmt::he497d8a0ec903793
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/sys_common/backtrace.rs:66:5
   3:     0x55f2a7c8c0fd - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h9c2a9d2774d81873
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/sys_common/backtrace.rs:45:22
   4:     0x55f2a7cb491c - core::fmt::write::hba4337c43d992f49
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/core/src/fmt/mod.rs:1194:17
   5:     0x55f2a7c86e91 - std::io::Write::write_fmt::heb73de6e02cfabed
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/io/mod.rs:1655:15
   6:     0x55f2a7c8dec5 - std::sys_common::backtrace::_print::h63c8b24acdd8e8ce
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/sys_common/backtrace.rs:48:5
   7:     0x55f2a7c8dec5 - std::sys_common::backtrace::print::h426700d6240cdcc2
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/sys_common/backtrace.rs:35:9
   8:     0x55f2a7c8dec5 - std::panicking::default_hook::{{closure}}::hc9a76eed0b18f82b
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/panicking.rs:295:22
   9:     0x55f2a7c8db79 - std::panicking::default_hook::h2e88d02087fae196
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/panicking.rs:314:9
  10:     0x55f2a7997f53 - <alloc::boxed::Box<F,A> as core::ops::function::Fn<Args>>::call::h284c4db1ca42860e
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/alloc/src/boxed.rs:1875:9
  11:     0x55f2a79660b5 - uucore::mods::panic::mute_sigpipe_panic::{{closure}}::h4b4a40b2e4bea746
                               at /home/hbina/git/uutils/src/uucore/src/lib/mods/panic.rs:39:13
  12:     0x55f2a7c8e4c0 - std::panicking::rust_panic_with_hook::habfdcc2e90f9fd4c
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/panicking.rs:702:17
  13:     0x55f2a7c8e2b9 - std::panicking::begin_panic_handler::{{closure}}::he054b2a83a51d2cd
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/panicking.rs:586:13
  14:     0x55f2a7c8c5b4 - std::sys_common::backtrace::__rust_end_short_backtrace::ha48b94ab49b30915
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/sys_common/backtrace.rs:138:18
  15:     0x55f2a7c8e029 - rust_begin_unwind
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/panicking.rs:584:5
  16:     0x55f2a6e56d83 - core::panicking::panic_fmt::h366d3a309ae17c94
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/core/src/panicking.rs:143:14
  17:     0x55f2a6e56c4d - core::panicking::panic::h8705e81f284be8a5
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/core/src/panicking.rs:48:5
  18:     0x55f2a71a382f - <uu_df::table::Row as core::convert::From<uu_df::filesystem::Filesystem>>::from::hba5535f8aa5c754f
                               at /home/hbina/git/uutils/src/uu/df/src/table.rs:156:21
  19:     0x55f2a71a4d7f - uu_df::table::Table::new::h1875a8226349fe89
                               at /home/hbina/git/uutils/src/uu/df/src/table.rs:391:27
  20:     0x55f2a6eade35 - uu_df::uumain::uumain::hf36ef62df003998e
                               at /home/hbina/git/uutils/src/uu/df/src/df.rs:468:20
  21:     0x55f2a6ead547 - uu_df::uumain::hc92cfb6ed7480c29
                               at /home/hbina/git/uutils/src/uu/df/src/df.rs:430:1
  22:     0x55f2a6ea21a6 - coreutils::main::h130f48f5c8618649
                               at /home/hbina/git/uutils/src/bin/coreutils.rs:95:31
  23:     0x55f2a6f0f44b - core::ops::function::FnOnce::call_once::h890a26570f8a80d0
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/core/src/ops/function.rs:227:5
  24:     0x55f2a6f2ff6e - std::sys_common::backtrace::__rust_begin_short_backtrace::h18a228eb6b050702
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/sys_common/backtrace.rs:122:18
  25:     0x55f2a6ee2ff1 - std::rt::lang_start::{{closure}}::h01d390e9e6df3820
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/rt.rs:145:18
  26:     0x55f2a7c7e28e - core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once::had4f69b3aefb47a8
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/core/src/ops/function.rs:259:13
  27:     0x55f2a7c7e28e - std::panicking::try::do_call::hf2ad5355fcafe775
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/panicking.rs:492:40
  28:     0x55f2a7c7e28e - std::panicking::try::h0a63ac363423e61e
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/panicking.rs:456:19
  29:     0x55f2a7c7e28e - std::panic::catch_unwind::h18088edcecb8693a
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/panic.rs:137:14
  30:     0x55f2a7c7e28e - std::rt::lang_start_internal::{{closure}}::ha7dad166dc711761
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/rt.rs:128:48
  31:     0x55f2a7c7e28e - std::panicking::try::do_call::hda0c61bf3a57d6e6
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/panicking.rs:492:40
  32:     0x55f2a7c7e28e - std::panicking::try::hbc940e68560040a9
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/panicking.rs:456:19
  33:     0x55f2a7c7e28e - std::panic::catch_unwind::haed0df2aeb3fa368
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/panic.rs:137:14
  34:     0x55f2a7c7e28e - std::rt::lang_start_internal::h9c06694362b5b80c
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/rt.rs:128:20
  35:     0x55f2a6ee2fc0 - std::rt::lang_start::h8a483d04afe9c18b
                               at /rustc/fe5b13d681f25ee6474be29d748c65adcd91f69e/library/std/src/rt.rs:144:17
  36:     0x55f2a6ea287c - main
  37:     0x7f79818e1083 - __libc_start_main
  38:     0x55f2a6e5707e - _start
  39:                0x0 - <unknown>

I've added some logs and as you can see, some files reports to have ffree with the value 1000000 which causes the subtraction to overflow. I am assuming its just WSL trickery?

/
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 65793553,
    bfree: 62640709,
    bavail: 59281170,
    bavail_top_bit_set: false,
    files: 16777216,
    ffree: 16599203,
}
/mnt/wsl
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 3224430,
    bfree: 3224430,
    bavail: 3224430,
    bavail_top_bit_set: false,
    files: 3224430,
    ffree: 3224416,
}
/init
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 122951562,
    bfree: 17172736,
    bavail: 17172736,
    bavail_top_bit_set: false,
    files: 999,
    ffree: 1000000,
}
/dev
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 3223909,
    bfree: 3223909,
    bavail: 3223909,
    bavail_top_bit_set: false,
    files: 3223909,
    ffree: 3223762,
}
/run
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 3224430,
    bfree: 3224425,
    bavail: 3224425,
    bavail_top_bit_set: false,
    files: 3224430,
    ffree: 3224392,
}
/run/lock
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 3224430,
    bfree: 3224430,
    bavail: 3224430,
    bavail_top_bit_set: false,
    files: 3224430,
    ffree: 3224427,
}
/run/shm
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 3224430,
    bfree: 3224430,
    bavail: 3224430,
    bavail_top_bit_set: false,
    files: 3224430,
    ffree: 3224429,
}
/run/user
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 3224430,
    bfree: 3224430,
    bavail: 3224430,
    bavail_top_bit_set: false,
    files: 3224430,
    ffree: 3224429,
}
/proc/sys/fs/binfmt_misc
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 0,
    bfree: 0,
    bavail: 0,
    bavail_top_bit_set: false,
    files: 0,
    ffree: 0,
}
/sys/fs/cgroup
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 3224430,
    bfree: 3224430,
    bavail: 3224430,
    bavail_top_bit_set: false,
    files: 3224430,
    ffree: 3224415,
}
/usr/lib/wsl/drivers
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 122951562,
    bfree: 17172736,
    bavail: 17172736,
    bavail_top_bit_set: false,
    files: 999,
    ffree: 1000000,
}
/usr/lib/wsl/lib
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 122951562,
    bfree: 17172736,
    bavail: 17172736,
    bavail_top_bit_set: false,
    files: 999,
    ffree: 1000000,
}
/sys/fs/cgroup/unified
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 0,
    bfree: 0,
    bavail: 0,
    bavail_top_bit_set: false,
    files: 0,
    ffree: 0,
}
/sys/fs/cgroup/cpuset
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 0,
    bfree: 0,
    bavail: 0,
    bavail_top_bit_set: false,
    files: 0,
    ffree: 0,
}
/sys/fs/cgroup/cpu
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 0,
    bfree: 0,
    bavail: 0,
    bavail_top_bit_set: false,
    files: 0,
    ffree: 0,
}
/sys/fs/cgroup/cpuacct
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 0,
    bfree: 0,
    bavail: 0,
    bavail_top_bit_set: false,
    files: 0,
    ffree: 0,
}
/sys/fs/cgroup/blkio
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 0,
    bfree: 0,
    bavail: 0,
    bavail_top_bit_set: false,
    files: 0,
    ffree: 0,
}
/sys/fs/cgroup/memory
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 0,
    bfree: 0,
    bavail: 0,
    bavail_top_bit_set: false,
    files: 0,
    ffree: 0,
}
/sys/fs/cgroup/devices
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 0,
    bfree: 0,
    bavail: 0,
    bavail_top_bit_set: false,
    files: 0,
    ffree: 0,
}
/sys/fs/cgroup/freezer
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 0,
    bfree: 0,
    bavail: 0,
    bavail_top_bit_set: false,
    files: 0,
    ffree: 0,
}
/sys/fs/cgroup/net_cls
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 0,
    bfree: 0,
    bavail: 0,
    bavail_top_bit_set: false,
    files: 0,
    ffree: 0,
}
/sys/fs/cgroup/perf_event
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 0,
    bfree: 0,
    bavail: 0,
    bavail_top_bit_set: false,
    files: 0,
    ffree: 0,
}
/sys/fs/cgroup/net_prio
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 0,
    bfree: 0,
    bavail: 0,
    bavail_top_bit_set: false,
    files: 0,
    ffree: 0,
}
/sys/fs/cgroup/hugetlb
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 0,
    bfree: 0,
    bavail: 0,
    bavail_top_bit_set: false,
    files: 0,
    ffree: 0,
}
/sys/fs/cgroup/pids
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 0,
    bfree: 0,
    bavail: 0,
    bavail_top_bit_set: false,
    files: 0,
    ffree: 0,
}
/sys/fs/cgroup/rdma
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 0,
    bfree: 0,
    bavail: 0,
    bavail_top_bit_set: false,
    files: 0,
    ffree: 0,
}
/mnt/c
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 122951562,
    bfree: 17172736,
    bavail: 17172736,
    bavail_top_bit_set: false,
    files: 999,
    ffree: 1000000,
}
/mnt/wsl/docker-desktop-data/isocache
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 65793553,
    bfree: 62428099,
    bavail: 59068560,
    bavail_top_bit_set: false,
    files: 16777216,
    ffree: 16692174,
}
/mnt/wsl/docker-desktop/shared-sockets/guest-services
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 3224430,
    bfree: 3224426,
    bavail: 3224426,
    bavail_top_bit_set: false,
    files: 3224430,
    ffree: 3224386,
}
/mnt/wsl/docker-desktop/shared-sockets/host-services
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 3224430,
    bfree: 3224426,
    bavail: 3224426,
    bavail_top_bit_set: false,
    files: 3224430,
    ffree: 3224386,
}
/mnt/wsl/docker-desktop/docker-desktop-user-distro
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 4096,
    blocks: 65793553,
    bfree: 65762777,
    bavail: 62403238,
    bavail_top_bit_set: false,
    files: 16777216,
    ffree: 16774170,
}
/mnt/wsl/docker-desktop/cli-tools
[src/uucore/src/lib/features/fsext.rs:509] Self {
    blocksize: statvfs.f_bsize as u64,
    blocks: statvfs.f_blocks as u64,
    bfree: statvfs.f_bfree as u64,
    bavail: statvfs.f_bavail as u64,
    bavail_top_bit_set: ((statvfs.f_bavail as u64) & (1u64.rotate_right(1)))
        != 0,
    files: statvfs.f_files as u64,
    ffree: statvfs.f_ffree as u64,
} = FsUsage {
    blocksize: 2048,
    blocks: 179814,
    bfree: 0,
    bavail: 0,
    bavail_top_bit_set: false,
    files: 0,
    ffree: 0,
}

hbina avatar Jun 15 '22 15:06 hbina

@hbina are you going to try to fix this? thanks

sylvestre avatar Jun 15 '22 15:06 sylvestre

Well, first I have not familiar with df nor WSL nor statvfs, but it sounds interesting so I'll take a look at it. Would appreciate any pointers though!

Edit: I have created a discussion thread here in WSL to get more info https://github.com/microsoft/WSL/discussions/8514

hbina avatar Jun 15 '22 15:06 hbina

Following the stack trace, this is the line of code that causes a problem: https://github.com/uutils/coreutils/blob/38b6ce56ae3d3525e68c580bc31b862d8e3a5dfb/src/uu/df/src/table.rs#L156

Just to stop this from crashing, perhaps it would be enough to just do

let fused = files.checked_sub(ffree).unwrap_or(0);

jfinkels avatar Aug 22 '22 03:08 jfinkels

I myself have a bit of interest in this issue actually. If you run with GNU df -i, you will find four particular filesystems that actually report negative used inodes, including /mnt/c.

Those four or so filesystems are mounted as 9p filesystems. Windows actually runs a 9p server which WSL instances connect to to access the host filesystem.

To retrieve statfs as per 9P.2000L protocol, it has to send a TSTATFS from client (WSL) to server (running in windows). It seems the Windows guys likely implemented their 9p server in such a way that the reported ffree and files are just stubbed out with some bogus values.

Anyhow, it seems that it’s just a matter of changing the datatypes from u64 to i64 to handle negative values. I could take a look at this maybe.

Skryptonyte avatar Jul 12 '23 19:07 Skryptonyte