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