Skip to main content

btrfs_cli/
balance.rs

1use crate::{Format, Runnable};
2use anyhow::Result;
3use clap::Parser;
4use std::{fs::File, path::PathBuf};
5
6mod cancel;
7mod pause;
8mod resume;
9mod start;
10mod status;
11
12use cancel::BalanceCancelCommand;
13use pause::BalancePauseCommand;
14use resume::BalanceResumeCommand;
15use start::BalanceStartCommand;
16use status::BalanceStatusCommand;
17
18/// Balance data across devices, or change block groups using filters.
19///
20/// Rebalance data and metadata across devices to improve performance or
21/// recover space. Balance is typically a long-running operation. You can
22/// pause, resume, or cancel a balance in progress. Progress and status can
23/// be queried at any time. Requires CAP_SYS_ADMIN.
24#[derive(Parser, Debug)]
25pub struct BalanceCommand {
26    #[clap(subcommand)]
27    pub subcommand: BalanceSubcommand,
28}
29
30impl Runnable for BalanceCommand {
31    fn run(&self, format: Format, dry_run: bool) -> Result<()> {
32        match &self.subcommand {
33            BalanceSubcommand::Start(cmd) => cmd.run(format, dry_run),
34            BalanceSubcommand::Pause(cmd) => cmd.run(format, dry_run),
35            BalanceSubcommand::Cancel(cmd) => cmd.run(format, dry_run),
36            BalanceSubcommand::Resume(cmd) => cmd.run(format, dry_run),
37            BalanceSubcommand::Status(cmd) => cmd.run(format, dry_run),
38        }
39    }
40}
41
42#[derive(Parser, Debug)]
43pub enum BalanceSubcommand {
44    Start(BalanceStartCommand),
45    Pause(BalancePauseCommand),
46    Cancel(BalanceCancelCommand),
47    Resume(BalanceResumeCommand),
48    Status(BalanceStatusCommand),
49}
50
51/// Open a path as a read-only file descriptor, suitable for passing to ioctls.
52fn open_path(path: &PathBuf) -> Result<File> {
53    use anyhow::Context;
54    File::open(path).with_context(|| format!("failed to open '{}'", path.display()))
55}