Skip to main content

btrfs_cli/
rescue.rs

1use crate::{Format, Runnable};
2use anyhow::Result;
3use clap::Parser;
4
5mod chunk_recover;
6mod clear_ino_cache;
7mod clear_space_cache;
8mod clear_uuid_tree;
9mod create_control_device;
10mod fix_data_checksum;
11mod fix_device_size;
12mod super_recover;
13mod zero_log;
14
15use chunk_recover::RescueChunkRecoverCommand;
16use clear_ino_cache::RescueClearInoCacheCommand;
17use clear_space_cache::RescueClearSpaceCacheCommand;
18use clear_uuid_tree::RescueClearUuidTreeCommand;
19use create_control_device::RescueCreateControlDeviceCommand;
20use fix_data_checksum::RescueFixDataChecksumCommand;
21use fix_device_size::RescueFixDeviceSizeCommand;
22use super_recover::RescueSuperRecoverCommand;
23use zero_log::RescueZeroLogCommand;
24
25/// Toolbox for specific rescue operations.
26///
27/// Provide emergency recovery tools for damaged or unrecoverable filesystems.
28/// These operations are potentially dangerous and should only be used when
29/// the filesystem cannot be mounted or accessed through normal means.
30/// Most rescue operations require CAP_SYS_ADMIN and an unmounted filesystem.
31#[derive(Parser, Debug)]
32pub struct RescueCommand {
33    #[clap(subcommand)]
34    pub subcommand: RescueSubcommand,
35}
36
37impl Runnable for RescueCommand {
38    fn run(&self, format: Format, dry_run: bool) -> Result<()> {
39        match &self.subcommand {
40            RescueSubcommand::ChunkRecover(cmd) => cmd.run(format, dry_run),
41            RescueSubcommand::SuperRecover(cmd) => cmd.run(format, dry_run),
42            RescueSubcommand::ZeroLog(cmd) => cmd.run(format, dry_run),
43            RescueSubcommand::FixDeviceSize(cmd) => cmd.run(format, dry_run),
44            RescueSubcommand::FixDataChecksum(cmd) => cmd.run(format, dry_run),
45            RescueSubcommand::CreateControlDevice(cmd) => cmd.run(format, dry_run),
46            RescueSubcommand::ClearInoCache(cmd) => cmd.run(format, dry_run),
47            RescueSubcommand::ClearSpaceCache(cmd) => cmd.run(format, dry_run),
48            RescueSubcommand::ClearUuidTree(cmd) => cmd.run(format, dry_run),
49        }
50    }
51}
52
53#[derive(Parser, Debug)]
54pub enum RescueSubcommand {
55    ChunkRecover(RescueChunkRecoverCommand),
56    SuperRecover(RescueSuperRecoverCommand),
57    ZeroLog(RescueZeroLogCommand),
58    FixDeviceSize(RescueFixDeviceSizeCommand),
59    FixDataChecksum(RescueFixDataChecksumCommand),
60    CreateControlDevice(RescueCreateControlDeviceCommand),
61    ClearInoCache(RescueClearInoCacheCommand),
62    ClearSpaceCache(RescueClearSpaceCacheCommand),
63    ClearUuidTree(RescueClearUuidTreeCommand),
64}