Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

several feature/fixes and release v2.3 #26

Merged
merged 5 commits into from
Apr 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Overview

Btrfs is a great filesystem, but its userland tools are not very user-frienfly yet.
Btrfs is a great filesystem, but its userland tools are not very user-friendly yet.
As a long-time user, I've developed `btrfs-list` as a wrapper to make sense out of the `btrfs sub list` and `btrfs qgroup show` commands.

You need `btrfs-list` if either:
Expand Down Expand Up @@ -28,7 +28,8 @@ If no mountpoints are specified, display info for all btrfs filesystems.

-h, --help display this message
--debug enable debug output
-q, --quiet silence the quota disabled & quota rescan warnings
-q, --quiet silence quota disabled & quota rescan warnings,
repeat to silence all other warnings.
--version display version info
--color WHEN colorize the output; WHEN can be 'never',
'always', or 'auto' (default is:
Expand All @@ -50,6 +51,7 @@ If no mountpoints are specified, display info for all btrfs filesystems.
--snap-max-excl SIZE hide snapshots whose exclusively allocated extents
take up more space than SIZE
-f, --free-space only show free space on the filesystem
-u, --used display used space instead of free space

-p, --profile PROFILE override data profile detection and consider it
as 'dup', 'single', 'raid0', 'raid1',
Expand Down
71 changes: 54 additions & 17 deletions btrfs-list
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ use Getopt::Long qw{ :config gnu_getopt no_ignore_case };
use Data::Dumper;
use Term::ANSIColor;

my $VERSION = "2.2";
my $VERSION = "2.3";

$Data::Dumper::Sortkeys = 1;
$Data::Dumper::Terse = 1;
Expand All @@ -51,7 +51,8 @@ If no mountpoints are specified, display info for all btrfs filesystems.

-h, --help display this message
--debug enable debug output
-q, --quiet silence warnings
-q, --quiet silence quota disabled & quota rescan warnings,
repeat to silence all other warnings.
--version display version info
--color WHEN colorize the output; WHEN can be 'never',
'always', or 'auto' (default is:
Expand All @@ -73,6 +74,7 @@ If no mountpoints are specified, display info for all btrfs filesystems.
--snap-max-excl SIZE hide snapshots whose exclusively allocated extents
take up more space than SIZE
-f, --free-space only show free space on the filesystem
-u, --used display used space instead of free space

-p, --profile PROFILE override data profile detection and consider it
as 'dup', 'single', 'raid0', 'raid1',
Expand Down Expand Up @@ -109,7 +111,7 @@ GetOptions(
'version' => \my $opt_version,
'ignore-version-check' => \my $opt_ignore_version_check,
'ignore-root-check' => \my $opt_ignore_root_check,
'q|quiet' => \my $opt_quiet,
'q|quiet+' => \my $opt_quiet,
's|hide-snap' => \my $opt_hide_snapshots,
'S|snap-only' => \my $opt_only_snapshots,
'f|free-space' => \my $opt_free_space,
Expand Down Expand Up @@ -138,14 +140,24 @@ GetOptions(
'r|raw' => \my $opt_raw,
'btrfs-binary=s' => \my $opt_btrfs_binary,
'd|deleted' => \my $opt_deleted,
'u|used' => \my $opt_used,
) or die "FATAL: Error parsing arguments, aborting\n";

$opt_quiet ||= 0;

sub debug {
return if !$opt_debug;
print STDERR $_ . "\n" for @_;
return;
}

sub warning {
my ($level, @lines) = @_;
return if ($level <= $opt_quiet);
print STDERR "WARNING: $_\n" for @lines;
return;
} ## end sub warning

sub run_cmd {
my %params = @_;
my $cmd = $params{'cmd'};
Expand All @@ -166,13 +178,13 @@ sub run_cmd {
while (<$_stdout>) {
chomp;
debug("stdout: " . $_);
/WARNING:/ and print STDERR $_ . "\n";
/WARNING: (.+)/ and warning(2, "btrfs-progs: $1");
push @stdout, $_;
} ## end while (<$_stdout>)
while (<$_stderr>) {
chomp;
debug("stderr: " . $_);
/WARNING: (?!RAID56 detected, not implemented)/ and print STDERR $_ . "\n";
/WARNING: (RAID56 detected, not implemented)/ and warning(2, "btrfs-progs: $1");
if (!$silent_stderr) {
print join(' ', @$cmd) . ": stderr: " . $_ . "\n";
}
Expand Down Expand Up @@ -452,6 +464,15 @@ if (version->declare($version)->numify lt version->declare("3.18")->numify && !$
exit 1;
} ## end if (version->declare($version...))

if ($version_verbatim eq '6.1' && !$opt_ignore_version_check) {
warning(2,
"the btrfs-progs version you're using, " . "v$version_verbatim, is known to be missing subvolume uuids.");
}
elsif ($version_verbatim eq '5.15' && !$opt_ignore_version_check) {
warning(2,
"the btrfs-progs version you're using, " . "v$version_verbatim, is known to report free fs space incorrectly.");
}

if ($< != 0 && !$opt_ignore_root_check) {
print STDERR "FATAL: you must be root to use this command\n";
print STDERR "If you think this is in error, use --ignore-root-check\n";
Expand Down Expand Up @@ -548,6 +569,11 @@ foreach (@fishow) {
if (not exists $filesystems{$fuuid}) {
$filesystems{$fuuid} = {uuid => $fuuid, label => $label, devices => [], devinfo => {}};
}
# btrfs-progs v5.10.1 bug workaround: "dm-X" instead of "/dev/dm-X"
if ($dev && $dev =~ m{^dm-}) {
debug("Applying workaround $dev => /dev/$dev");
$dev = "/dev/$dev";
}
if (-l $dev) {
$dev = link2real($dev);
}
Expand Down Expand Up @@ -672,7 +698,7 @@ foreach my $fuuid (keys %filesystems) {
$profile = $opt_profile if defined $opt_profile;

if (!$profile) {
print STDERR "WARNING: No profile found, assuming single\n";
warning(2, "No profile found, assuming single");
$profile = "single";
}

Expand Down Expand Up @@ -820,7 +846,7 @@ foreach my $fuuid (keys %filesystems) {

$cmd = run_cmd(silent_stderr => 1, cmd => [qw{ btrfs quota rescan -s }, $mp]);
if ($cmd->{stdout}->[0] && $cmd->{stdout}->[0] =~ /operation running|current key/) {
print STDERR "WARNING: a quota rescan is running, size information is not correct yet\n" if not $opt_quiet;
warning(1, "a quota rescan is running, size information is not correct yet");
}

$cmd = run_cmd(silent_stderr => 1, cmd => [qw{ btrfs qgroup show -pcre --raw }, $mp]);
Expand All @@ -829,8 +855,7 @@ foreach my $fuuid (keys %filesystems) {
# btrfs-progs v3.18 doesn't support --raw
$cmd = run_cmd(silent_stderr => 1, cmd => [qw{ btrfs qgroup show -pcre }, $mp]);
if ($cmd->{status} || !@{$cmd->{stdout}}) {
print STDERR "WARNING: to get refer/excl size information, please enable qgroups (btrfs quota enable $mp)\n"
if not $opt_quiet;
warning(1, "to get refer/excl size information, please enable qgroups (btrfs quota enable $mp)");
$vol{$fuuid}{df}{noquota} = 1;
}
} ## end if ($cmd->{status} || ...)
Expand Down Expand Up @@ -991,7 +1016,7 @@ foreach my $fuuid (sort keys %filesystems) {
# do we still have unseen volumes? (we shouldn't)
foreach my $vuuid (keys %{$vol{$fuuid}}) {
next if $seen{$vuuid};
print STDERR "WARN: we shouldn't have orphaned volumne $vuuid\n";
warning(2, "we shouldn't have orphaned volumne $vuuid");
push @ordered, $vuuid;
}

Expand Down Expand Up @@ -1102,13 +1127,25 @@ foreach my $line (@orderedAll) {
if (exists $line->{free}) {
my $displayProfile = $line->{profile};
$displayProfile .= "/" . $line->{mprofile} if ($line->{profile} ne $line->{mprofile});
$extra = sprintf(
"(%s, %s/%s free, %.02f%%",
$displayProfile,
pretty_print_str($line->{free}, 2),
pretty_print_str($line->{fssize}, 2),
$line->{free} * 100 / $line->{fssize}
);
if (!$opt_used) {
$extra = sprintf(
"(%s, %s/%s free, %.02f%%",
$displayProfile,
pretty_print_str($line->{free}, 2),
pretty_print_str($line->{fssize}, 2),
$line->{free} * 100 / $line->{fssize}
);
} ## end if (!$opt_used)
else {
my $used = $line->{fssize} - $line->{free};
$extra = sprintf(
"(%s, %s/%s used, %.02f%%",
$displayProfile,
pretty_print_str($used, 2),
pretty_print_str($line->{fssize}, 2),
$used * 100 / $line->{fssize}
);
} ## end else [ if (!$opt_used) ]
if ($line->{unallocatable} && $line->{unallocatable} > MiB) {
$extra .= sprintf(', %s unallocatable', pretty_print_str($line->{unallocatable}, 2));
}
Expand Down